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
Experimental

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" });
Jot analytics dashboard showing traffic for every deploy
analytics — one HTML file on a private slug, reading the server's own usage counters. Sample data.

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.

Looking 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.

Email me about design partnership sebastian@korfmann.net