Dev Tool · Open Beta

htmlctl

Deploy static sites to your own server.
Git-free. Agent-friendly. Instant rollback.

apply staging promote production

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 promote

Instant 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 undo

Agent-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 json

Self-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 auth

How it works

Three commands. Done.

The simplest deploy workflow that can still scale to a real production site.

01
htmlctl apply -f 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.

02
htmlctl diff / status

Verify

Preview exactly what changed. Check the staging URL. Inspect logs. Confirm every component renders correctly before going live.

03
htmlctl promote

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

Open Source · MIT

Deploy your first site in minutes.

Self-host htmlservd on any Linux server. Deploy from your laptop, your CI, or an AI agent.