For developers

Build a theme for Abizvo Sites

Themes are written in Liquid, the template language Shopify themes use, and rendered by Fluid on Abizvo's servers. If you have built a Shopify Online Store 2.0 theme, the package, the JSON templates, the {% schema %} blocks and the settings schema will look familiar. What differs is what a theme may reach: only dictionaries, lists and primitives reach Liquid, every output is HTML-encoded, each section renders in isolation so a failing one leaves the page standing, and the platform writes the head, the colour-scheme classes, the fonts and the "Powered by Abizvo" line.

Documentation

The developer documentation, page by page

Every page is written from the code that enforces it, and a test holds the two together: the setting types, the filters, the check's refusals and the marketplace's limits on these pages are the ones the platform runs.

Getting started

What a theme is, the workspace or a local folder with the preview tool, and the check → release → install → publish loop.

Package layout

The manifest's fields, the ten folders and their path rules and size caps, templates, section groups, locales and assets.

Liquid

The five tags, the eighteen filters with an example each, every object and global, what is encoded, and two traps.

Sections and blocks

The schema, nested blocks, presets, placement, visible_if, dynamic sources, reusable sections and the limits.

Settings

Every setting type with its stored shape and validation, the custom property naming, colour schemes, fonts, animation and effects.

Templates and pages

Layouts, templates and alternates, the 404, galleries, collections and entry pages, the head the platform writes.

Assets, motion and effects

asset_url and the bundles, the motion runtime and its clip-reveal rule, the effects library, the budget.

The theme check

Every pass and every code — what is refused and what is flagged — and how to read findings in the workspace.

Design reference

design.abizvo.com — the library, presets, the mixer and the exports — as the starting point for a look.

Premium theme standards

The bar a paid theme meets: the check, every look on every template, contrast, the budget, honest content, support, media, pricing.

Submitting to the marketplace

The seller account, the listing, packaging the ZIP, the checklist, the review, publication and updates.

Apps

Blocks a theme section accepts and embeds placed on every page: the app package, permissions, the app check, the workspace and pricing.

The package

Ten folders and a manifest

A theme is a folder tree with abizvo-theme.json at the root — key, name, semantic version, category, industries, feature flags and the pages it creates — and these folders (ThemePackage.Folders); anything else, a .. or an absolute path is refused at import:

config/

settings_schema.json declares the global settings, settings_data.json their values and presets.json the looks — each a named set of global settings.

layouts/ and templates/

A Liquid layout; templates as JSON, one per page type — home, page, page.about, service, portfolio, contact, gallery, entry, 404 — with sections and their block_order.

sections/ and blocks/

A .liquid file per section with a {% schema %} naming its settings, blocks and presets; the group files header-group.json, footer-group.json, announcement-group.json, overlay-group.json, aside-group.json.

snippets/ and assets/

Snippets rendered with render; the theme's CSS, images and any script under assets, addressed with asset_url and served content-hashed, cacheable for a year.

locales/

en.default.json and fr.json, read by the t filter, which takes Shopify-style one / other plurals chosen by count. A site is in one language, English or French (Canada).

screenshots/ and documentation/

Listing screenshots at desktop and phone size, and the owner's documentation — a README, an IMAGES note and the sample content — shipped with the theme and checked with it.

Settings

Forty-two setting types, one gate

ThemeSettingTypes is the one place a stored value is checked: a value is normalized there or refused there, at save and again at publish, and the renderer trusts nothing else. Nothing a setting holds is HTML — richtext is the platform's own markup (blank lines, ## , - ), and a default written as HTML renders its tags as words.

text · textarea · inline_richtext · richtext · date · number · range · checkbox · toggle · select · radio · button_group · color · color_scheme · color_scheme_group · color_background · image_picker · video · video_url · url · page · gallery · product · collection · form · link_list · icon · font_picker · text_alignment · spacing · border · radius · shadow · animation · effect · header · paragraph

  • A setting's CSS custom property is its id with _ → -: min_height is --min-height, and a scheme colour button_text is --color-button-text. A theme reading the underscore form gets nothing.
  • size, first, last, keys, values and empty are reserved as setting ids: Liquid answers them from the settings dictionary itself, so {{ settings.size }} is the number of settings, not your setting.
  • Textual settings may be connected to a dynamic source — the business's own name, phone, address — instead of a typed value.
  • A form setting is one of the platform's forms: contact, newsletter, lead, quote, booking. The post goes to the site itself and creates a lead.
  • An effect setting picks from the platform's own library — 3D tilt, magnetic, spotlight, lift, image zoom, zoom on scroll, count up, stacking cards, marquee, living gradient, word by word, at subtle, medium or bold — written as {{ section.settings.effect | effect_attributes }}, never as an inline style. The runtime reaches only a page that uses one, and everything that moves sits under prefers-reduced-motion: no-preference.

