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_urlandimage_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 totemplates/*.liquid: Liquid templatescss/,js/andassets/: Tailwind and JavaScript source files, compiled output, and static assetsdatabase.sqlite3: the local content cachedocs/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 runsyarn installand the first asset build.- In zsh, always quote the task name:
rake "create_theme[my_theme]". bin/devreads the active theme fromTHEMEin.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
| Command | What it does |
|---|---|
download_theme | Pulls content, templates and assets from the CMS, rebuilds the local SQLite cache and regenerates docs/liquid_tags.md |
download_database | Pulls only content and rebuilds the local SQLite cache |
download_templates | Pulls only templates into local .liquid files |
download_assets | Pulls only assets |
upload_theme | Pushes templates and assets to the CMS. It does not upload content |
upload_templates | Pushes local .liquid files to the CMS |
upload_assets | Pushes local theme assets to the CMS, skipping files that haven't changed |
generate_liquid_docs | Regenerates 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.
| Resource | Commands |
|---|---|
| Accounts | list_accounts, create_account |
| Collections | list_collections, get_collection, create_collection, update_collection, delete_collection |
| Entries | list_entries, get_entry, create_entry, update_entry, delete_entry (all take --collection) |
| Blueprints | list_blueprints, get_blueprint, create_blueprint, update_blueprint, delete_blueprint |
| Navigations | list_navigations, get_navigation, create_navigation, update_navigation, delete_navigation |
| Navigation items | list_navigation_items, create_navigation_item, update_navigation_item, delete_navigation_item |
| Globals | list_globals, get_global, create_global, update_global, delete_global |
| Templates and assets | list_templates, list_assets |
| Import helpers | parse_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.