One prompt. One site.
the self-hosted Agentic Web Platform (AWP)
Generate websites — never generate backend code. CMSnap serves pages, forms, an admin panel, a JSON API, SQLite and HTTPS from one self-contained binary, and hosts many isolated sites — a site per domain. AI agents manage content, media, templates and settings over a secure MCP endpoint. No application runtime, database server or reverse proxy required.
Static speed. Static safety. Fully dynamic. Fully generated.
Download CMSnap-LITE Start in two commands →
./cmsnapone self-contained binaryA token is one site’s administrator, no more: the agent runs that site — content, media, templates, settings — and never reaches a neighbour or the server itself. IP-restrictable, revocable at any time.
single binarymulti-sitea SQLite per siteMCP-native
Nothing here is a mockup
This site runs on the engine it documents — one self-contained binary, a site
per domain, serving 1,042,959 requests per second on 16 server cores — with the request log on. Every
feature below is wired up in settings.json, and you can try each one right now.
An AI agent can run this site
Issue a token on the MCP page and an agent builds and maintains pages, media and templates — inside a fenced scope you can restrict by IP and revoke any time.
Content lives in the database
These docs are rows in SQLite. Edit an article in the admin — or let the agent do it — refresh, done.
Passwords never leave the browser
The password itself never reaches the server — sign-in runs the OPAQUE protocol. The admin behind it: CRUD for every table, users, roles, invite links.
- Server-side rendering, no JS framework
- Every page is a Handlebars file on disk. Edit it, run
cmsnap reload, zero downtime. - Views: filters, ordering, pagination
- A view filters by any indexed columns — several at once, from path parameters
and the query string — with declared ordering and cursor pagination.
/docs/<group>here is one such filter. - Publish flag
- Untick “published” on an article and it vanishes from the site. That's
fixed_filterat work. - Public forms
- Validation, a honeypot for bots, a rate limit and server-side timestamps: all declared in the config.
- JSON API
- Any view can be served as JSON at any path you declare in the config —
/api/docshere returns these very articles: try it below. - HTTPS without a reverse proxy
- Your PEM files, or a Let's Encrypt certificate the binary obtains and renews itself.
- SQL console & analytics
- Query this site's databases and the request log via sqliteonline.com — a per-user flag: users read, admins write; a DuckDB mode handles heavy traffic analytics.
- Files & media
- Uploads are verified by file contents, not by extension, and served with immutable cache headers.
- Many sites, one binary
- A domain → folder map in the root config: isolated databases, users and templates
per site; adding one is a
cmsnap reload. - MCP for AI agents
- Issue a token in the admin and an agent runs that site over
/mcpwith an administrator’s reach — and never leaves it.
Documentation
Loaded from the doc_groups table of this site's database
(3 groups). Signed-in users can edit every word at
/cms/docs.
Quick start, CLI commands, common recipes, what this example wires up.
Browse → ConfigurationThe root file (server, sites, cache, access_log, soe) and every site block: db, static, tables, views, routes, errors, auth, cms, media, seed, MCP.
Browse → Templates & frontendHandlebars layout and context, admin templates, the WASM sign-in client, AJAX fragments.
Browse →Try the API right here
The buttons call this site's own endpoints from your browser; the same
requests work with curl.
GET /api/docs?grp=configuration
An api GET route serving the doc_list view as
JSON: rows, total, next_cursor.
GET /api/doc/1
A single-record view behind a path parameter: the same article you can read as a page, served as raw JSON.