Features

Small on the outside. Surprisingly complete inside.

IllusionCMS covers what a developer-built website needs—from the editor to data, automation and operations. Here is the full tour.

Editor

A code editor that feels like your IDE.

Every page is HTML with template tags—edited in CodeMirror, previewed live next to it.

  • Emmet abbreviations with Tab, formatting with Prettier (template tags stay untouched)
  • Live preview in desktop, tablet and mobile width—including unsaved changes
  • Template data panel shows exactly what your template sees
  • Version history, restore and a warning when someone else saved in the meantime
  • Code editors stay dark, even in the light theme
IllusionCMS page editor: page tree, code editor with template code and live preview
Templates & components

Reuse everything—without a build step.

Snippets, components and layouts keep your markup DRY. CSS and JavaScript live in a shared library and are attached where they are needed.

Template language

Django/Twig-style syntax with filters, macros, includes and {% verbatim %} for Vue or Alpine.

Page layouts

Mark a snippet as a page layout—new pages start with {% extends %} and a content area.

Components with slots

{% component %} with named slots and fallbacks—like web components, but on the server.

Shared CSS & JS

One library, assigned per page or inherited by subpages. Minified and versioned automatically; ES modules detected.

Assets on snippets

Attach CSS/JS to a snippet—it only loads on pages that actually use it.

Pens

A playground for HTML, CSS and JS with live result—private or shared via link.

Components

Markup once, use it everywhere.

A component is a snippet with slots. Pass parameters, fill slots, done—changes apply everywhere at once. The same components become building blocks for editors.

pages/team.html
{% component "card" image=p.photo %}
  {% fill "title" %}{{ p.name }}{% endfill %}
  <p>{{ p.summary }}</p>
  {% fill "footer" %}
    <a href="/team/{{ p.slug }}">Profile →</a>
  {% endfill %}
{% endcomponent %}
Page builder

Editors fill in forms. You keep the markup.

Give any snippet a schema with typed parameters and slots—and it becomes a building block. Pages and collection entries can then be assembled from blocks.

  • Text, Markdown, images, files, selects, references and more
  • Slots with allowed blocks and limits
  • Global blocks with per-use overrides—change once, update everywhere
  • Form editor with live preview; click a block in the preview to edit it
  • With IllusionPublish: visual editing directly on the page
IllusionCMS page builder: block form with parameters and slots next to the live preview
Data

Collections for your content.

Define structures with typed fields—blog, team, products, events—and use them in any template.

  • Text, Markdown, HTML, numbers, dates, images, files, selects, references, blocks
  • Singleton collections for site settings
  • Detail pages with live preview while editing
  • CSV import with matching and export
  • Optional public JSON API with CORS
  • Live data: entries created on the server (e.g. form submissions) survive a content push
IllusionCMS collections: entries of a product collection with status and actions
Data sources

Your content, any API, IllusionDB—one syntax.

REST sources bring external data into your templates: shops, CRMs, headless systems or your own services—with placeholders, headers, secrets from environment variables and caching. Through workflows, IllusionDB tables become pages too, including thousands of landing pages with a generated sitemap.

pages/products.html
{# Collection, REST API and IllusionDB – same syntax #}
{% for p in data("products", "category", route.query.cat,
                 "sort", "price", "limit", 12) %}
  {% include "product-card" with product=p %}
{% endfor %}

{% with weather=data("weather-api", "city", "Berlin") %}
  <p>{{ weather.current.temp }} °C</p>
{% endwith %}
Workflows

Automation without another server.

Connect nodes on a canvas—Node-RED style. Forms, webhooks and schedules start a flow; JavaScript nodes, switches, HTTP requests and collection actions do the work.

  • Run history with a trace of every node
  • Build your own reusable nodes
  • Call a workflow from a template with workflow()
IllusionCMS workflow editor: node canvas of a contact form flow with the JavaScript of a function node

HTTP inputs

Public endpoints for forms and webhooks—with honeypots, validation and redirects.

Schedules

Cron expressions for nightly jobs, price lists, imports or clean-ups.

Collection events

React when entries are created, changed or deleted.

Email

Send emails via your SMTP server—notifications, confirmations, reports.

Delay & join

Wait, merge parallel branches and keep state in a small key-value store.

IllusionDB nodes

Read and write tables of IllusionDB—filtered, grouped and cached.

Multilingual

One site, many languages.

Language subtrees or separate sites per language—IllusionCMS links the translations and takes care of the rest.

  • Linked translations for pages and collection entries
  • hreflang tags and sitemap alternates generated automatically
  • translations() and language_name() for your language switcher
  • Menus per language with lang_root()
  • Admin interface in five languages
snippets/language-switch.html
<nav class="languages">
  {% for t in translations() %}
    <a href="{{ t.url }}" hreflang="{{ t.lang }}"
       {% if t.current %}aria-current="page"{% endif %}>
      {{ language_name(t.lang) }}
    </a>
  {% endfor %}
</nav>
Import

Move your existing website in minutes.

Point the importer at a sitemap or let it crawl. It takes over the page tree, HTML, CSS and JavaScript as shared assets, images, fonts and videos—and rewrites all links.

  • Analysis first: which pages, which external hosts
  • Repeat the import without duplicates; pages you edited stay protected
  • Update from source for single pages
  • Works with Webflow, WordPress, Squarespace and static sites
IllusionCMS website import: analysis of illusiondb.com with 450 pages from the sitemap, target website and external files – before importing
Operations

Built for real servers.

IllusionCMS is one Go binary with an SQLite database. Everything else is built in.

History & backups

Versions with restore for pages, snippets, assets and workflows; nightly backups.

Bundles

Move complete content between instances—or push from local to production.

S3 storage

Garage, AWS, Hetzner, R2 … with local cache and guided migration.

Private files

Signed, expiring links or sign-in required.

Statistics

Daily totals for pages, referrers, browsers, countries and downloads—no cookies.

Many sites

Domains, sitemap, robots.txt, icon and 404 page per site.

Page cache

Rendered pages in memory with gzip and ETag—cleared on every change.

REST API

Tokens with read or write access, batches, idempotency keys, schema endpoint.

Webhooks

Signed notifications on content and schema changes—with retries.

Security

Security headers, CSP, rate limiting, CSRF protection, HSTS behind HTTPS.

Redirects & 404 log

Automatic redirects when pages move; CSV import and export.

Headless mode

Run without admin—manage it remotely from your local instance.

For agencies

Your clients need an editorial workflow? Add IllusionPublish.

IllusionPublish sits on top of one IllusionCMS instance. Your developers keep working in the CMS—your clients’ editors get a visual editor, workspaces and approvals, and never see a line of code.

Try it free for 30 days.

  • Visual editorEdit text and images right on the page
  • Workspaces and approval chainsChanges go live as a package—atomically
  • Permissions down to single fieldsEditors change content, not design
  • SSO, SCIM and passkeysEntra ID, Google, Keycloak and more

Enjoy writing HTML again.

IllusionCMS is free. No account, no telemetry, no strings attached.