Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
benjaminsehl avatar

Shopify Liquid Themes

  • 3k installs
  • 115 repo stars
  • Updated July 16, 2026
  • benjaminsehl/liquid-skills

shopify-liquid-themes is an agent skill for generating Shopify Liquid theme sections, blocks, snippets, schema JSON, translations, and CSS/JS patterns.

About

shopify-liquid-themes is an agent skill for generating correct Shopify Liquid theme code across sections, blocks, snippets, layout, templates, config, locales, and assets. It explains when to use sections versus blocks versus snippets, Liquid delimiter and operator rules including no parentheses in conditions and fifty-iteration for loop limits, and critical gotchas such as deprecated include, no Liquid inside stylesheet or javascript tags, and snippet render parameter scoping. The schema section documents section and block JSON structures, thirty-three setting types with visible_if patterns, and translation key conventions requiring the t filter for every user-facing string. CSS guidance covers per-component stylesheet and javascript tags, Liquid-aware style tags for dynamic editor colors, and CSS variable patterns for settings. LiquidDoc headers with param types are required for snippets and statically rendered blocks. Reference maps link to filter, tag, object, schema, and complete example files. Developers reach for it when creating or editing dot liquid files, working with schema doc stylesheet javascript tags, or implementing Shopify theme architecture with correct locale fi.

  • Maps theme architecture across sections, blocks, snippets, layout, templates, config, locales, and assets.
  • Documents schema JSON for sections and blocks with thirty-three setting types and visible_if patterns.
  • Requires translation t filter for user-facing strings and hierarchical snake_case locale keys.
  • Covers Liquid syntax gotchas: no ternary, fifty for max iterations, render not include.
  • LiquidDoc headers required for snippets with param types string, number, boolean, image, object, array.

Shopify Liquid Themes by the numbers

  • 2,957 all-time installs (skills.sh)
  • +74 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #184 of 2,245 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

shopify-liquid-themes capabilities & compatibility

Capabilities
liquid syntax and filter reference routing · section and block schema generation · translation and locale key conventions · liquiddoc snippet documentation · css and js theme component patterns
Use cases
frontend · ui design
npx skills add https://github.com/benjaminsehl/liquid-skills --skill shopify-liquid-themes

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs3k
repo stars115
Security audit3 / 3 scanners passed
Last updatedJuly 16, 2026
Repositorybenjaminsehl/liquid-skills

How do I write correct Shopify Liquid theme files with valid schema, translations, LiquidDoc, and component CSS/JS conventions?

Generate Shopify Liquid theme sections, blocks, snippets, schema JSON, LiquidDoc headers, translation keys, and CSS/JS patterns.

Who is it for?

Developers creating or editing Shopify theme dot liquid files who need schema, snippet, and localization conventions.

Skip if: Skip when the task is Shopify app backend APIs, checkout extensions, or non-theme Liquid contexts.

When should I use this skill?

User creates or edits Shopify Liquid sections, blocks, snippets, schema, doc tags, or theme translation keys.

What you get

Valid Liquid theme code with schema JSON, t-filter translations, LiquidDoc headers, and stylesheet or javascript tag patterns.

  • .liquid section/block/snippet files
  • schema JSON blocks
  • translation key stubs

By the numbers

  • Covers 4 theme directories: sections/, blocks/, snippets/, layout/

Files

SKILL.mdMarkdownGitHub ↗

Shopify Liquid Themes

Theme Architecture

.
├── sections/    # Full-width page modules with {% schema %} — hero, product grid, testimonials
├── blocks/      # Nestable components with {% schema %} — slides, feature items, text blocks
├── snippets/    # Reusable fragments via {% render %} — buttons, icons, image helpers
├── layout/      # Page wrappers (must include {{ content_for_header }} and {{ content_for_layout }})
├── templates/   # JSON files defining which sections appear on each page type
├── config/      # Global theme settings (settings_schema.json, settings_data.json)
├── locales/     # Translation files (en.default.json, fr.json, etc.)
└── assets/      # Static CSS, JS, images (prefer {% stylesheet %}/{% javascript %} instead)

When to use what

NeedUseWhy
Full-width customizable moduleSectionHas {% schema %}, appears in editor, renders blocks
Small nestable component with editor settingsBlockHas {% schema %}, can nest inside sections/blocks
Reusable logic, not editable by merchantSnippetNo schema, rendered via {% render %}, takes params
Logic shared across blocks/snippetsSnippetBlocks can't {% render %} other blocks

