Privacy
Where your files live, and what leaves the machine. Reviewed 2026-09-24.
Your files
Writ opens any text file on your disk and edits it where it is. It also keeps a folder of its own,
~/Writ unless you moved it; Settings → Files → Folder shows the path. New
files and anything you pipe into the writ command land there, and search covers every file in it.
Writ's data folder
Writ keeps its own records in ~/.writ, which Settings → Advanced also shows. Among
them:
-
writ.dbholds the search index, which stores the text of each file in the folder so search can find it, along with the links, tags and properties read from those files, tab order and window state. It also holds a recovery snapshot of the text in your open tabs up to 5 MB each, including text you typed that had not reached its file when Writ quit. config.tomlholds your settings. It holds no API key.-
history/andhistory.dbhold earlier versions of the files in the folder, so a bad edit or a program's write can be undone. Writ keeps a version each time a file is saved, for up to 30 days or 200 versions per file, and no more than 250 MB in all. A file over 2 MB is not versioned. -
chats/holds one file per conversation: your messages, the replies, the edits a reply proposed, and the paths and sizes of attached files. It never holds an attached file's text or a key. activity.jsonllists what connected programs and chat did with your files, without their text.logs/records what the app did and the paths it opened. Logs rotate daily and are kept.
None of this is written into your folder, so a sync client never carries it.
What the app does on the network
Until you switch on Chat or Rewrite, Writ makes one kind of outbound request: it fetches a release manifest from
GitHub and compares versions on your machine. It does this on its own shortly after launch, at most once a day,
and whenever you ask in Settings → Updates. Turn the automatic check off with
Check for updates automatically. Installing an update downloads the release from GitHub and checks it
against a signing key built into the app.
Spell check runs against a dictionary bundled in the app. The preview pane runs under a fixed
content-security-policy (default-src 'none', connect-src 'none'), so rendered HTML makes
no network calls. Writ sends no crash reports, usage data or telemetry.
The AI connection
Chat and Rewrite are apps you switch on in Settings → Apps. While either is on, the same
section holds the connection they share: provider, address, API key and model. Ollama and LM Studio run on your
machine and need no key, so a request to either stays there.
Point the connection at a hosted provider and Writ asks once, naming the host, before it sends that host
anything. The answer is recorded for that host alone, so allowing one provider does not cover another or a
hand-edited address. An address that is neither on this machine nor https is refused before any
bytes leave.
To show whether the provider is reachable, Writ requests its model list. That request carries your API key and no text, and goes to a hosted provider only after you allowed it. Settings also asks Ollama and LM Studio on this machine whether they are running; that request carries nothing.
Connecting OpenRouter opens openrouter.ai in your browser. Writ listens on this machine for the one answer that browser sends back, then exchanges it for a key and stores the key like one you typed. No port is open at any other time.
Rewrite
A rewrite sends the selected text, the instruction for the action you picked, and the model id. With nothing selected, Writ asks before sending the whole file.
Chat
A chat request carries a fixed instruction, the files attached to the conversation, the conversation so far and
the model id. The pane attaches the file in front of you and shows it as a chip you can remove; you add others
with @ or by attaching a folder. Any file open in the editor can be attached, including one outside
your folder, which is sent under its parent folder and file name, never its full path. Nothing that is not
attached is read for a request.
Chat writes a file only when you choose Apply on a proposed edit, and no setting applies one for you. If the file changed after the edit was proposed, Writ refuses to apply it. For a file in your folder, the proposed text is saved beside it as a dated copy; for a file outside it, the proposed text stays in the conversation.
Connected programs
Writ ships an MCP server, writ mcp, so a program you choose can work with the files in your folder.
Connected programs is an app you switch on in Settings → Apps, which also shows the command to
give the program. The program starts the server itself and talks to it over that process's input and output.
Writ opens no port, and the server makes no network request. Where that program sends what it reads is up to
that program.
Switching the app on approves nobody. A program's first call is refused and waits in Settings until you approve
that program. Reading and writing are approved separately; approving reading never grants writing. Either can be
withdrawn in Settings or in config.toml and takes effect on the next call.
With reading approved, a program has eight tools: list the folder's Markdown files, search the folder, read a file, read a file's links, backlinks, properties and tags, and list the folder's tags. With writing approved, it has three: replace a file's text, create a file, and rename one. No tool deletes a file. A write that passes the version the program read is refused if the file changed since, and the program's text is saved beside the file. A file outside your folder is out of reach.
The activity list
Every call from a program, whether it was allowed, refused or left waiting, and every chat edit you applied or
discarded, is appended to activity.jsonl. A record names the program or chat, the tool, the file,
the decision and, for a write, a byte count, never the text. The file stays on your disk and is capped at 5 MB with one
older generation kept. While Connected programs is on, open it from
Settings → Apps → Connected programs → Recent activity.
Keys
On macOS and Windows, Writ stores an API key in the system keychain under the service com.writ.ai.
Where the keychain is unavailable, Writ holds the key in memory for the session and warns that you will enter it
again next time. A key is never written to config.toml, the database or a log.
What this site does
This site is a static export served from GitHub Pages, and it serves its own font. It counts page views with a self-hosted Umami script from stats.ibrahemid.com, which it tells to honor Do Not Track. It sets no cookies and embeds no third-party widgets.
Backup and deletion
Back up your folder and any file you keep elsewhere; the files are the only copy of your text. Writ can rebuild
the index in ~/.writ from the folder. Nothing else in ~/.writ can be rebuilt:
settings, earlier versions, conversations and the activity list.
Delete ~/.writ to return the app to a fresh install. Your folder and every file you opened elsewhere
stay untouched. An API key is not in that directory: clear it from your keychain, or from
Settings → Apps while Chat or Rewrite is on.
Source of truth
Everything above is in the repository, github.com/ibrahemid/writ, with the decisions behind it in ADR-031 and the checks in the threat model. If you find a network call this page does not describe, file an issue and it will be treated as a bug.