addedlinks between notes. [[Name]] completes from the notes in the folder, opens the target on Cmd+click or Enter, offers to create a note that does not exist yet, and asks which note is meant when a name fits two. A Markdown link to a .md file resolves the same way. Renaming a note offers to rewrite the links that point at it, says how many before the rename, and lists any file it could not change.
addedthe index. Links, frontmatter properties, tags and headings are read from every note in the folder and follow files that change inside or outside Writ. The writ command answers from the same index with links, backlinks, properties and tags, gains new, rename and trash, and prints --json on request.
addedConnections, a panel beside the note (Cmd+Shift+\): the notes that link here with the sentence each link sits in, the outline of headings, and the note's properties.
addedtags in the sidebar with counts. Nested tags group under their parent, and selecting a tag filters the notes list. A colour in pasted CSS and an anchor in pasted HTML are not read as tags.
addeda graph of the notes around the open one, and a Graph view over the whole folder with search and one colour per top-level folder. Positions hold from one opening to the next.
addedinline Markdown. A Markdown file opens with headings at heading sizes, bold, italic, strikethrough and inline code styled, links with the address hidden, images under their line, task lists as checkboxes and fenced code highlighted in its language; the line being edited shows its markup. An Inline | Source switch in the status bar shows the raw text, and Settings, Preview sets which one a Markdown file opens in. Split and Preview stay for HTML and Mermaid files.
addedthe status bar shows the fields that fit the file type. Word, character and token counts sit behind a switch in Settings, Editor.
addeda folder written in Obsidian opens as it is. Links by name, path, alias and heading, properties, tags and callouts carry over, and .obsidian and .trash contribute nothing.
addeda default format for new files. [files] default_extension is txt or md, and a new file (Cmd+N), Today's File, piped input to the writ command, writ new and a file a connected program creates all take it. The setup screen asks for it as its first step, and Settings, Files, Default format changes it later. The folder is ~/Writ, and one line under the cursor says where it is.
addeda file nobody named is called writ-<yymmdd>-<hhmm>, with -2 for a second one in the same minute. A name that ends in .md, .markdown, .txt or .text sets the format, on a file named in the app and on a rename. Tabs, the file list and the palette hide .md and .txt; other extensions stay visible.
addedan Apps section in Settings with one switch each for Chat, Rewrite, Connected programs, Connections, Graph and Tags. A fresh config has all six off; a config written before this keeps what it had, and a tags section hidden in the sidebar becomes Tags switched off. An app that is off has no menu item, palette command, shortcut, sidebar section or panel, and turning one on or off takes effect without a restart. Turning one off deletes nothing.
addedan Apps step after the format step in the setup screen lists the six apps with a switch each. Settings, Apps opens the same screen later.
addedone menu bar on macOS, Windows and Linux from a single command list, with Show Notes Folder, Recently Closed and Open Graph. The window hotkey can be changed in Settings; Save asks the OS first and reports the chord it actually holds.
addedinterface text size in Settings, 12 to 22 px, scaling the sidebar, tabs, status bar, palette and settings together. The editor's own zoom stays separate.
addeda light default that follows the system, with six accents (pine is the default) and the terminal presets kept as choices. The status bar is on by default. Sidebar, toolbar, tabs, palette, settings and dialogs are redrawn to one design, with the title bar drawn per platform.
addedsave state per note: the status bar says saved only while the text matches the file, and a save that fails shows a bar under the note with the cause in a plain sentence.
addedan MCP server, writ mcp, that another program starts over stdio. Reads: list, search, read, links, backlinks, properties, tags. Writes, under a separate permission: write, create and rename. It is off until enabled, and every client is refused until it is approved in Settings. It refuses a write that would overwrite a newer file when the client passes the hash it read. Nothing in it deletes a note. It opens no port and makes no request of its own.
addedConnected programs in Settings, with read and write switches per client and a Forget control, and an Activity panel listing every call: time, client, tool, note, decision and byte count. The log holds no note text, prompts, replies or keys.
addeda chat pane, off by default, on Cmd+Shift+A and in the View menu. It opens beside the note with that note attached, and @ in the message attaches any other note. Only attached notes are sent; the send dialog names the host and the bytes first. Replies render as Markdown with a copy button on each code block, and a thinking state shows before the first word. A proposed edit shows as a line diff with Apply and Discard, never as two full texts; a note that changed since the proposal refuses the apply and leaves a conflict copy.
addedconversations are kept. Each chat is a file under the data folder, saved after every message, and the pane lists them by recency, reopens the last one, and can rename or delete one. The file holds no key and no note text. Stop ends a reply and keeps what arrived, Retry resends after an error, editing an earlier message resends from there, and the message box has a model picker for chat alone.
addedone AI connection. Settings, AI holds one provider, one key and one model, and rewriting and chat both use it. On this machine: Ollama and LM Studio, found when they are running, no key needed. With a key: Anthropic, OpenAI, Google Gemini, OpenRouter, Groq, DeepSeek, Mistral, xAI, Together and Fireworks, each with a link to where its key is issued. Any other OpenAI-compatible endpoint by URL. The model list is fetched from the provider, and Check reports whether the host answers without showing its error text.
addedOpenRouter can connect from a button. The browser opens, you approve, and the key lands in the keychain. Writ listens on this machine for that one answer and on nothing at any other time.
changedthe app icon takes the accent the app opens with: the W is now pine on the same dark tile, in the dock, the taskbar, the site and the share image.
changedwhen a note's file changes outside Writ, a clean tab takes the new text in one undoable step that keeps the cursor and scroll. A tab with unsaved edits shows a bar with three choices, and whichever side is not kept is written beside the note before anything is replaced. Files opened from outside the notes folder are watched the same way.
changeda note keeps its tab when its file is moved, renamed or rewritten by another program. A note iCloud has not brought down yet opens on a download state naming the service instead of blocking the app.
changeda save keeps the file's Finder tags, creation date, permissions and line endings, and saving unchanged text no longer rewrites the file.
changedevery write to a note, from the editor, the writ command, a rename, a link rewrite, a connected program or a chat proposal, goes through one guarded path that refuses to overwrite a newer file and leaves a conflict copy.
changedsync clients' temp files and stubs never show up as notes. Conflict copies from Syncthing and Writ's own conflict files are listed and marked in the file tree.
changedsidebar sections fold on their heading and stay folded across launches, and Settings has a switch to hide each one. A nested tag is listed once, under its parent, by its last segment; selecting the parent lists the notes under it too. The sidebar no longer repeats the open notes; the tabs are that list.
changedSettings rows are named in plain words and grouped by what people look for: Notes folder first, the data folder, watched folder and preview limits under Advanced. The sidebar search field says what it searches, and the history section is Recently closed.
changedDelete Line moves to Cmd+Shift+K and Replace to Cmd+Option+F, freeing the chords macOS claims. Cmd+Option+S joins Cmd+\ for the sidebar. The preview split swap is Cmd+Shift+H.
changedchoosing a light or dark preset pins that side; the System option in Settings is the way back to following the OS.
changedthe settings section "AI rewriting" is replaced by one AI connection under Settings, Apps, shown while Chat or Rewrite is on. An existing rewrite or chat setup carries over, and a key that either feature stored now serves both.
changedrewriting speaks to Anthropic as well as to OpenAI-compatible hosts, so every provider serves both features.
fixeda launch could leave Writ running with no window on screen and a dock icon that did nothing. One place in Rust now shows the window, a dock click brings back a window that is hidden, and a show that fails says so in the log.
fixedname search ranked the whole absolute path, so a query could match the folders above the notes root. Ranking now runs over the path relative to the notes folder.
fixedon Windows a save that landed while another program held the file open failed with a permission error. It now retries and names the real cause.
fixeda database that lost its index tables is rebuilt on launch instead of failing every launch.
fixedfrontmatter tags: lines, including comma-separated ones, and the tag: key reach the index. Tag names are filed lowercased, so #Project and #project are one tag.
fixeda link rewrite that lost a race against an outside edit refused without leaving the losing side on disk. It now leaves a conflict copy like every other refusal.
fixedthe theme store wrote eleven dead properties to the page on every boot, one of them as [object Object].
fixeda rewrite whose provider returned an error ended the stream silently. The error is now shown.
fixedthe [[ completion stays installed across file type switches, so switching from a Markdown tab to a plain-text tab within 100 ms of typing no longer throws.
fixedswitching a Markdown file from Inline to Source keeps the caret line in view.
v0.4.0: Notes on disk
addednotes live as Markdown files in a notes folder (~/Writ by default); the first launch moves existing notes there and keeps a rollback copy of the database for ten launches.
addedNew note creates a dated .md file at once; renaming a tab renames the file, Delete moves it to the Trash, Save a Copy writes an opened file into the folder.
addeda Notes section in Settings: the folder's path, Show in Finder, Copy path and Move, which takes every note along.
addedopen a note by name with Cmd+Shift+O.
addedthe notes folder is watched and indexed, so search follows files that change outside Writ.
addedthe writ command writes piped input as a note in the notes folder.
addedWrit refuses to start with its data folder inside iCloud Drive, Dropbox, Google Drive, OneDrive or a Syncthing folder, and says where to point WRIT_DATA_DIR.
changeda save that would overwrite a newer file on disk is refused and the unsaved text is written beside the note as a dated conflict copy.
changedYAML frontmatter is hidden in the preview and round-trips on save.
changedautosave waits one second after the last keystroke; losing focus, hiding the window or quitting writes at once.
fixedquitting inside the autosave window no longer drops the last second of typing.
fixedsaving a/index.md no longer hides a real change to b/index.md.
removedthe private copies of notes Writ kept under its data folder; every note is its file.
v0.3.5
added.sql files highlight; the language was detected and named in the status bar, but no grammar was registered.
changedfailures that only reached the developer console now say so in the app: a config that will not read, a settings write that fails, a file that will not open, a palette section whose search throws.
changeda workspace search that fails reports as failed instead of as no matches.
fixedshowing the sidebar keeps the caret in the editor, and a collapsed sidebar takes no clicks or focus.
fixedEscape closes a dialog after a click inside it.
fixedcontext menus close on Escape or on typing, and use the readable foreground colour.
fixedthe status bar drops fields as the window narrows instead of clipping them.
fixedmermaid diagrams follow the document's light or dark theme, and an HTML preview without its own styles follows the light theme.
fixedthe sidebar toggle in a fresh config defaults to Cmd+\.
fixedthe inbox header no longer reads "Inbox ยท Inbox".
fixedthe AI connection row in Settings hides while a search filters to other sections.
v0.3.4
fixedthe database no longer grows without limit: recovery snapshots write only on change, and a bloated database is compacted once at startup.
fixeda save that fails keeps the text queued and retries; closing the tab asks before discarding it, and the message names the file and the reason.
v0.3.3
fixededits to a file opened from disk save back to that file; since 0.3.0 they only reached Writ's internal copy.
fixeda saved file keeps its permissions, and a file whose contents changed on disk reloads when reopened.
changedCmd+S saves the active tab right away; the sidebar toggle moves to Cmd+\.
v0.3.2
addedArabic and right-to-left writing: each editor line takes its direction from its first strong character, so Arabic reads right-to-left and Latin left-to-right in the same document.
addedpreview paragraphs, headings, lists, and tables resolve their direction the same way; code blocks stay left-to-right.
addedArabic text renders in the platform's Arabic fonts instead of fallback glyphs.
v0.3.1
addeda Writ menu on the Windows and Linux titlebar: open file, new tab, close tab, the command palette, and the update check, each with its shortcut.
addedWindows 11 snap layouts open from the maximize button.
changedthe Windows window controls follow the Windows 11 caption treatment, and the maximize button shows restore while the window is maximized.
changedthe command palette is wider with a larger input and sizes to its results; modal shadows lighten across the app.
fixedpressing the icon inside a titlebar button clicks the button instead of dragging the window.
fixedclosing the command palette no longer leaves a focus ring on the active tab.
fixedon Windows, the window no longer grows across launches or reopens larger than the screen, and a window closed maximized reopens maximized on the same monitor.
v0.3.0
addedsearch everywhere on Cmd+Shift+F: one palette over commands, settings, and every note, open or from history. with a workspace folder open it also matches file names and greps file contents, streaming results as you type. prefixes route the query: > commands, # content, : go to line.
addedCmd+click (Ctrl elsewhere) opens http, https, and mailto links from the editor; a relative link that resolves inside the workspace opens in Writ. a link clicked in the preview names its host and asks before opening.
addeda Writ context menu in the editor: spelling corrections on a flagged word, link actions, clipboard verbs, rewrite actions on a selection, and a workspace search seeded with it.
addedspelling corrections in place: double-click a flagged word to pick a suggestion or add that word to the dictionary.
addedthird-party licences readable from Settings.
addeda startup failure shows a dialog and writes a report file before the app exits, instead of exiting silently.
changedrequires macOS 12 or later. on macOS 11 or earlier stay on 0.2.0: this build will not launch there.
changedthe macOS installer is signed and notarized end to end, so Gatekeeper opens it without a warning.
changedthe Linux install script verifies its download against the published checksums and installs the CLI as the writ command.
fixeddeb installs update themselves: the update feed serves the signed deb instead of an AppImage the package manager rejects.
fixedchecking that a hosted rewrite endpoint is reachable asks for the same per-host consent as rewriting before the API key is sent.
fixedwrit file.rs opens Writ on Linux and Windows instead of the system default editor, and /usr/bin/writ on the AUR package is the CLI, so piping works.
fixedwrit --version reports the installed version; it printed 0.1.0 on every release since the CLI landed.
v0.2.0
addedlocal spell check: wavy underlines on likely misspellings, with fix all and a per-word preview from the status bar. off by default, and code, URLs, and links stay unflagged.
addedrewrite a selection to proofread, rephrase, or polish it, streamed into a side-by-side view you approve before it applies. off until you turn it on, with a local model by default or a hosted provider whose key stays in the OS keychain.
addedline operations: duplicate, delete, move, and join lines, select a line, insert one above or below, select the next occurrence, and add a cursor above or below.
addedinstalls from the Homebrew tap and the winget package.
changedCmd+E deletes a line; toggling inline code moves to Cmd+Shift+E.
changededitor shortcuts fire only while the editor has focus, instead of from any focused text field.
changededitor commands appear in the command palette and can be rebound in the shortcut editor.
changedtext transforms carry plain labels and a sentence describing what each one does.
fixeda file created in the same moment the watched folder started being watched no longer goes unnoticed.
fixedthe writ command no longer reports itself installed when its link points at an app bundle that moved or was deleted.
fixedthe AUR package installs its launcher entry and icons.
v0.1.0: first release
addedsplit-pane live preview renders Markdown, HTML, Mermaid diagrams, and KaTeX math from bundled offline runtimes, with source and preview scroll in sync and find inside the preview.
addedglobal hotkey brings the window up over anything: Cmd+Shift+Space on macOS, Ctrl+Shift+Space on Linux and Windows.
addedtabbed CodeMirror 6 editor with language detection by extension and file content, live Markdown typography, and reopen-closed recovery.
addedfind and replace overlay with a live match count.
addedfull-text search across every note, with a results panel showing snippets and line numbers, backed by SQLite FTS5.
addedcommand palette on double-tap Shift.
addedsettings window on Cmd+, with searchable settings and configurable shortcuts.
addededitor and preview font zoom.
addedstatus bar with language, encoding, and cursor position.
addedprompt fill modal with placeholder variables, a live token estimate, and copy as prompt.
addedtext transforms: tidy whitespace, plus composable passes for trailing spaces, final newline, and punctuation spacing.
addedopen a folder as a workspace with a sidebar file tree; a watched folder lists new files and opens them as they arrive.
addedlarge files open in a mode that keeps them responsive, and binary files open in a hex view.
addedwrit command-line tool for opening files from the terminal; set Writ as the default app on macOS for Markdown, plain text, config, and source files.
addedapp-wide light and dark themes, autosave with crash recovery, and self-update with signed manifests.
addedbuilds for macOS, Windows, and Linux: .dmg, .msi, .deb, and AppImage.