htmlctl
Deploy static sites to your own server.
Git-free. Agent-friendly. Instant rollback.
Why htmlctl
Built for the way you actually ship.
Everything you need to deploy static sites with confidence — nothing you don’t.
Staging → Production
Push to staging first, verify everything looks right, then promote with one command. The exact same release — byte-for-byte — ships to production. Zero rebuild risk.
htmlctl promoteInstant Rollback
Every release is immutable. Roll back to any previous state in under a second — it’s just a symlink switch. Full release history kept forever in SQLite.
htmlctl rollout undoAgent-Friendly
Machine-parseable output, deterministic HTML rendering, and a clean Bearer-auth API make it trivial to wire up AI agents, CI pipelines, or custom scripts.
--output jsonSelf-Hosted & Secure
Your server, your data. Traffic tunnels over SSH — no inbound ports to open. Bearer-token auth with constant-time comparison, non-root container, full structured audit log.
ssh tunnel · bearer authHow it works
Three commands. Done.
The simplest deploy workflow that can still scale to a real production site.
Push to staging
Send your HTML components, pages, and styles over SSH. The server diffs, builds a new immutable release, and activates it on staging instantly.
Verify
Preview exactly what changed. Check the staging URL. Inspect logs. Confirm every component renders correctly before going live.
Ship to production
Promote the exact staging artifact to prod. No rebuild, no drift, no surprises. TLS managed automatically by Caddy.
Architecture
Simple by design.
No Kubernetes. No CI pipeline. Just a Go binary, SQLite, and Caddy.
request flow
Deploy your first site in minutes.
Self-host htmlservd on any Linux server. Deploy from your laptop, your CI, or an AI agent.