CartistoDocs

Liquid filters

The custom filters Cartisto adds on top of standard Liquid.

Cartisto runs standard LiquidJS (so all the usual filters — default, date, append, upcase, where, map, …— work) plus the storefront filters below.

URLs & assets

lang_path

Prefix a path with the current language.

<a href="{{ '/products' | lang_path }}">Shop</a>   {# → /en/products #}

asset_url

Resolve a file against this theme’s asset base.

<link rel="stylesheet" href="{{ 'css/theme.css' | asset_url }}" />

image_url

Produce a resized image URL through the platform image CDN. Works only on platform-hosted images; anything else passes through unchanged.

<img src="{{ product.image | image_url: width: 800 }}" />
<img src="{{ product.image | image_url: width: 400, height: 400, format: 'webp', quality: 78 }}" />

Widths snap to a fixed ladder and quality to preset steps, so a handful of variants are generated and cached rather than an infinite matrix.

img_fallback

Substitute a placeholder when an image is empty.

<img src="{{ product.image | img_fallback: 'product' }}" />   {# or 'category' #}

Money

Prices reach your template already converted to the display currency. Format them — never compute them.

money

Numeric, two decimals, no symbol (you add the symbol/markup).

${{ product.price | money }}          {# → $19.90 #}

money_format

Localized currency string (symbol + locale grouping), currency from the argument or the page context.

{{ product.price | money_format }}            {# context currency #}
{{ product.price | money_format: 'EGP' }}

money_with_currency

Like money_format but appends the ISO code.

{{ product.price | money_with_currency }}     {# → $19.90 USD #}

Translation

t

Resolve a dotted key with {name} interpolation and CLDR pluralization (Arabic’s six plural forms included).

{{ 'cart.title' | t }}
{{ 'products.count' | t: count: total }}
{{ 'cart.hello' | t: name: customer.firstName }}

A missing key renders the key itself (loud, so you notice). Reading translations as an object ({{ t.cart.title }}) also works for simple, non-plural strings.

Text & dates

format_date

Locale-aware date formatting keyed to the current storefront language (LiquidJS’s built-in date filter uses strftime tokens and no locale). Pass a named style — short, medium (default), long, or full.

{{ post.publishedAt | format_date }}          {# 15 Aug 2026 (en) / ٤ محرم (ar) #}
{{ order.createdAt | format_date: 'long' }}

handleize / handle

Slugify a string: lowercase, punctuation and spaces collapse to single hyphens. Unicode letters are kept, so an Arabic title yields an Arabic handle.

<section id="{{ block.settings.heading | handleize }}">…</section>

pluralize

Pick a singular/plural word by a count (the quick inline helper; prefer the t filter for translated strings with real CLDR plurals).

{{ items.size }} {{ items.size | pluralize: 'item', 'items' }}

Language switcher

lang_label / lang_flag

Human label and flag for a language code.

{% for lang in availableLanguages %}
  <a href="…">{{ lang | lang_flag }} {{ lang | lang_label }}</a>
{% endfor %}

JSON for scripts

json_script

Serialize a value safely for embedding in a <script> (escapes </script). Must be piped through raw since it’s already script-safe.

<script>window.__MY_DATA__ = {{ myObject | json_script | raw }};</script>
Warning

The sandbox Templates run sandboxed: no host access, prototype-chain access is blocked, and there are parse/render/memory limits so a pathological template can’t hang a worker. You can’t reach process, the database, or another tenant’s data — by construction.