Runs onDesktop
On this page
The whole engine, on your computer.
Writ runs callable web-action workflows and monitors entirely on your machine. The engine is bundled as a loopback-only sidecar; nothing leaves your computer unless you explicitly link a cloud account.
install ▸ platforms
Install it.
One app per platform, each carrying the engine inside it. Pick the format your machine expects; the download page offers the right one by default.
| Platform | Installer | Builds |
|---|---|---|
| macOS | .dmg · .app | arm64 · x86_64 — macOS 11.0 or later |
| Windows | .msi · NSIS installer | x86_64 — installed per-machine |
| Linux | .deb · AppImage | x86_64 · aarch64 |
Downloads live on the Writ Desktop page — this page never links a build directly, so a stale docs link can never hand you the wrong one.
record ▸ edit ▸ run
Record once, replay forever.
You drive a real browser and the app writes the workflow down as you go. Nothing is inferred from a screenshot after the fact — every action you take lands as a step you can open and edit.
| Every action becomes an editable step | Clicks, typing, navigation, waits and extractions are captured as an ordered list you can reorder, retime or delete. |
| The AI assistant sits inside the recorder | It can read the live page and write the extractor for you, so you point at what you want instead of hand-writing a selector. |
| Assist mode asks first | Before anything that changes the page — a click, a submit, a purchase step — the assistant stops and waits for you. |
| Runs, schedules and monitors stay local | The same workflow runs on a schedule or as a monitor without a round trip to anyone else’s server. |
A local run carries no compute charge on any plan, however you start it — from the app, from a schedule, from an SDK, or from an MCP client.
mcp ▸ local server
Your workflows as tools, on localhost.
The desktop registers an MCP server named writ. That name is deliberate: a self-hosted coordinator registers as writ-selfhost and Writ Cloud as writ-cloud, so all three can sit in the same client config at once without colliding.
One-click install
The app’s Connect page writes the server into the client’s own config file for claude_code, claude_desktop, codex, cursor, windsurf and vscode. You can also paste the config yourself:
connect.sh
# The app's Connect page prints this with the absolute path to the
# bundled engine already filled in.
claude mcp add writ -- writ-agentd mcp claude_desktop_config.json
{
"mcpServers": {
"writ": {
"command": "writ-agentd",
"args": ["mcp"]
}
}
} | Transport | What the client needs |
|---|---|
| stdio (recommended) | The client launches the bundled engine as a child process. No credential goes in the client config at all. |
| Direct HTTP | A client that speaks HTTP instead mints a run-scoped wlk_ key and sends it as a Bearer token. |
Three servers, three names
Which one you connect decides where the work runs:
| Where it runs | MCP server name |
|---|---|
| Writ Desktop (this page) | writ |
| Self-hosted coordinator | writ-selfhost |
| Writ Cloud | writ-cloud |
The local server exposes 31 tools. Two of them — writ_search_api and writ_install_api, which reach the marketplace — appear only once you link a cloud account. On top of those you get one run_<name> tool for every workflow you choose to expose.
locks ▸ two different things
App lock is not persona 2FA.
These get confused constantly, so keep them apart: the app lock protects Writ’s own vault on this machine. Persona 2FA is the second factor for the sites you automate. Turning one on does nothing to the other.
App lock — your vault on this machine
A passphrase over the stored secrets, with an idle timeout so walking away re-locks it.
| Lock | Seals the vault immediately. |
| Unlock | Your passphrase, entered in the app. |
| Idle timeout | Re-locks after a period of no activity, in seconds. |
| Recovery codes | Issued while unlocked — a locked vault yields none. |
While the vault is locked, anything that needs a stored secret fails with 423 rather than running without it. Unlock, then run again.
Persona 2FA — the sites you automate
A persona holds one login for one site. When that site asks for a second factor, the persona answers it:
| Method | What happens at the step |
|---|---|
none | The site asks for no second factor. |
totp | The code is minted on-device at the moment the step runs, and is never logged. |
email_otp | The emailed code is collected and submitted for you. |
sms | The texted code is collected and submitted for you. |
You can validate a TOTP secret without storing it — paste it, confirm the code matches, walk away. Importing from an authenticator app works the same way. Secrets you type are never echoed back by the API.
updates ▸ three channels
Updates you can predict.
Every install sits on exactly one channel, and it only ever applies an update built for that same channel. The channel never widens by itself — a stable install does not quietly start pulling beta.
| Channel | Who it is for |
|---|---|
stable | The default. Released versions only. |
beta | Opt-in. Pre-release builds, ahead of stable. |
managed | Set by company policy, pointing at an internal update feed. |
What is checked before an update is applied
An update is verified first and applied second. Rollout is staged, so a release reaches machines in waves rather than all at once.
| Signature | The release must be signed by a key this build accepts. |
| Channel | The release channel must equal this install’s channel. |
| Expiry | A stale or replayed release is refused. |
| Downgrade protection | An older version cannot be pushed over a newer one. |
| Minimum supported version | A release can require a floor before it will install. |
| Checksum | The downloaded bytes must match the digest the release was approved with. |
The same checks run with no network at all, so an update applied from a file on a locked-down or air-gapped machine is verified exactly as strictly. A managed policy can pin the channel or the update feed, and is not user-overridable.
reference ▸ next
Keep going
Record and run your first workflow.
→ Where it runsDesktop, your own machines, or a server you own.
→ Personas and secretsLogins, TOTP and warm sessions.
→ MCPThe same workflows as tools for any MCP client.
→ SDKsTypeScript, Python, Go and Rust against the local engine.
→ Notification channelsWhere an alert from a local run goes.
→faq
Desktop questions, answered.
Do I need an account to use Writ Desktop?
Do local runs cost anything?
What is the difference between the app lock and persona 2FA?
Which MCP server name does the desktop use?
Will a stable install ever pull a beta build?
Can the app update itself without network access?
end ▸ install
Put the engine on your own machine.
Record a workflow in a real browser, then run it as often as you like for nothing.