Liquid overview.
FleekSite renders every template with Liquid: standard Liquid run through LiquidJS 10, plus a layer of FleekSite tags, filters and objects. This page is the map of that layer, and of the engine behaviours you will not find in a general Liquid guide.
If you have written Liquid before, the fundamentals are unchanged. Output with {{ ... }}, logic with {% ... %}, filters with the pipe. What follows is what is standard, what FleekSite adds, and the handful of ways the engine behaves that are worth knowing before you debug something.
Standard Liquid
The full standard tag and filter set is available. Tags: assign, if / elsif / else, unless, case / when, for (with break, continue, limit, offset, reversed), capture, comment, raw, cycle, increment, decrement, tablerow, echo and liquid. Operators: and / or, the comparisons, contains, and .. ranges. The standard filters are listed on the Filters page.
Three composition tags are special. {% include %}, {% render %} and {% layout %} depend on the render mode: inert in compat, and in standard they resolve against your own site templates. The Partials and includes page covers this in full.
What FleekSite adds
On top of standard Liquid, FleekSite registers seven tags and a set of filters. The tags:
| Tag | Purpose |
|---|---|
{% collection %} | Query the site database. The main data-access tag. |
{% partial %} | Include another template by title, in the current context. |
{% meta_resource %} | Render a fragment for injection into the page head. |
{% prefetch %} | Run a template-defined HTTP request and expose the response. |
{% fetch %} | Make an inline HTTP request. |
{% minusone %} | Emit a value minus one (a legacy paging idiom). |
{% bit %} | Emit a named site bit value. Standard only. |
Each is documented on the Tags page. The FleekSite filters, for prices, dates, strings, arrays, images and currency, are on the Filters page. Every FleekSite tag registers under both snake_case and PascalCase, so {% collection %} and {% Collection %} are the same tag.
Engine behaviours
These apply in both render modes unless noted, and they explain most surprises.
Tolerant rendering
The engine is forgiving by design. An undefined variable renders as an empty string, an unknown filter passes its input through untouched, and an invalid condition degrades to false. A single broken tag never takes down the whole page: the rest of the template renders around it. What an unknown {% tag %} does differs by mode, silently dropped in Compat, left in place and logged in Standard. See Render modes.
Objects print as JSON
Printing an object or array outputs JSON, not [object Object]. This makes it easy to inspect data or emit a JSON payload straight from a template.
{{ site }}
{% comment %} => {"id":163,"name":"...","currency":"USD", ...} {% endcomment %}
>JavaScript operators are rewritten
The engine accepts JavaScript-style || and && in expressions and rewrites them before parsing: || becomes a chained default: in output, and || / && become or / and in conditions. String literals are left untouched, so text containing those characters is safe. Both of the following are valid:
{{ page.title || site.name }}
{% if user.name && user.email %}Hello, {{ user.name }}{% endif %}They are equivalent to {{ page.title | default: site.name }} and {% if user.name and user.email %}. Writing the Liquid form directly is clearer, but the shorthand will not break.
Dates are UTC
Datetimes format as UTC wall-clock time, so a date does not shift by the server's zone. This holds in both modes.
The filesystem is closed
Templates cannot read the server disk. The composition tags resolve names against your own site templates (in standard mode) or render nothing (in compat), never a file. {% include '.env' %} looks for a template titled .env, finds none, and renders empty. This is a security control and is not affected by the render mode.
The no-render marker
A template body that begins with the marker <%= no_render %> is emitted with the marker stripped and the automatic head-meta injection suppressed. It is how a template takes full control of its own output, for example a template that returns JSON or a custom document. See SEO and meta.
A few standard filters (truncate, truncatewords, upcase) behave differently in compat mode. Everything on this page is the same in both modes except where a Standard or Compat tag says otherwise.