Privacy
Where your notes live, and what leaves the machine. Reviewed 2026-09-12.
Your notes are files
Every note is a Markdown file in your notes folder, ~/Writ unless you moved it.
Settings → Notes shows the path. Writ writes nothing into that folder except the notes
themselves. Anything you pipe into the writ command becomes a note there like any other.
Writ's own data is in ~/.writ. writ.db holds the search index, the links, tags
and properties read from your files, tab order and window state. It holds no copy of a note's text; delete
it and you lose no note. config.toml holds your settings. logs/ records what the
app did and the paths it opened, not the text inside them; logs rotate daily and are not deleted on a
schedule.
Two things in that folder do hold text. Earlier versions of your notes, kept each time a note is saved, for thirty days and up to two hundred versions per note, so that a bad edit or a program's write can be undone. A note over 2 MB is not versioned. And text you have typed that has not yet reached its file is held in a recovery record until the write lands. Neither is written into the notes folder, so a sync client never carries them.
What the app does on the network
With rewriting, chat and connected programs off, which is the default, the app makes one kind of outbound
request: it fetches a static release manifest from GitHub and compares your platform and version on your
machine. That happens on its own shortly after launch, no more than once a day, and whenever it is asked for in
Settings → Updates. The request carries nothing about you beyond what any HTTP request
carries. Turn the automatic one 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 and makes no requests. The preview pane runs under a
fixed content-security-policy (default-src 'none') in an isolated origin, so rendered HTML makes
no network calls. Writ sends no crash reports, usage data, or telemetry.
Rewriting text
Writ can rewrite a selection through the AI connection in Settings → AI. It is off by
default. The default provider is a local Ollama server at http://localhost:11434/v1, which keeps
the request on your machine; LM Studio is the other local choice, and neither needs a key.
Point it at a hosted provider and Writ asks once, naming the host, before it sends that host anything: the
text you rewrite, or the check that the endpoint is reachable. The answer is recorded for that host alone, so
agreeing to one provider does not cover another or a hand-edited URL. The request body carries the text being
rewritten, the instruction for the action you picked, and the model id. With nothing selected, Writ asks
before sending the whole note instead. An endpoint that is neither local nor https is refused
before any bytes leave.
While the feature is on, Writ checks whether the host is reachable by requesting its model list, from Settings and from the Rewrite menu in the status bar. That request carries your API key and no document text, and it is not sent to a hosted host you have not agreed to. Opening the AI section also asks the two local runtimes, on this machine only, whether they are running; that request carries nothing.
Chat
The chat pane is off by default; turn it on in Settings → AI. A request carries the notes
you attached, the conversation so far, and the model id, to the provider the connection names. Nothing else
in the folder is read for it. The pane lists what is attached, and attaching a note is your action, whether
the pane attached the open note when you opened it or you typed @. The same per-host consent
applies: Writ asks once, naming the host, before the first send. Conversations are saved as files under
Writ's data folder, one per chat, holding your messages, the replies and the names and sizes of attached
notes; never a note's text and never a key.
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 that in your keychain. No port is open at any other time.
The pane never writes a note. When it proposes an edit, you read the proposal beside the note's current text and apply it yourself. There is no setting that applies proposals on their own. A note that changed after the proposal was made is not overwritten; the proposal is refused and the text lands beside the note as a conflict copy.
Connected programs
Writ ships an MCP server, writ mcp, so a program you choose can work with your notes.
It is off by default; turn it on in Settings → Connected programs, which also shows the
command to give the program. The program starts the server itself and speaks to it over that process's own
input and output. Writ opens no port, and the server makes no network request of any kind. Where that program
sends what it reads is that program's business and its own consent prompt.
Turning the server on approves nobody. The first call from a program 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 by editing config.toml, and takes effect on the next call.
With reading approved, a program can list, search and read notes, and read a note's links, backlinks, properties and tags. With writing approved, it can write, create and rename a note. No tool deletes or trashes one. A write that would overwrite a newer file is refused and the program's text lands beside the note as a conflict copy. A file outside the notes folder is out of reach.
The activity list
Every call from a program, whether it was allowed, refused or left waiting, and every chat proposal, whether
you applied or discarded it, is appended to activity.jsonl in ~/.writ. A record
names the program, the tool, the note and the decision, never the text. The file stays on your disk, is
capped at 5 MB with one older generation kept, and shows in
Settings → Connected programs → Recent activity.
Keys
On macOS and Windows an API key, for rewriting or for chat, is stored in the system keychain under the
service com.writ.ai. On other platforms it is held in memory for the session and is gone on
restart. It 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. It self-hosts its one font. It counts page views with a self-hosted Umami instance at stats.ibrahemid.com, which stores no IP addresses and shares nothing with third parties. It sets no cookies and does not embed third-party widgets.
Backup and deletion
Back up the notes folder; it is the notes. ~/.writ holds settings, the index and earlier
versions, and can be rebuilt from the folder apart from the versions.
Delete ~/.writ to return the app to a fresh install. The notes folder and any file you opened
elsewhere on disk are untouched. An API key is not in that directory: clear it from
Settings → AI, or from your keychain.
Source of truth
Everything above is in the repository:
github.com/ibrahemid/writ,
with the decisions behind it in docs/adr/031 and the checks in docs/threat-model.md.
If you find a network call this page does not describe, file an issue and it will be treated as a bug.