Liquid Syntax

Delimiters

  • {{ ... }} — Output (prints a value)
  • {{- ... -}} — Output with whitespace trimming
  • {% ... %} — Logic tag (if, for, assign) — prints nothing
  • {%- ... -%} — Logic tag with whitespace trimming

Operators

Comparison: ==, !=, >, <, >=, <= Logical: and, or, contains

Critical Gotchas

1. No parentheses in conditions — use nested {% if %} instead 2. No ternary — always use {% if cond %}value{% else %}other{% endif %} 3. `for` loops max 50 iterations — use {% paginate %} for larger arrays 4. `contains` only works with strings — can't check objects in arrays 5. `{% stylesheet %}`/`{% javascript %}` don't render Liquid — no Liquid inside them 6. Snippets can't access outer-scope variables — pass them as render params 7. `include` is deprecated — always use {% render 'snippet_name' %} 8. `{% liquid %}` tag — multi-line logic without delimiters; use echo for output

Variables

{% assign my_var = 'value' %}
{% capture my_var %}computed {{ value }}{% endcapture %}
{% increment counter %}
{% decrement counter %}

Filter Quick Reference

Filters are chained with |. Output type of one filter feeds input of next.

Array: compact, concat, find, find_index, first, has, join, last, map, reject, reverse, size, sort, sort_natural, sum, uniq, where String: append, capitalize, downcase, escape, handleize, lstrip, newline_to_br, prepend, remove, replace, rstrip, slice, split, strip, strip_html, truncate, truncatewords, upcase, url_decode, url_encode Math: abs, at_least, at_most, ceil, divided_by, floor, minus, modulo, plus, round, times Money: money, money_with_currency, money_without_currency, money_without_trailing_zeros Color: color_brightness, color_darken, color_lighten, color_mix, color_modify, color_saturate, color_desaturate, color_to_hex, color_to_hsl, color_to_rgb Media: image_url, image_tag, video_tag, external_video_tag, media_tag, model_viewer_tag URL: asset_url, asset_img_url, file_url, shopify_asset_url HTML: link_to, script_tag, stylesheet_tag, time_tag, placeholder_svg_tag Localization: t (translate), format_address, currency_selector Other: date, default, json, structured_data, font_face, font_url, payment_button

Full details: language filters, HTML/media filters, commerce filters

Tags Quick Reference

CategoryTags
Themecontent_for, layout, section, sections, schema, stylesheet, javascript, style
Controlif, elsif, else, unless, case, when
Iterationfor, break, continue, cycle, tablerow, paginate
Variableassign, capture, increment, decrement, echo
HTMLform, render, raw, comment, liquid
Documentationdoc
Full details with syntax and parameters: references/tags.md

Objects Quick Reference

Global objects (available everywhere)

cart, collections, customer, localization, pages, request, routes, settings, shop, template, theme, linklists, images, blogs, articles, all_products, metaobjects, canonical_url, content_for_header, content_for_layout, page_title, page_description, handle, current_page

Page-specific objects

