Simple, private, trusted
Jot: your
private web.
A home for the pages, tools, and little services your team and agents create. One push turns ad hoc web work into a private URL your company can trust.
$ jot push . Published: https://jot.acme.com/a35rkl/
Why Jot
The smallest reliable path from agent output to team tool.
Private by default
Every deploy stays behind your company's trust boundary. Share a time-limited link, open a slug to the public, close it again. You decide who gets in — and for how long.
Simple by default
Push an HTML file, a built directory, or a small service. No build pipeline, no framework lock-in. If it belongs on the web, it gets a URL in seconds.
Built for generated work
Agents and humans publish reports, prototypes, docs, dashboards, review kits, and internal tools with the same command. Titles, tags, and summaries keep every deploy findable later.
Self-hostable first
The whole server is one binary. Run jotd on your own box and own the whole trust boundary. The hosted service is convenience, not lock-in.
The entire server is a single binary.
Drop jotd on a box, point it at storage, and you're hosting. State, logs, and the message bus are embedded — no database cluster, no sidecar fleet, no Kubernetes. Updating is replacing one file.
- one static binary
- your storage
- your auth
- your domain
Static first. Dynamic when you need it.
Put a server.ts next to your static files and push. Static paths are served as plain bytes, like always. Everything else hits your fetch handler in a workerd isolate — cold start ~20 ms, warm requests sub-millisecond. Durable key-value state survives redeploys, rollbacks, and restarts.
// server.ts export default { async fetch(req, env) { const hits = ((await env.state.get("hits")) ?? 0) + 1; await env.state.put("hits", hits); return Response.json({ hits }); } } $ jot push . --as counter --experimental-runtime Published: https://jot.acme.com/counter/
Powered by workerd, the open-source Cloudflare Workers runtime, supervised by jotd — no outbound network unless you allow it. Stream what your worker says with jot logs --follow.
Features
Everything a deploy needs. Nothing it doesn't.
$ jot push
Publish a file or a built directory in one command. Get back a stable URL on a slug you name.
→ Share links
Hand out time-limited signed URLs to people outside your trust boundary. They expire on their own.
→ Public slugs
Flip a slug public when the work is ready for the world, close it again when it isn't. Search-engine indexing is opt-in.
→ History, rollback & keeps
Every push is a version with its own pinned URL. jot rollback restores the previous deploy; jot keep pins a version so it never gets pruned.
→ Durable slug state
Pages and workers share a per-slug key-value store. A guestbook, counter, or feedback box with no database to run — state outlives every redeploy.
→ Searchable metadata
Titles, summaries, and tags ride along with every deploy. jot ls --search finds last quarter's report instantly.
→ SPA routes & headers
Serve single-page apps with a fallback route. Set cache-control and other headers per path glob.
→ Built for agents
JSON event output and a recorded actor on every push. Automated workflows publish, audit, and tail logs like humans do.
Built with Jot
Jot is built with Jot.
The server ships small primitives — deploys, capabilities, durable state, a slug directory, usage counters, and a tiny page SDK. Features aren't bolted onto the server. They're composed from those primitives and pushed like any other artifact.
$ jot push dashboard.html --as analytics $ jot capabilities enable analytics --directory-read --usage-read // dashboard.html — the whole "backend" const { deploys } = await jot.directory.list({ include: "usage" });
The dashboard above is the server's traffic view: pageviews, bytes, daily series, and top paths for every deploy. One file, two capability grants — no database, no analytics service, nothing bolted onto jotd. The same primitives are yours to mix.
Examples
Live from this server.
Four public slugs, served by the same jotd instance as the page you're reading.
Prism — a browser engine in WebAssembly
An interactive explainer for a from-scratch Rust browser engine compiled to wasm. The real engine — taffy layout, tiny-skia paint — runs live in the page.
jot.skorfmann.com/prism-rendererThe Bremen Town Musicians
How a Grimm fairy tale becomes an AI-animated children's video — characters, voices, and moving scenes, with the challenges honestly documented.
jot.skorfmann.com/bremer-stadtmusikantenRMS Titanic — the sinking in 3D
The night of April 14–15, 1912, reconstructed as an interactive 3D scene you can scrub through hour by hour.
jot.skorfmann.com/titanicMath Quest — platformer adventure
A playable platformer that drills arithmetic. Generated, pushed, shared — no app store, no hosting setup.
jot.skorfmann.com/math-questLooking for design partners.
If your team is using agents to generate reports, dashboards, prototypes, review surfaces, or small internal services, I want to work with you directly and shape Jot around real workflows.