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_heightis--min-height, and a scheme colourbutton_textis--color-button-text. A theme reading the underscore form gets nothing. size,first,last,keys,valuesandemptyare 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
formsetting is one of the platform's forms: contact, newsletter, lead, quote, booking. The post goes to the site itself and creates a lead. - An
effectsetting 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 underprefers-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_pickeroffers is a SIL Open Font License file served from the platform, so a site's page keepsfont-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_attributeswrites the entrance andabizvo-motion.jsplays 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.