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>
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.