Render modes.
Every site renders in one of two modes. It is a single field on the site, and it decides a handful of behaviours you will meet all through this reference. New sites use standard; older sites stay on compat until they are deliberately reworked.
FleekSite renders every page with one Liquid engine. That engine can behave in two ways:
- Standard is standard, Shopify-compatible Liquid, as close to the reference as the platform gets. Filters behave the way every Liquid guide says, a mistyped tag shows up instead of vanishing, and native
{% include %}and{% render %}compose your own templates. - Compat reproduces the older engine the platform migrated from, byte for byte. Sites that were built and tuned against that engine keep rendering exactly as before, quirks and all.
If you are building something new, you are on standard. Sites created through sign-up are set to standard from the first render. The rest of this page is mostly a reference for what changes when you meet a compat site, and why.
The flag
The mode is the render_mode field on the site record: the string compat or standard. Anything that is not exactly standard, an empty value, a missing field, an unknown word, resolves to compat, so a site can never render in an undefined state.
| Value | Applies to | Behaviour |
|---|---|---|
standard | New sites, by default | Standard Liquid. The recommended mode for anything built today. |
compat | Sites that predate the change | The migration baseline. Output does not move. |
There is no template-facing switch for this. A site is moved to standard by a staff or rework flow, once its templates have been checked against standard behaviour. Reading the mode from a template is not something you normally need to do; the mode changes how your Liquid runs, not what your Liquid can see.
What standard changes
Standard mode fixes each of the following. Compat keeps the older behaviour on purpose.
| Area | Compat | Standard |
|---|---|---|
truncate | Off-by-a-few boundary; truncates a string that already fits | The LiquidJS built-in |
truncatewords | Splits on single spaces; ellipsis hardcoded | The LiquidJS built-in |
upcase | Coerces any input through String() | The LiquidJS built-in |
Unknown {% tag %} | Silently stripped from the output | Surfaced: left in place and logged, so you see it |
{% bit name %} | Renders nothing | Renders the bit value |
{% include %} / {% render %} | Render nothing (deny-all filesystem) | Resolve against your site templates |
{% layout %} | Renders nothing | Reserved Coming (see below) |
| og:image on a cover-less post | Emits an invalid URL | Falls back to the site logo |
| twitter:description on a post | Uses the site about text | Uses the post teaser |
| Post meta title / description | Ignored | Honoured |
| Organisation JSON-LD phone | A hardcoded number | The site mobile number |
| Article JSON-LD | Swapped dates, wrong keys, null author | Correct dates, keys and author |
| PWA manifest link | Emitted twice | Emitted once |
Unknown tags and typos
This is the difference you will feel most while writing. In compat, a tag the engine does not recognise is deleted from the output before the page renders. A typo like {% collektion posts %} produces nothing, with no clue why. In standard, the same typo is left in place in the output and written to the logs, so the empty space on the page points straight at the mistake.
Either way the page still renders. A single broken tag never takes down the whole page in either mode; the rest of the template around it renders normally.
Includes and the filesystem
Standard mode wires the native {% include %} and {% render %} tags to your site's own templates: the name resolves to the template with that title. Compat leaves those tags inert, so older sites compose pages with the {% partial %} tag instead. {% partial %} works in both modes. See Partials and includes for the full picture, including the cycle budget and why {% render %} is isolated.
One security rule holds in both modes: neither engine can read the server disk. {% include '.env' %} looks for a template named .env on your site, finds none, and renders empty. It never touches a real file.
What is the same in both modes
A few behaviours are not tied to the mode, because they are correct or safe regardless:
- UTC dates. Datetimes format as UTC wall-clock time, so a date does not shift by the server's zone.
- The deny-all disk. The filesystem security above.
- Object output as JSON. Printing an object, like
{{ site }}, emits JSON rather than[object Object]. - The
||and&&shim. JavaScript-style operators in an expression are rewritten to Liquid ones before parsing, and string literals are left alone.
The Liquid overview covers these engine behaviours in detail.
A note on the layout tag
The standard {% layout %} tag and its content_for_layout slot are Coming, not shipped. Today, in standard mode, the tag resolves against your templates but drops the wrapped body, so do not build on it yet. Compose your page chrome with partials or type-based layouts for now. The layout tag reference describes the planned model.