Liquid

What a theme reads, and what it can call

Globals

settings, page, site, request, collections (the site's own content types, read as collections[handle]), entry on an entry page, albums and gallery on a gallery page, and three the platform reads live on every page view rather than freezing into a publication: services, products and booking. Prices arrive already worded in the right currency — a theme prints, never calculates — and a bookable thing carries a url into the platform's own booking flow.

Tags

content_for 'blocks' and content_for 'block', sections 'header' (a section group), form 'contact' and style — beside Liquid's own.

Filters

asset_url · image_url · image_tag · video_tag · icon_tag · placeholder_svg_tag · stylesheet_tag · script_tag · font_family · color_to_rgb · link_url · handle · handleize · json · t · editable · animation_attributes · effect_attributes

editable marks text the editor lets the owner edit in place on the canvas; animation_attributes writes the entrance the platform's motion runtime plays; json is the one way to hand data to a script.

Two traps

The layout's {% style %} block must come after theme.css, because both declare custom properties on :root and the later declaration wins. And a caption never sits on a full-bleed picture, where its contrast depends on whatever the owner uploads.

The theme check

What the check reads, and what it refuses

ThemeChecker runs on import, on every save in the workspace, at release and again in the marketplace review. A theme with any error cannot be installed; a warning is reported and lets it through.

Structure and schemas

The manifest, the folder rules, every {% schema %} against the setting types, every template and group against the theme's own schemas, each preset, the stored data, the assets each file references, and the locale files.

Liquid, CSS, SVG

Every Liquid file is parsed. CSS is read as tokens by the platform's own lexer, never matched as text. An SVG is a document that can carry script, and a theme's may not.

Budget and accessibility

Warnings at 150 KB of CSS, 150 KB of script, 800 KB for one image, 25 MB in all and 60 assets; an error past 400 KB of script. An accessibility pass over the rendered markup.

JavaScript is read as a syntax tree

ThemeJsAnalyzer parses each script (at most 400 KB) and refuses, as an error: eval, Function and importScripts; a dynamic import() or an import from another site; a worker; a <script> element built from text or created at runtime; with; document.cookie; navigator.sendBeacon; the credential store; document.write; a timer given a string; and a redirect or form action worked out at runtime. Network calls, storage and HTML sinks (innerHTML and its siblings) are flagged as warnings. Official themes ship no JavaScript at all except Starter; on a site, a theme's script runs only on the site's own origin, never on the platform's path.

Fonts, effects, motion

The platform supplies what a theme should not download

  • Fonts are self-hosted. Every family a font_picker offers is a SIL Open Font License file served from the platform, so a site's page keeps font-src 'self' and never fetches type from a third party. The editor previews each face in its own face.
  • Motion is the platform's runtime. animation_attributes writes the entrance and abizvo-motion.js plays it with an IntersectionObserver, off under reduced motion; a clip reveal is measured by its own box.
  • Effects are chosen, never coded. Owners pick an effect in the editor; nobody but the platform writes the code that runs it.

Versions

Versioning, updates and the workspace

Semantic versions, frozen once released

A version is major.minor.patch, no pre-release, and is immutable once out of Draft — change a file, bump the version. Every six hours the platform moves each site's copy to its theme's newest released version, in the draft only, after a restore point and with a note of every setting the new version dropped; the live page renders from its frozen publication until the owner publishes again. A copy edited in the last fifteen minutes waits for the next pass.

The developer workspace

At /app/website/themes in your account: start from a theme you may install (a copy under a key of your own) or import a ZIP through the same guarded reader the marketplace uses; edit text files in a Draft, where every save re-runs the check and a live preview renders under the editor's own policy; release when the check passes and the manifest version matches; start the next version as a draft copy; export the ZIP. A released theme of yours installs on your own organization's sites.

Selling

List it on the Abizvo Marketplace

A released theme can be submitted to the Marketplace under Website Themes. The review is the theme check — an error blocks, a warning flags — plus a check that the theme's key is not already another product's; there is no demo store to inspect, and a live demo is an ordinary Abizvo site running the theme. An approved release is imported as a marketplace theme owned by its product, and a buyer's organization installs it on their own sites. Listing needs a hero image of at least 1600×900, three desktop screenshots and one phone screenshot.