↑ ↓ to navigate
↵ to select
esc to close
Guides Intermediate

Liquiditor - Local Theme Development

Liquiditor is Airogel CMS's local-first Liquid theme previewer backed by a read-only SQLite cache of your content. Its CLI syncs templates and assets, manages content, and can register and subscribe a new account from the terminal.

What is Liquiditor?

Liquiditor is a local-first environment for developing Airogel CMS themes. It's a small Sinatra app that renders your Liquid templates against a local SQLite copy of your account's content instead of the live CMS. It uses the same custom Liquid tags, filters and variable scoping as the CMS, so templates behave the same way locally as they do on your site.

Why use it

  • Fast local iteration with live reload. You don't need to push every template change to the CMS to see it.
  • The same custom Liquid tags and filters as the CMS, including {% form_for %}, {% paginate %}, {% query %}, {% cms_scripts %}, asset_url and image_tag.
  • A Tailwind CSS v4, esbuild and Stimulus front-end pipeline for each theme.
  • A built-in AI chat widget, Pi, for AI-assisted theme editing in the browser preview.
  • Two-way sync: download content and templates from the CMS, and upload template and asset changes back.
  • A command-line tool, bin/airogelcms, that can create an account, subscribe it and manage content through the Airogel CMS API.

How close is it to production?

Liquiditor renders pages the same way the CMS does: first the page's content template, then the theme.liquid layout. {% paginate %}, {% query %}, {% form_for %} and collection index pages follow the same rules as production. A few features that exist only on the live platform are not available locally. For example, the global events variable (see Events & Registrations) is not set in Liquiditor previews. Before publishing, check important pages against the live CMS.

Getting Liquiditor

Liquiditor is available to Airogel CMS customers. Contact support@airogelcms.com for access. It's a standalone Ruby app with its own Gemfile, Rakefile and bin/dev launcher, and it runs on your own computer. It connects to your account through the Airogel CMS API using an API token.

liquiditor/
├── liquiditor.rb          # Sinatra app (rendering, live reload, uploads, Pi chat)
├── airogel_cms_client.rb  # API client used by the CLI
├── bin/airogelcms         # CLI: account setup, sync, content CRUD
├── bin/dev                # Starts web + CSS/JS watchers
├── lib/                   # Liquid tags/filters mirroring the CMS
├── db/schema.rb           # Local SQLite schema
├── docs/                  # Guides (account setup, creating themes, Tailwind, ...)
└── themes/{theme}/        # Your local theme(s)

