Documentation
Doclet runs small web apps and decides who can open them. This page is everything you need.
Quickstart
npm install -g doclet-clidoclet logindoclet deploydoclet login opens your browser to approve the CLI. doclet deploy packs the current folder, uploads it, installs dependencies and starts it, then prints the URL. The first deploy creates the app, named after the folder; later deploys update it.
What you can deploy
Doclet picks how to run your folder by looking for, in order:
- a
startcommand indoclet.json - a
startscript inpackage.json(dependencies are installed, andnpm run buildruns first if you have one) server.js,index.jsorindex.ts- an
index.html— served as a static site
node_modules, .git and .env files are never uploaded. Your .gitignore is respected; add a .docletignore for anything else.
How your app runs
Your app is a normal process. Doclet gives it:
PORT— listen here, on all interfacesDATA_DIR— a persistent directory. SQLite files and uploads written here survive restarts, sleeps and redeploys. Everything else on disk is rebuilt on each deploy.- Node 22, which includes the built-in
node:sqlitemodule.
Apps sleep when idle and wake on the next request, so the first visit after a quiet spell takes a few seconds. Keep in-memory state to things you can rebuild.
Knowing who's visiting
Visitors are signed in before a request reaches your app, and the edge adds these headers. Any copies a client sends are discarded, so you can trust them.
x-doclet-user-email maya@acme.co x-doclet-user-id stable id for this person x-doclet-user-name URL-encoded display name, if they've set one
On a public app visitors are anonymous and these headers are absent.
Sharing
New apps are private. People who can always open an app: its creator, and workspace owners and admins. Everyone else needs one of:
- Shared by email — they sign in with that address (a one-time code or Google/GitHub).
- Workspace — every member of the workspace.
- Public — anyone with the link, no sign-in.
doclet share maya@acme.co dev@acme.co doclet share --workspace-wide doclet share --public doclet unshare maya@acme.co
Removing access takes effect within seconds, including for people who already have the app open.
Members vs viewers. Members belong to your workspace — they create and deploy apps, and they're what your plan is priced on. A viewer is anyone an app is shared with who isn't a member: a client, a contractor, a teammate in another company. Viewers are free, and there's no limit to how many you can share an app with.
Environment variables
doclet env set API_KEY=sk-live-... GREETING=hello --redeploy doclet env list doclet env unset API_KEY
Values are write-only: they can be replaced but not read back. They apply the next time the app starts, which --redeploy does immediately. Names Doclet owns (PORT, DATA_DIR, DOCLET_*) can't be overridden.
CLI reference
doclet login / logout / whoamiManage the CLI's sign-indoclet deploy [dir] [-m note]Upload and start the appdoclet listApps in the workspacedoclet statusState, URL, sharing, variablesdoclet openOpen the app in a browserdoclet share / unshareControl who can open itdoclet env set|unset|listEnvironment variablesdoclet pause / resumeTake it offline without deletingdoclet deleteRemove the app and its dataEvery command accepts --workspace and --app. After the first deploy the folder remembers its app in .doclet/project.json.
Deploying from CI
Create a token under Account → Access tokens (optionally limited to one workspace), store it as a secret, and:
DOCLET_TOKEN=dl_... doclet deploy --workspace acme --app invoices -m "$GITHUB_SHA"
Limits
Plans are priced per member — Pro is $10 per member a month, Team is $15 — and your allowances grow with every member you add. Pro and Team have no limit on the number of apps; what's metered is usage. A Pro workspace gets 250K requests and 25 GB of bandwidth per member each month, so ten members get 2.5M requests and 250 GB. The Free plan is a flat allowance for up to 3 members: 5 apps, 100K requests and 5 GB of bandwidth a month.
Storage per app and upload size are fixed by plan. When a workspace reaches its monthly requests or bandwidth, visitors see a "limit reached" page until the 1st (UTC) or until you add members or upgrade. Past 50 members, workspaces move to a custom plan — email hello@doclet.cloud. Usage is on the workspace's Usage page.