Quick start

CMSnap-LITE is a single static binary that serves one or many sites: the root settings.json holds the process settings and the domain → site map, and each site is a folder under www/ with its own settings.json (tables, views, routes, admin menu), SQLite databases and Handlebars templates. This documentation is itself table content — it lives in the docs table of this site’s database. And it is built for the hot path: this very page benchmarks at 334,707 requests/second next to a hand-tuned nginx serving it as a static file — setup, rounds and numbers in the Benchmark article.

  1. ./cms in an empty folder — the first start bootstraps everything: the root config, this example site under www/default/, the documentation, an admin user. The console prints a one-time first-run summary: the generated admin password, the enrollment link for the hidden admin zone and an MCP token for AI agents. Save it — it is shown once.
  2. The admin is hidden by default. A fresh bootstrap ships with the device gate ON: /cms answers 404 until you open the enrollment link from that summary once on your device (see the cms article). ./cms def-help — the explicit factory reset to this same example — unpacks it with the gate off and /cms/login open; ./cms def-help run also starts the server right away.
  3. Sign in at /cms/login. Open Articles in the admin — you can edit this very page and see the change after refresh.
  4. Edit the config, then apply with ./cms reload (no downtime) or restart.

There are no baked-in credentials. Passwords use the OPAQUE protocol and never leave the browser. Accounts appear via invite links or the CLI — and whenever a site’s users table is empty at startup, a fresh admin is bootstrapped with a random generated password (printed once; change it after the first sign-in).

Or the whole thing in two lines:

./cms def-help   # factory-reset to this example, print the admin password
./cms            # serve it on 0.0.0.0:8080

← All articles in this group