Each theme directory contains:

  • .env: API credentials for the account this theme belongs to
  • templates/*.liquid: Liquid templates
  • css/, js/ and assets/: Tailwind and JavaScript source files, compiled output, and static assets
  • database.sqlite3: the local content cache
  • docs/liquid_tags.md: a generated reference of every Liquid variable for this account

Quick start

bundle install

# Scaffold a new local theme (also sets THEME=my_theme in .env_vars)
bundle exec rake "create_theme[my_theme]"

# Install the theme's JS/CSS dependencies
cd themes/my_theme && yarn install && cd ../..

# Start the dev server (web app + CSS/JS watchers)
bin/dev

Then open http://localhost:4567 to see your theme.

  • INSTALL=true bundle exec rake "create_theme[my_theme]" also runs yarn install and the first asset build.
  • In zsh, always quote the task name: rake "create_theme[my_theme]".
  • bin/dev reads the active theme from THEME in .env_vars. To switch themes, change that value.
  • The Pi chat widget runs inside the web app, so you don't need to start it separately.

Sign up and create accounts from the command line

The bin/airogelcms CLI can create a new Airogel CMS account and activate a paid subscription without opening the dashboard. This is useful for scripting, testing and onboarding automation. Commands follow this form:

bin/airogelcms <theme> <action> [--key=value ...]

Full flow for a new user

1. register              → creates user + account + API token
2. write themes/<theme>/.env with the credentials it prints
3. list_plans            → shows available plans and their IDs
4. subscription_checkout → generates a Stripe Checkout URL to open in a browser
5. (pay in the browser)
6. subscription_status   → confirms the subscription is active
7. download_theme        → pulls templates and content to start working locally

1. Register a new user and account

register creates a new user, a new account (with the default starter content) and a permanent API token in one request. It is the only command that doesn't need a theme .env. It uses the production API unless you pass --api_url.

bin/airogelcms my_theme register \
  --name="Jane Doe" \
  --email=jane@example.com \
  --password=yourpassword \
  --account_name="Jane's Site"

The response includes the new account.id, a one-time api_token and a .env block you can paste:

AIROGEL_API_URL=https://api.airogelcms.com
AIROGEL_ACCOUNT_ID=acct_xxx
AIROGEL_API_KEY=a1b2c3d4e5f6...

Save the API token immediately. It's shown only once. If you lose it, create a new one on the API Tokens page of your account settings in the dashboard. Registration is rate-limited. If sign-up through the API is turned off, the command returns an error, and you can sign up in the dashboard instead.

2. Write the theme's .env

Every command other than register reads its credentials from themes/<theme>/.env. If you haven't created the theme yet, run rake "create_theme[my_theme]", then paste the .env block into themes/my_theme/.env.

3. List available plans

bin/airogelcms my_theme list_plans
bin/airogelcms my_theme list_plans --interval=month

4. Subscribe with Stripe Checkout

bin/airogelcms my_theme subscription_checkout --plan=plan_abc123

This returns a checkout_url. Open it in a browser to pay. You can also pass --success_url and --cancel_url to choose where the browser goes after checkout. See Billing for plan details.

5. Confirm the subscription

bin/airogelcms my_theme subscription_status

6. Pull the theme

bin/airogelcms my_theme download_theme

Creating additional accounts

Once a theme has a valid .env, the CLI can create more accounts for the same user, one per site:

bin/airogelcms my_theme create_account --name="My Second Site"

The response includes the new account's id. Point a new theme directory's .env at it, or change AIROGEL_ACCOUNT_ID, to start working with that account.

Already have an account?

Skip registration. Create an API token on the dashboard's API Tokens page and fill in the theme's .env:

AIROGEL_API_URL=https://api.airogelcms.com
AIROGEL_ACCOUNT_ID=acct_xxxxxxxxxxxxx
AIROGEL_API_KEY=your_api_key_here
bin/airogelcms my_theme list_collections

Two-way CMS sync

CommandWhat it does
download_themePulls content, templates and assets from the CMS, rebuilds the local SQLite cache and regenerates docs/liquid_tags.md
download_databasePulls only content and rebuilds the local SQLite cache
download_templatesPulls only templates into local .liquid files
download_assetsPulls only assets
upload_themePushes templates and assets to the CMS. It does not upload content
upload_templatesPushes local .liquid files to the CMS
upload_assetsPushes local theme assets to the CMS, skipping files that haven't changed
generate_liquid_docsRegenerates docs/liquid_tags.md from the local cache

By default only published entries are downloaded. Add --include-unpublished to download_theme or download_database to include drafts, so you can preview unfinished content locally:

bin/airogelcms my_theme download_database --include-unpublished

Changing content

The local database.sqlite3 is a read-only cache of your CMS content. Don't query or edit it directly: changes there don't reach the CMS, and the next download overwrites them. Make every content change with bin/airogelcms, then run download_database to refresh the local copy.

ResourceCommands
Accountslist_accounts, create_account
Collectionslist_collections, get_collection, create_collection, update_collection, delete_collection
Entrieslist_entries, get_entry, create_entry, update_entry, delete_entry (all take --collection)
Blueprintslist_blueprints, get_blueprint, create_blueprint, update_blueprint, delete_blueprint
Navigationslist_navigations, get_navigation, create_navigation, update_navigation, delete_navigation
Navigation itemslist_navigation_items, create_navigation_item, update_navigation_item, delete_navigation_item
Globalslist_globals, get_global, create_global, update_global, delete_global
Templates and assetslist_templates, list_assets
Import helpersparse_wordpress (WordPress XML export), download_remote_asset, extract_asset_urls

Options are passed as --key=value, for example --id=about --collection=pages. The CRUD commands print JSON, so scripts and AI agents can read the output.

bin/airogelcms my_theme update_entry --collection=pages --id=about --title="About Us"
bin/airogelcms my_theme download_database

Liquiditor is local-first. Editing files in the theme directory changes only your local preview. Nothing is published until you run an upload command or a CRUD command. You can also make changes through the REST API or MCP.

Liquiditor and Creator Mode

Creator Mode is a hosted version of Liquiditor. It is available on the Creator plan and opens inside the Airogel CMS dashboard at /creator, so you don't install anything. The theme layout, Liquid behaviour and Pi assistant are the same as in the local version, so what you learn on this page applies to both. See Billing for plan details.