Runs onWrit CloudSelf-hosted
On this page
Your hardware, on the same account.
An agent is the Writ worker. Link a machine you already own with a single pairing code and it records and replays browser workflows, runs crawl shards and runs monitors — one outbound connection, no inbound ports, no public IP, happily behind NAT.
agent ▸ what it is
One worker, three jobs.
The agent is a single program you run on a machine you control. It dials out to the coordinator and waits for work; nothing dials in to it.
| Records and replays workflows | A real browser on your machine, on your own logged-in accounts. |
| Runs crawl shards | A distributed crawl splits across the machines you have linked. |
| Runs monitors | Scheduled checks execute on your hardware, on your schedule. |
It can use your own AI provider key — OpenAI, Anthropic, Gemini, any OpenAI-compatible endpoint, or Ollama. Work done on your key is not billed as managed AI, and the key stays on the machine.
link ▸ two commands
Link a machine.
Two steps: mint a code in the dashboard, then run one line on the machine. You never paste a token into a shell, so nothing long-lived ever lands in your shell history.
1 · Mint a pairing code
In the app: Fleet → Connect a new agent. Over the API: POST /api/user-recorder/pair-code, which answers with the code, how long it lasts, ready-made install commands per platform, and the coordinator URL the machine should dial.
pair-code.sh
curl -X POST https://api.usewrit.app/api/user-recorder/pair-code \
-H "Authorization: Bearer $WRIT_API_KEY" response
{
"code": "WRIT-4K2P-9XQ",
"expires_in": 900,
"install_commands": {
"windows": "& ([scriptblock]::Create((irm https://api.usewrit.app/agent.ps1))) WRIT-4K2P-9XQ",
"macos": "curl -fsSL https://api.usewrit.app/agent.sh | sh -s -- WRIT-4K2P-9XQ",
"linux": "curl -fsSL https://api.usewrit.app/agent.sh | sh -s -- WRIT-4K2P-9XQ"
},
"coordinator_url": "https://api.usewrit.app"
} | Property | Value |
|---|---|
| Format | WRIT-4K2P-9XQ — four characters, then three, with no look-alike letters. |
| Uses | Single-use — spent the moment it is redeemed. |
| Lifetime | Expires in 15 minutes. |
| Redemption rate limit | 20 attempts per hour, per IP. |
2 · Run one line on the machine
Paste your own code in place of the sample. The installer fetches the agent, trades the code for its credentials, and connects:
macOS / Linux
curl -fsSL https://api.usewrit.app/agent.sh | sh -s -- WRIT-4K2P-9XQ Windows
& ([scriptblock]::Create((irm https://api.usewrit.app/agent.ps1))) WRIT-4K2P-9XQ Download without enrolling
Append --download-only to fetch the binary and stop — useful for imaging a machine, reviewing what you are about to run, or preparing a host that will be enrolled later. The Windows installer takes a pairing code positionally and has no equivalent flag.
macOS / Linux
curl -fsSL https://api.usewrit.app/agent.sh | sh -s -- --download-only If you are already at your plan’s machine limit, minting refuses with 402 and tells you how many are connected. Disconnect one, or move up a plan.
limits ▸ per plan
How many machines, how many doors.
Two different caps, often confused. Linked machines is how many of your own computers can be attached at once. Published endpoints and MCP tools is how many doors you can open onto them.
| Plan | Linked machines | Published endpoints · MCP tools |
|---|---|---|
| Free | 1 | 2 · 2 |
| Starter | 1 | 5 · 5 |
| Pro | 1 | 15 · 15 |
| Growth | 5 | 40 · 40 |
| Scale | 20 | 100 · 100 |
| Enterprise | Unlimited | Unlimited |
Writ Desktop on your own computer is a different thing again: it is never counted or capped here, and its local runs are free on every plan.
fleet ▸ the surface
See and manage what you linked.
Everything the Fleet page does is available over the API, under /api/user-recorder:
| Call | What it does |
|---|---|
GET /agents | List your machines and their live state. |
PATCH /agents/{agent_id} | Rename one. |
DELETE /agents/{agent_id} | Disconnect one. |
GET /capability | What this plan allows right now (below). |
GET /byo-ai · PUT /byo-ai | Read or set the AI provider config your agents use. |
What the capability call tells you
One call, so a wizard can pick a target and explain a gate instead of failing with a cryptic connection error:
cloud_recording_allowed | Whether recording can run in the cloud at all on this plan. |
cloud_quota_limit · cloud_quota_used · cloud_quota_remaining | The monthly cloud recording quota and what is left of it. |
requires_local_agent_when_exhausted | Whether a linked machine becomes required once that quota is spent. |
max_user_recorders | The machine limit for this plan. |
online_local_agents | How many of your machines are online right now. |
A machine counts as online when it holds a live connection, or when its last heartbeat arrived inside the last 2 minutes. Each row also carries its name, platform, device name, capabilities, status, active vs maximum sessions, and which AI provider it is using.
dispatch ▸ where work lands
Where the work actually runs.
Two paths, and they are billed differently:
| Cloud-dispatched | A run started in the cloud goes out to your fleet and executes on one of your machines. |
| Locally started | A linked machine can run a marketplace install itself, under an authorize → execute → finalize contract. |
In the local path the billing decision always stays server-side — the machine asks, the server decides, and the machine reports back what happened. A local run carries no compute charge on any plan, however it was started.
uplink ▸ the shape
Uplink: a call reaching a machine with no open ports.
“Uplink” is the name for this shape, not a separate product and not an API you call. It describes what happens when someone calls a published endpoint whose workflow belongs on your machine.
- 1 · Your agent holds an outbound connection — It dialled the coordinator; the coordinator never dials it.
- 2 · A call arrives at your published endpoint — An ordinary HTTPS request from your own code, a partner, or an MCP client.
- 3 · The call is handed down the connection you already have — No new socket is opened towards you.
- 4 · The workflow runs on your machine — And the result travels back the same way.
No inbound port, no firewall exception, no public IP. The only numbers that belong to Uplink are the published-endpoint and MCP-tool caps in the table above — it has no quota, no pricing and no settings of its own.
machine ▸ what it needs
What the machine needs.
A Chromium browser driver, because the agent drives a real browser. On first browser use the agent installs it itself; you can pre-install it instead on a machine with no outbound access to the browser download, or when you would rather do it during imaging.
prepare-browser.sh
patchright install chromium
# or, if you already run Playwright on this machine:
playwright install chromium Run either patchright install chromium or playwright install chromium — whichever is already on that machine.
reference ▸ next
Keep going
Desktop, your own machines, or a server you own.
→ Self-hostingRun the coordinator yourself, with Docker.
→ Managed endpoints/v1/{slug}/{path} — the doors a call comes through.
→ MCPThe same workflows as tools for any MCP client.
→ MonitorsScheduled checks that run on your fleet.
→ BillingWhat is metered, and what never is.
→faq
Fleet questions, answered.
Do I have to open a port or give the machine a public IP?
How long does a pairing code last, and can I reuse it?
What happens if I am already at my machine limit?
Does running on my own machine cost credits?
Can the agent use my own AI provider key?
Why does a machine show as offline when it is running?
end ▸ connect
Link the first machine.
Mint a code, run one line, and the machine is part of your fleet before the code expires.