TemplateObjects
/productproduct, remote_product
/collectioncollection, current_tags
/cartcart
/articlearticle, blog
/blogblog, current_tags
/pagepage
/searchsearch
/customers/*customer, order
Full reference: commerce objects, content objects, tier 2, tier 3

Schema Tag

Sections and blocks require {% schema %} with a valid JSON object. Sections use section.settings.*, blocks use block.settings.*.

Section schema structure

{
  "name": "t:sections.hero.name",
  "tag": "section",
  "class": "hero-section",
  "limit": 1,
  "settings": [],
  "max_blocks": 16,
  "blocks": [{ "type": "@theme" }],
  "presets": [{ "name": "t:sections.hero.name" }],
  "enabled_on": { "templates": ["index"] },
  "disabled_on": { "templates": ["password"] }
}

Block schema structure

{
  "name": "t:blocks.slide.name",
  "tag": "div",
  "class": "slide",
  "settings": [],
  "blocks": [{ "type": "@theme" }],
  "presets": [{ "name": "t:blocks.slide.name" }]
}

Setting type decision table

NeedSetting TypeKey Fields
On/off togglecheckboxdefault: true/false
Short texttextplaceholder
Long texttextareaplaceholder
Rich text (with <p>)richtext
Inline rich text (no <p>)inline_richtext
Number inputnumberplaceholder
Sliderrangemin, max, default (all required), step, unit
Dropdown/segmentedselectoptions: [{value, label}]
Radio buttonsradiooptions: [{value, label}]
Text alignmenttext_alignmentdefault: "left"/"center"/"right"
Color pickercolordefault: "#000000"
Image uploadimage_picker
Video uploadvideo
External video URLvideo_urlaccept: ["youtube", "vimeo"]
Product pickerproduct
Collection pickercollection
Page pickerpage
Blog pickerblog
Article pickerarticle
URL entryurl
Menu pickerlink_list
Font pickerfont_pickerdefault (required)
Editor headerheadercontent (no id needed)
Editor descriptionparagraphcontent (no id needed)

visible_if pattern

{
  "visible_if": "{{ block.settings.layout == 'vertical' }}",
  "type": "select",
  "id": "alignment",
  "label": "t:labels.alignment",
  "options": [...]
}

Conditionally shows/hides a setting in the editor based on other setting values.

Block entry types

  • { "type": "@theme" } — Accept any theme block
  • { "type": "@app" } — Accept app blocks
  • { "type": "slide" } — Accept only the slide block type
Full schema details and all 33 setting types: references/schema-and-settings.md

CSS & JavaScript

Per-component styles and scripts

Use {% stylesheet %} and {% javascript %} in sections, blocks, and snippets:

{% stylesheet %}
  .my-component { display: flex; }
{% endstylesheet %}

{% javascript %}
  console.log('loaded');
{% endjavascript %}
  • One tag each per file — multiple {% stylesheet %} tags will error
  • No Liquid inside — these tags don't process Liquid; use CSS variables or classes instead
  • Only supported in sections/, blocks/, and snippets/

{% style %} tag (Liquid-aware CSS)

For dynamic CSS that needs Liquid (e.g., color settings that live-update in editor):

{% style %}
  .section-{{ section.id }} {
    background: {{ section.settings.bg_color }};
  }
{% endstyle %}

CSS patterns for settings

Single CSS property — use CSS variables:

<div style="--gap: {{ block.settings.gap }}px">

Multiple CSS properties — use CSS classes as select values:

<div class="{{ block.settings.layout }}">

LiquidDoc ({% doc %})

Required for: snippets (always), blocks (when statically rendered via {% content_for 'block' %})

{% doc %}
  Brief description of what this file renders.

  @param {type} name - Description of required parameter
  @param {type} [name] - Description of optional parameter (brackets = optional)

  @example
  {% render 'snippet-name', name: value %}
{% enddoc %}

Param types: string, number, boolean, image, object, array

Translations

Every user-facing string must use the t filter

<!-- Correct -->
<h2>{{ 'sections.hero.heading' | t }}</h2>
<button>{{ 'products.add_to_cart' | t }}</button>

<!-- Wrong — never hardcode strings -->
<h2>Welcome to our store</h2>

Variable interpolation

{{ 'products.price_range' | t: min: product.price_min | money, max: product.price_max | money }}

Locale file:

{
  "products": {
    "price_range": "From {{ min }} to {{ max }}"
  }
}

Locale file structure

locales/
├── en.default.json          # English translations (required)
├── en.default.schema.json   # Editor setting translations (required)
├── fr.json                  # French translations
└── fr.schema.json           # French editor translations

Key naming conventions

  • Use snake_case and hierarchical keys (max 3 levels)
  • Use sentence case for all text (capitalize first word only)
  • Schema labels use t: prefix: "label": "t:labels.heading"
  • Group by component: sections.hero.heading, blocks.slide.title

References

  • Filters: language (77), HTML/media (45), commerce (30)
  • Tag reference (30 tags)
  • Objects: commerce (5), content (10), tier 2 (69), tier 3 (53)
  • Schema & settings reference (33 types)
  • Complete examples (snippet, block, section)

Related skills

Forks & variants (1)

Shopify Liquid Themes has 1 known copy in the catalog totaling 142 installs. They canonicalize to this original listing.

How it compares

Pick shopify-liquid-themes over generic frontend skills when output must be valid Shopify Liquid with editor schema, not plain React or HTML.

FAQ

When should I use a section versus a snippet?

Use sections for full-width customizable modules with schema in the editor; use snippets for reusable logic rendered via render without merchant settings.

Can Liquid run inside stylesheet tags?

No. stylesheet and javascript tags do not process Liquid; use style tags or CSS variables for dynamic values.

How must user-facing strings be written?

Every user-facing string must use the t filter with hierarchical snake_case keys in locale JSON files.

Is Shopify Liquid Themes safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.