Changelog
Every release, newest first.
1.0.0
2026-09-21The first release other people can install: signed, notarized, and stapled, with a release.sh that does that every time. The version jumps from 0.3 to 1.0 because the app has been my daily editor for months and the surface has settled. What's below is everything since 0.3.
The chat retirement, then a long stretch on the navigator. I was never happy with the writing chat, so it's gone; the selection popover is the one AI surface now, and it picked up the parts of chat that actually earned their keep. After that the rail grew up: files open from Finder, PDFs and images sit in the tree, folders drag into folders, and Move to Trash can be undone. The preview renders Mermaid. And the design tokens moved out to a package shared with Unicron, with CI to catch a drift.
Added
- A
⋯menu on the selection toolbar. Tighten up, Reduce by a third, and Simplify join Improve and Check rules — same popover, same Apply and Copy, same voice rules. Custom edit… takes a one-line instruction ("make this punchier") and returns an applyable rewrite. - macOS Writing Tools in the
⋯menu. The system's Proofread, Rewrite, and Summarize already worked on any selection via right-click or Edit ▸ Writing Tools (macOS injects those itself, on-device and token-free). An Apple Writing Tools… row in the selection toolbar's menu now summons the same panel directly — a small Rust command sends the standardshowWritingTools:action down the responder chain. Needs macOS 15.2+; the row hides on older systems. - Opening files straight from Finder. Unigraph now declares itself a handler for
.md,.markdown, and.txt, so it shows up under Open With and can be set as the default. Double-click a file anywhere on disk and it opens, whether Unigraph was running or not, and whether or not the folder is in your library. On a cold launch the file beats the last-open-file restore. - File ▸ Open File… (
⌘O). A plain file picker for the one-off case where you don't want the folder in the library at all. Files opened this way get a breadcrumb that walks up a few levels, since there's no Location to anchor to. - An Opened section in the rail. A file you opened from Finder or
⌘Oisn't in any folder you've added, so it used to have no row anywhere — click another file and it was gone with no way back. Those files now collect in a small list above Folders, capped at eight and remembered across launches.⌘Wcloses the document but leaves the row, the way closing a tab doesn't erase history; the row's×is the deliberate "done with this one". A file drops off the list on its own once you add its folder to the library, since the tree covers it then. - PDFs in the library. They're listed and open in a viewer. Archived folders full of PDFs used to render as empty expanded folders, which looked like the tree had failed. Images and PDFs share one view-only path, so neither gets read as text, and the status bar shows the file type where a text file shows its word count.
- Mermaid diagrams in Preview. A
```mermaidfence renders as SVG instead of sitting there as code. Mermaid is bigger than the rest of the app put together, so it loads on the first diagram and never for a document without one. Diagrams come out wide, so one breaks the reading column and takes the pane, capped at 64rem. A theme flip re-renders, since Mermaid bakes its colors into the SVG. A diagram that won't parse falls back to its source with the parser's message above it. Print waits for diagrams to finish before opening the dialog. - Undo for Move to Trash. A snackbar, ported from Unicron, gives you 15 seconds and
⌘Zto take it back, and reopens the file if it was the one on screen. Thetrashcrate throws away where a file landed, so the macOS path goes through Finder directly, which returns the item's new location. - Drag files and folders between folders. Any row in the tree drags into any folder in the same Location, including the Location header for moving back to the root. It's a pointer drag with a Finder-style chip rather than native HTML5 drag and drop, because macOS stamps a green copy badge on native drags before the page gets any say. Moving a folder rebases the open file, the selected folder, and the expanded set, so a moved folder arrives still open the way you left it. A folder dropped on itself or into its own descendant is refused before it can become a target.
- Right-click a Location header for New File, New Folder, and Reveal in Finder. Rename and Move to Trash stay off the header on purpose, since doing either to a library root from the rail is a much scarier thing than doing it to a nested row; the header's
×already covers "get this out of my sidebar." - A resizable rail, 200 to 520px. Double-click the handle to reset.
- Appearance in Settings. A Light / Dark / System pane, matching the View ▸ Appearance menu that already had it. The
Themetype lived in three files; it lives in one now. .mdxopens as text. It edits like markdown. Preview goes through react-markdown, which knows nothing about JSX, so components and imports show as literal text.- Opus 5 offered, and the default. Same price as 4.8 with better judgment.
- Token usage in the status bar after each suggestion. Mostly there to prove the prompt cache is being hit.
- Hanging indent for wrapped list lines. A view plugin measures each item's prefix on a canvas and hangs the continuation lines by that width, so a long bullet or task reads as one block instead of the second line snapping back under the marker.
- Autosave flushes on blur, hide, and window close. The 600ms debounce could outrun a
⌘Tabor a red-button close. A failed write cancels the close and says so.⌘Qstill doesn't flush; it's in the roadmap.
Changed
- Files open in Preview. At launch and on every file switch, since reading is the default posture. A new file still lands in Edit, because you create a page to write in it.
- The dark toolbar is glass. Dark-mode buttons read the way Pages does them: a fill that barely lifts off the bar and a top-lit hairline rim, not a filled chip with a drop shadow. Light keeps its raised white pills, which is also what Pages does. Hover and selected settled on one gray so a hovered button can never look more chosen than a selected one.
- Locations and their top-level folders are accordions. Opening one closes its siblings; a closed folder remembers what it had open inside.
- Full filenames, extensions included, in the title bar, its path menu, the tree, the Opened list, and the drag chip.
- The
+controls got re-scoped. The old top-bar menu targeted the open file's parent, so a file created "in" a rail folder never landed there. The top-bar button now only adds a folder to the library, and each top-level folder in the rail gets a hover+that aims New File / New Folder at that folder. - Failures go to a toast, not the status bar. A refused move used to be a muted line bottom-left that faded in 2.5 seconds, and I missed it every time. The status bar reports state; an action that didn't happen isn't state. Those now use the bottom-center pill the undo snackbar already had, with a hint line that says the way out, six seconds, and the whole pill is a dismiss target. Settings, keychain, and both trash paths moved over with it.
- Design tokens come from
@konigi/tokens. Colour, elevation, radii, and the raised controls (.tb-btn, the segmented control) are the package Unicron shares, pinned to a tag. Unigraph's 38 tokens were a strict subset, so nothing local remains. Control geometry matched Unicron's at 31px with 19px icons.npm run checkfails on a hardcoded color or an undeclaredvar(), and enforces the neutral alpha ladders. CI runs it on every push, and a canary workflow opens a PR here whenever the package releases. - Add Folder… moved to
⇧⌘O. Plain⌘Oopens a document now, the way it does in every other Mac app, and the shifted variant reaches for a folder.
Fixed
- A dropped file from Finder no longer white-screens the window. With the webview keeping its own drag and drop, an OS file drop was navigating the page to
file:///…. Those drops are swallowed now; in-editor text and file drags are untouched. - Switching files can't quietly eat an unsaved edit. Opening a file flushes the current one first, but a failed write used to be ignored and the buffer overwritten anyway. Now the open stops and says so.
- Nested files read as if they'd escaped their folder. File rows had no chevron, so a file one level deeper than a folder still drew 5px to the left of it.
- A suggestion can't replace your selection with "x". The structured output schema documented
revisedonly in the system prompt, and the model started satisfying the string type with a placeholder while doing the actual work in the notes. The schema fields carry real descriptions now, and a schema-valid response with no usable revision is a failed request, not an Apply button. - Hovering an unselected segment made it look more chosen than the chosen one.
.seg button:hoverpainted--hoverat the same alpha as the sliding indicator. Caught by the alpha-ladder rule innpm run check. - Two shadows that never adapted to dark.
Removed
- The writing chat. The panel, streaming, apply-target highlights, and the
⌘⌥Cshortcut, plus the Rust streaming proxy commands underneath them. Voice profile, samples, and the tics checklist stay — they calibrate the editor's suggestions.
0.3.0
2026-07-07The AI release. Editing suggestions in the editor, a writing chat that matches my voice, and the security work a key-handling app needs before it ships to anyone else.
Added
- AI editing suggestions. Select a sentence or paragraph and a small toolbar offers Improve and Check rules — a rewrite, or an audit against your own writing rules, in a popover with Apply and Copy. Model (Opus 4.8 default) and thinking effort are configurable in Settings (
⌘,). Off until you add a key. - Writing chat. A right-sidebar chat that streams, knows the open document and your selection, and proposes rewrites you can apply straight into the draft. Apply targets the exact passage — the one you selected, or the one the model quotes when you didn't — with the target highlighted before you commit and
⌘Zto take it back. One primary Apply per reply; alternatives demote to a "want this instead?" prompt. The model's self-check collapses behind a one-line summary, and the blank slate offers suggestion pills that send themselves. Chat lives in edit mode only. - Voice profiles and writing samples. Settings grew Samples, Voice, and Style tabs: paste or import real pieces of your writing, and the active samples ride along in every chat as the primary signal for matching your voice. A Generate button drafts the editable profile from them, and the Style tab holds an AI-tics checklist plus a "keep human roughness" switch. Backed by SQLite next to the app config — no file paths to wrangle.
- Tabbed Settings window (AI, Samples, Voice, Style), Sketch-style, saving on close. Replaces the old modal and the nested voice dialog.
- Navigator upgrades. Sort by name or recently modified, a file-type filter, and images in the tree — click to view on a canvas, drag into the editor to insert a markdown image link with a relative path.
- Editor odds and ends. Task checkboxes in Preview are clickable and write back to the doc. A status bar shows word and paragraph counts. Reworked shortcuts:
⌘Etoggles edit/preview,⌘Ssaves and returns to preview,⌘Wcloses,⌘Dduplicates,⌘Pprints,⇧⌘Kopens a shortcuts reference. A drag grip in the margin moves lines with the mouse.
Changed
- The topbar is contextual: formatting tools anchor left in edit mode, the filename shows in preview. Read mode paints the app a light gray and entering edit lifts the content to white. Toggle and selected states went neutral and pressed, with a top-lit inset bevel.
- The app icon matches Unicron's: the narwhal circle on a white plate at the same 85% optical size.
Fixed
- Task-list corruption when moving lines around; cut, paste, and drop are line-wise now. The editor picks up external file changes instead of clobbering them.
- Chat suggestion pills submit directly instead of just filling the input, and the send button no longer shifts out from under the click.
Security
- The API key lives in the macOS Keychain (Windows Credential Manager / Secret Service elsewhere), not in a plaintext JSON file. Old settings files migrate on first read, and Settings gets an explicit "Remove key" action.
- The key never enters the page. Every Anthropic call goes through a Rust proxy that attaches the key and base URL server-side; the webview only builds request bodies, and settings reads report only whether a key exists. The
@anthropic-ai/sdkdependency is gone.
0.2.0
2026-07-02Tables and a slash menu. The headline is table editing: drop in a table and it becomes a real grid you edit in place, not a row of raw pipes.
Added
- Visual tables. Markdown tables render as an editable bordered grid in the editor. Click a cell and type. Tab and Shift-Tab move between cells, Enter drops to the next row and adds one when you're on the last, and Shift-Enter leaves the table. Hover a row or column for a handle to add or delete it. Every edit round-trips to clean GFM markdown,
⌘Zundoes it, and a hint bar shows the cell-editing keys while you're in a table. Insert one from the toolbar's table button or the slash menu. - Slash menu. Type
/at the start of a line for an insert menu — headings, bulleted / numbered / task lists, a table, a quote, a code block, or a divider. It's styled like the app's other dropdowns, carries Lucide icons, and narrows as you type. - Clickable links in preview. Links, and bare URLs you paste (GFM autolinks them), open in your default browser instead of navigating the app window.
Changed
- Tables fill the width of the editor column in both edit and preview, with the columns still auto-sizing to their content.
0.1.0
2026-06-26First version. A focused macOS markdown editor (Tauri + React + TypeScript) that reuses Unicron's design system.
Added
- Library rail. Add multiple folders as Locations, each a collapsible file tree, persisted across launches. A
+menu creates files and folders or adds a Location. - CodeMirror 6 editor with live markdown styling. Headings size up; bold, italic, and links style in place; syntax markers fade on every line but the cursor's.
- Preview / Edit toggle. A rendered-markdown view (react-markdown) alongside the live editor. Switching files updates the preview.
- Formatting toolbar. Heading dropdown (H1–H6 / body), list dropdown (bullet, numbered, task), and Bold / Italic / Link. The heading and list buttons reflect the cursor's line.
- Files. Rename in a dialog (double-click a name or right-click ▸ Rename), plus a right-click context menu with Reveal in Finder and Move to Trash (recoverable, via the
trashcrate). - Title proxy. ⌘-click, right-click, or click the title's caret for the path hierarchy; open any folder in Finder.
- Saving. Debounced autosave with a
⌘Sforce-save and an unsaved dot. - Theming. Light / Dark / System from the
⋮menu, applied through CSS tokens so the editor follows too. - Native menu with File, Edit, View (Toggle Sidebar, Refresh, Preview, Edit, Appearance), and Window.
- Shortcuts.
⌘Ssave ·⌘B/⌘I/⌘Kbold/italic/link ·⌘1–⌘6/⌘0headings ·⇧⌘P/⇧⌘Epreview/edit ·⌘Nnew file ·⌘Oadd folder ·⌘⌥Stoggle sidebar ·⌘Rrefresh.