Liquid dialect
The Port60 dialect is a strict, whitelisted subset of Liquid, identified as port60-liquid@1 (the value your manifest’s format field must carry). Anything not listed on this page is rejected, at publish time by the conformance validator and at render time by the engine, with the same shared enforcement code.
Output escaping
Section titled “Output escaping”Every {{ output }} is HTML-escaped by default. The single opt-out is the raw filter, and the only values you should ever pass through it are the contract’s richtext fields (e.g. section.bodyHtml); they are sanitised server-side before a template ever sees them.
<h1>{{ section.title }}</h1> {%- comment -%} escaped, safe for any text {%- endcomment -%}{{ section.bodyHtml | raw }} {%- comment -%} sanitised richtext only {%- endcomment -%}Unknown filters are a hard error (strictFilters), not a silent pass-through.
| Tag | Purpose |
|---|---|
if / elsif / else / endif |
Conditionals |
unless / endunless |
Negated conditional |
case / when / endcase |
Switch |
for / endfor / break / continue |
Iteration |
assign |
Set a variable |
capture / endcapture |
Capture rendered output into a variable |
comment / endcomment |
Comments |
echo |
Output inside {% liquid %} blocks |
raw / endraw |
Verbatim (non-rendered) output |
liquid |
Multi-statement block |
Custom tags
Section titled “Custom tags”{% island %}
Section titled “{% island %}”Places a platform functional island (a live, hydrated component) at this position. Templates place islands, never implement them, the island’s markup, behaviour and data are platform-owned and upgraded platform-side. The island name must be declared in the manifest’s supports.islands.
{% island 'donation_widget' %}{% content %}
Section titled “{% content %}”LAYOUT ONLY: the slot where the page’s rendered sections are injected. A layout must contain exactly one. Section renderers must not use it.
{% content %}Filters
Section titled “Filters”All 49 allowed filters:
abs · append · at_least · at_most · capitalize · ceil · compact · concat · date · default · divided_by · downcase · escape · escape_once · first · floor · join · last · lstrip · map · minus · modulo · newline_to_br · plus · prepend · raw · remove · remove_first · replace · replace_first · reverse · round · rstrip · size · slice · sort · sort_natural · split · strip · strip_html · strip_newlines · times · truncate · truncatewords · uniq · upcase · url_decode · url_encode · where
Excluded, and why
Section titled “Excluded, and why”These standard Liquid tags are not part of the dialect and fail at parse time:
{% include %}{% render %}{% layout %}{% tablerow %}{% cycle %}{% increment %}{% decrement %}
File inclusion (no file system exists inside an artifact yet, a snippets mechanism arrives with the Layout slot), table markup generation, and stateful counters are outside the v1 dialect.

