Lettuce — Release notes
Changelog
All notable changes to Lettuce. Format follows Keep a Changelog.
0.38.5 — 2026-07-24
Fixed
Unsaved typing could be lost on a brand-new note. If a note’s autocomplete list changed while you were typing — which happens whenever anything touches the vault in the background, like a running agent creating a note or a new tag syncing in — the editor rebuilt itself and could revert to the note’s pre-typing content, discarding what you’d written. New notes were hit hardest, because they stay unsaved for a while before the first save. The editor now carries your live text through that rebuild. (If you keep unsaved edits around, this one’s worth updating for.)
0.38.4 — 2026-07-21
Fixed
Switching from Edit to Read is instant now. Every flip to Read used to rebuild the reader page from scratch — a visible pause even when nothing had changed. The reader now keeps the current note’s page across the toggle: unchanged content shows immediately, and in-progress edits update in place. (Switching between different notes behaves as before.)
0.38.3 — 2026-07-20
Changed
PDFs exported from your iPhone now look exactly like the Mac app’s. The agent/phone export API used to convert PDFs through pandoc — which required a separately installed LaTeX engine and produced typeset output that looked nothing like Lettuce. The server now renders PDFs through the same WebKit pipeline as the Mac app’s File → Export: Markdown notes get the full reader styling (callouts, tables, code, expanded sections), HTML artifacts render verbatim, and no extra software is required. Word and ePub still use pandoc.
0.38.2 — 2026-07-20
Fixed
Exporting an HTML artifact now produces the page you see, not its source code. Saving a Claude artifact as PDF ran the raw HTML through the Markdown renderer — the export came out as typeset source text. HTML documents now export verbatim everywhere: PDF renders the document itself, HTML export is a byte-for-byte copy, Word/ePub convert from HTML, and the agent-facing export API matches. Group export skips HTML documents with a clear count (a self-contained artifact can’t join a combined document without its styles bleeding over every other note) — export those individually.
Collapsed sections no longer vanish from printed PDFs. Recent WebKit changed how closed collapsible sections are hidden, which silently defeated the print rule that expands them — a collapsed section or callout was simply missing from PDF export, QuickLook printing, and printed site pages. Everything now prints fully expanded again.
Added
PDF export of the AI-enhanced view. With the Enhanced view on screen, exporting a PDF now captures it — table of contents, numbered sections, and ✨ summaries — using the same cached render you’re looking at, so it usually costs no API call. If the AI structuring isn’t available (no provider, oversized note, or an error), the export falls back to the standard sectioned layout and the status bar says so.
0.38.1 — 2026-07-17
Fixed
An adversarial multi-agent review of this week’s changes, with every confirmed finding fixed. The headline class: several read-modify-write paths could mistake an iCloud-evicted note for an empty one and overwrite it with defaults — the morning digest could replace your Today note with a fresh template, filing an AI directive could replace a note with just the directive, reverting an agent edit could destroy newer edits, and a chat insert could replace the note with just the reply. All of these now refuse to touch a note whose bytes aren’t local yet (agents get a clean “retry shortly” error), and the deploy pre-flight that keeps evicted pages from vanishing off your live site now works for manual deploys too.
A note showing another note’s title in Read mode. The render cache didn’t include the note’s identity, and a mid-switch race could pair one note’s body with another’s title and freeze it in. Both fixed.
More hang and data-safety hardening: every remaining blocking file read on the agent server converted (one evicted note can no longer stall all agents), the AI-actions palette / publish toggles / export / duplicate / mention-linking all guard against acting on a stale editor buffer, folder export fails clearly instead of silently omitting a still-downloading note, and iCloud downloads are now requested through the system’s non-blocking API.
Parser crash defense went from pattern-matching to measurement: code-fence detection is now CommonMark-accurate and every parsed document’s nesting depth is verified before any code walks it — the crash-loop class can’t re-enter through an unanticipated construct. The regression suite now tortures 13 pathological documents.
Changed
Menus no longer carry twin names: Published Pages (the overview note) vs Publish Site (the deploy panel), and Ask Your Vault… vs Ask This Note.
0.38.0 — 2026-07-17
Added
Publishing walks you through it now. The Publish panel is a four-step checklist with live state — GitHub account (“Connected as you”), repository, published content, deploy — so a disabled Deploy button can never strand you again. The repo field checks itself as you type and tells you the part nobody knew: the repo doesn’t have to exist — the first deploy creates it for you (public, with Pages enabled). A count shows exactly what will publish (notes and tagged artifacts), with pointers when it’s zero. The token paste is still there, tucked into a disclosure.
Dead-ends navigate. On an artifact that’s tagged to publish but has no site configured, the banner’s hint is now a button — Set up GitHub Pages… — that opens the inspector straight onto that checklist.
Auto-deploys report back. When the automatic deploy pushes your site, the live URL comes back into the app: the Publish panel shows “Auto-deployed” with the clickable link, the status line carries the URL, and the published-pages list refreshes. Previously a hands-off deploy was silent.
The artifact banner’s View online link now appears as soon as a repo is named — the site address is derived from
owner/repo, no first deploy required.
0.37.2 — 2026-07-17
Changed
The Claude setup prompt is now one copy-paste block. The Save Claude’s work into your vault recipe (Lettuce Docs ▸ Recipes) leads with a single standing-instructions prompt that routes everything Claude produces into your vault: Markdown notes with tags and wiki-links, and self-contained HTML artifacts filed into per-project
Briefings/<project>/subfolders — including the “make it PUBLIC” meta-tag rule that, with auto-deploy on, publishes an artifact to your site minutes after you ask for it.
0.37.1 — 2026-07-17
Added
Your artifact’s public link is now visible. Published HTML documents (Claude artifacts) now appear in the Published overview and the publish panel’s list alongside notes — with their live URLs. The document banner also shows the state inline: Publish to Site on an unpublished artifact, View online + Unpublish once it’s tagged (or a “set a repo” hint if GitHub Pages isn’t configured yet).
Fixed
Six links in the documentation index (and cross-references) did nothing when clicked — pages whose names contain an apostrophe, like Save Claude’s work into your vault. Smart-quote folding now matches links to filenames, and a new test walks every link in every doc page so a dead link can’t ship again.
0.37.0 — 2026-07-17
Added
The documentation stays out of your notes. The built-in guides now live in a pinned Lettuce Docs section at the bottom of the sidebar — with its own book icon, clearly not one of your folders. Click a page and it renders read-only in place, wikilinks navigate between doc pages, and clicking any of your notes brings your work straight back. (Previously, “Lettuce Documentation” opened the docs as a vault, which looked like a dozen strange folders had been dumped into your notes.)
Switch vaults from the toolbar. The Open Vault button is now a split button: click for the usual folder picker, or use the arrow for a menu of your recent vaults. The recents list also remembers 20 vaults instead of 8, so opening a scratch folder no longer silently pushes your real vaults off the list.
Fixed
The “spinner, then the app stops responding” hang. Two independent causes, both fixed. First, a note evicted to iCloud (“Optimize Mac Storage” / Desktop & Documents sync) blocks any read until iCloud delivers the bytes — and several read paths, including the one behind Read mode, ran on the main thread, freezing the whole app when sync was slow or stuck. Lettuce now detects evicted notes up front (a metadata check that never blocks), shows a “Downloading from iCloud…” page, pulls the bytes down in the background, and renders the note automatically when they arrive. Second, on macOS 26 the inspector’s auto-hide could feed the layout engine its own output and spin the app at 100% CPU; the width it watches now comes from the window frame, which the inspector can’t affect.
A crash-loop opening notes with pathological nesting. A note whose lines chain thousands of list markers (
- - - - …) or emphasis characters overflowed the Markdown parser’s stack and crashed the app — on the indexing path, so it crashed again on every relaunch until the note was removed by hand (this was the crash some of you reported on July 12). Both constructs — and several cousins found while testing — are now clamped or parsed with room to spare, backed by an 11-input torture test.The “N agent updates” banner no longer overlaps the first row of the sidebar tree.
0.36.0 — 2026-07-16
Added
Publish Claude artifacts to your site. An HTML document carrying
<meta name="lettuce-published" content="true">rides along when you publish — copied exactly as-is (self-contained, scripts intact) at the same URL scheme as your notes and listed on your site’s index by its title. Right-click any HTML document → Publish to Site / Unpublish to toggle it, or have Claude add the tag when you ask for a public artifact.The site can deploy itself. A new opt-in in the publish sheet — “Deploy automatically when published notes change” — watches your published notes and artifacts and pushes to GitHub Pages a few minutes after you stop editing them. Unpublishing or deleting a published page takes it down automatically too. Coalesced, throttled (at most every 15 minutes), and it retries after failures.
Fixed
lettuce publish --allno longer runs HTML documents through the Markdown renderer (they were published as mangled source); they’re copied verbatim like everywhere else.
0.35.1 — 2026-07-16
Changed
Lettuce now sits truly idle when you’re not using it. The background machinery (scheduled digests, the always-on server, the directive worker) did small amounts of busywork every minute — Keychain checks, folder scans, hourly calendar sweeps — even with nothing to do. All of it is now gated or event-driven: an idle Lettuce went from thousands of tiny wake-ups a day to almost none, which is good news for laptop batteries.
Lower memory footprint after AI searches. The indexes behind semantic search and “ask your notes” (up to ~100 MB on large vaults) are now released after 15 minutes of not being used, instead of staying in memory until the system asked for it back. The next question simply reloads them.
0.35.0 — 2026-07-15
Added
Find notes in Spotlight. Your note titles now appear in macOS Spotlight — hit ⌘Space, type a note’s name, and Lettuce opens it directly. Indexing stays on your Mac (titles only, re-indexed quietly as your vault changes).
Nine more pages in the built-in Help, covering long-undocumented features: backups & version history, exporting to PDF/Word/ePub, the agent inbox & edit timeline, iPhone capture, templates, AI actions (including your custom ones), the trash, and CLI pages for
backup/restoreanddigest/process-inbox.
Changed
The sepia theme’s palette is now defined once and shared by every surface, fixing a subtle color drift between views.
0.34.1 — 2026-07-15
Added
Nine new pages in the built-in Help. Setup guide for the new Claude Code (subscription) provider; a recipe for having Claude file Markdown notes and HTML artifacts straight into your vault; and long-missing docs for backups & version history, exporting to PDF/Word/ePub, the agent inbox & edit timeline, iPhone capture (voice, Share sheet, Siri, widget), templates, AI actions (including custom ones), and the trash. Plus CLI cookbook pages for
backup/restoreanddigest/process-inbox.
0.34.0 — 2026-07-15
Added
Use your Claude subscription for AI — no API key needed. A new provider, Claude Code (subscription), runs Lettuce’s AI features through the Claude Code app you already have installed and signed into. Pick it in Settings ▸ AI enhancement and everything — enhance, drafts, mention filtering, lint suggestions, custom actions — bills to your Claude Pro/Max plan instead of pay-per-token API usage. Lettuce never sees a credential: it simply talks to your local
claudecommand, with its agent tools and MCP servers switched off so each call is a plain, private completion. Choose a model tier (sonnet,opus, orhaiku); your plan’s rate limits apply. Requires Claude Code installed and signed in.
0.33.0 — 2026-07-14
Added
View HTML documents in the reader. Self-contained HTML files — like the artifacts Claude generates — now open and render directly in Lettuce, on Mac and iPhone. Drop an
.htmlfile in your vault and read it in the app, fully styled. They show a globe icon in the sidebar and a banner noting they’re read-only (with Reveal in Finder on Mac if you want to edit the source). HTML documents are shown as-is and never run through the Markdown parser, so they can’t affect your tags or search.
Fixed
Moving or renaming a note keeps its file extension. A move used to force a
.mdextension; an.htmldocument dragged into a folder now stays.html(and rendered) instead of turning into raw code.
0.32.0 — 2026-07-12
A reliability, performance, and security hardening release from a top-to-bottom audit of both apps.
Fixed
iPhone: Share, Siri, and the widget now use the vault you actually opened. If your vault is a folder you picked (for example a Mac vault kept in iCloud Drive), the Share sheet and “Add note to Lettuce” were quietly saving into an empty, unrelated location and the widget showed nothing. They now write into — and read from — your real vault, and captures land in your Inbox with a readable name instead of a timestamp at the vault root. The widget also shows notes from inside folders, not just the top level.
Mac: your own edits no longer show up as “changed by the agent.” The agent-inbox dots were flagging notes you had just edited yourself after a reload or relaunch; they now correctly track only agent activity. Quick-add, quick capture, publishing, folder moves, and calendar notes no longer light up either.
Faster first open of large or iCloud vaults. The initial search-index build was quadratic and could take minutes on a very large vault (and it ran on every background-server restart); it is now linear.
iPhone: a new note or task never forks a duplicate of a note that iCloud hasn’t finished downloading yet.
The morning-digest banner and its notification follow your configured daily-notes folder instead of assuming
Daily/.Numerous smaller correctness fixes across editing, conflicts, publishing, backups, and error messages (e.g. filesystem errors now give a clear message instead of a generic failure).
Security
The background directive worker can no longer be tricked into leaking private notes. An
[!ai]directive in a shared or synced note is now answered using only its own folder’s context, so it can’t be used to pull unrelated private notes into a note that syncs back out.Content brought in by web/file import can no longer plant live agent instructions (
[!ai]directives and@mentionsare neutralized on the way in).The local agent server is hardened against a malformed request that could crash it, and against a note with pathological formatting that could crash indexing.
Changed
Accessibility improvements to published sites (image alt text, diagram labels, keyboard-reachable previews and lightbox, focus indicators).
0.31.0 — 2026-07-12
Added
Directive mailbox — talk to your agent inside a note. Write a
[!ai]directive anywhere in a note and an agent can answer it right there, inline, then keep watching for your next one. A new Settings ▸ Agents toggle, “Answer directives automatically,” installs a background worker so directives get picked up and answered on their own — no need to keep a chat window open.Agent inbox — see what the agent touched. Notes an agent created or changed since you last opened them now show a coloured dot and a bold, tinted name in the sidebar (green = new, orange = changed), with a banner summarising how many are waiting. Opening a note clears its mark, so the sidebar becomes a simple inbox between you and your agents.
Fixed
iPhone: no more freeze when a synced note arrives. Incoming iCloud notes are now read off the main thread, so the notes list stays responsive as a note syncs in (previously it could hang for a few seconds).
iPhone: synced notes appear promptly. New notes coming from your Mac are now actively pulled down from iCloud instead of waiting on iOS’s own schedule, so they show up when they should. The agent inbox indicators are on iPhone too.
0.30.2 — 2026-07-09
Fixed
No more “No vault open” flash at launch. Reopening your vault briefly showed the empty-state screen (buttons and all) before the vault loaded; the window now stays blank for that instant instead.
Lettuce ▸ About now reliably opens Settings ▸ About instead of sometimes showing the bare system about panel — the two views are one and the same again.
Settings can no longer open invisibly. A launch-time cleanup could strand the Settings window off-screen at 1×1, making ⌘, appear to do nothing for the rest of the session.
0.30.1 — 2026-07-09
Fixed
Moving a note to trash no longer surfaces
.lettuceand.trashas sidebar groups — with the trashed note wrongly still live (and searchable) inside. Hidden folders are bookkeeping and never appear; the note shows only in the Trash section, as intended. Stray groups from before this fix disappear on relaunch.Trashing a note can no longer fire your automations. A vault-wide “file created” notification rule (or a change trigger’s AI action) could fire against the just-trashed note; hidden paths are now excluded from trigger evaluation.
The always-on background server no longer re-reads the whole vault on every trash move (or internal state write) — those events are now recognized as bookkeeping and skipped.
0.30.0 — 2026-07-08
Big vaults feel instant: two at-scale stalls are fixed (measured on 5,000 notes), a one-click Quick Note lands in the sidebar, and the app and background server stop double-running scheduled work.
Fixed
Selecting a note in a large vault no longer stalls. On vaults with thousands of notes, every sidebar click paid a hidden per-row cost that could freeze the app for seconds; selection is now instant (measured: seconds → under 2 ms on a 5,000-note vault).
A burst of synced changes no longer janks typing. When iCloud sync or an agent delivers many files at once, each used to cost main-thread time; a 15-file batch now applies in ~11 ms total (was ~130 ms per file).
Added
Quick Note button in the sidebar (⚡, next to New Note): one click creates a note in your Inbox and puts the caret in the editor — no name prompt; it titles itself from your first line. Same action as ⌃⌘N.
Changed
The app and a background
lettuce servenow coordinate scheduled work. While the app is running it owns schedules, digests, inbox rules, and backups; the server defers via a liveness heartbeat and takes over within ~2 minutes of the app quitting. No more duplicate AI spend or racing writes on the same vault.One metadata sweep per reload instead of three. Reload paths (Mac and iPhone) now share a single per-note stats pass across the scan cache, search index, and iCloud download probe.
Semantic search serves titles and snippets from the already-decoded passage index instead of re-reading every hit from disk; mention scanning and iCloud status checks got cheaper on big vaults.
0.29.0 — 2026-07-08
Nothing blocks anymore: opening, saving, switching, and quitting never wait on iCloud; the phone stops undoing Mac-side renames; and grounded answers finally work on local models.
Fixed
The iPhone no longer resurrects notes your Mac renamed, moved, or deleted. If a note vanishes under an open phone editor, unsaved edits are preserved as a conflicted copy and the editor closes — previously the next autosave silently re-created the old file next to the renamed one.
iPhone search finds body text again. A cache interaction made phone search silently match titles only after the first reload; the index is now persistent and incrementally reconciled — and saves on the phone no longer trigger a full vault re-index.
Push notifications reach App Store installs. Production device tokens were being sent to Apple’s sandbox endpoint and silently dropped; delivery now retries the right environment automatically.
“Ask your notes” works properly with local models (Ollama). Local models often answer outside the strict tool format; those answers were discarded as errors — they’re now recovered, retried when garbled, and the groundedness self-check that silently never ran now scores and corrects answers. Measured on the docs Q&A set: 90% of answers state the expected facts, ~92% of claims verified grounded.
Chat on the phone now backs off when the Mac asks it to (rate limits, a note being edited) instead of immediately retrying.
Changed
Nothing waits on iCloud anymore. Opening a vault, saving (⌘S and note-switch), reloading a conflicted note, and quitting all run their disk work off the main thread with strict ordering — a wedged sync can no longer freeze the app, and quit always completes (bounded drain).
The AI search index moved out of the vault. Embeddings are a per-device cache; keeping them in the vault synced megabytes on every re-index and shipped one machine’s index to every device. Existing indexes are adopted in place — no re-embedding on this Mac.
Faster everywhere at vault scale: agent API calls stop re-reading the vault per request, the always-on server no longer re-indexes everything on every sync ripple (and stops running git on an idle vault every minute), Quick Open and the Outline panel no longer do heavy work per keystroke, huge notes type smoothly (the editor stops shipping the whole document on every keypress), and the phone’s note list builds in one pass.
New iPhone pairings are propose-only. A pairing token can now only file proposals you review — the phone applies accepted ones through its own iCloud access. Existing pairings keep working; re-pair (after revoking the old key) to adopt the safer kind.
0.28.0 — 2026-07-07
The big-vault release: everything you do — launch, switch notes, save, move folders — got dramatically cheaper, and the random mid-typing freeze on iCloud vaults is gone.
Fixed
The app no longer freezes for 20–30 seconds while you type. On a large iCloud vault, background sync activity could force a full re-scan that ran on the UI thread; the scan (and every other whole-vault read) now runs entirely in the background, so typing, scrolling, and switching notes stay responsive no matter what sync is doing.
Folder operations keep your data straight: renaming a folder preserves its manual sort order, path-qualified
[[Folder/Note]]links are repointed when the folder moves, and a folder renamed outside the app (Finder, an agent) re-syncs the sidebar instead of stranding stale rows.A wave of smaller correctness fixes from three deep audits — wiki ingest/lint edge cases, mobile-branch regressions, and release hygiene.
Changed
Vault-scale performance overhaul. Saving updates the search, link, and tag indexes straight from the editor buffer (no re-reading the note from disk); note switches defer hidden-panel work; the Links inspector only scans when visible; structural changes patch the model surgically instead of re-walking the vault; and the AI index skips unchanged notes by checking file stats before reading a byte. On a ~6,000-note vault, minute-timer full rebuilds are gone entirely.
Added
The reader renders more of what you type: bare URLs autolink, HTML entities resolve, and more callout types render — the in-app reader and published sites stay in step.
Launch hardening across both apps, and the iPhone & iPad app heading to the App Store.
Fixed
A deeply nested or malformed note could crash the app while rendering. Pathological block nesting is now safely bounded before parsing, so a corrupt or hostile
.mdfile can’t take the app down.The Links inspector auto-hides on a narrow window, so it no longer clips the sidebar.
Changed
Under-the-hood hardening. The always-on server caps request sizes and rotates its log, and the vault’s shared config format is now forward-compatible — a newer app version’s settings are preserved when an older version writes the same vault, instead of being silently dropped.
iPhone & iPad
The companion app is coming to the App Store — a full, standalone Markdown notes app (edit, read, search, capture, graph, and on-device website/slide export, no Mac or account required) that syncs your vault through iCloud and pairs with the Mac for whole-vault chat, publishing, and briefings. Hardened across security (device-only keychain, app-switcher privacy cover), data safety (conflict-safe background saves), spending (a one-time confirmation before building the AI search index), and accessibility, with local on-device crash diagnostics.
0.27.2 — 2026-06-28
Feature parity across your Mac and iPhone, from one shared vault config.
Added
Parity, both directions. The Mac gains a conflict resolver, Ask your notes, AI deep-review (a second-pass structural + semantic lint), and full create/edit/delete for digests; the iPhone gains proposal review (accept or reject an agent’s edits as diffs) and schedule management.
Changed
One shared workflow config. Your Mac, iPhone, and the headless server now read the same
.lettuce/workflow.json, so they agree on your daily-note folder and date format, templates, and embedding model — no more per-device drift or vector-index thrash.iPhone reader parity — renders note embeds and the enhanced (structured) view, and Chat shows a badge when it falls back to on-device search.
Fixed
Automations now fire on external edits — a change made by an agent or another device triggers your rules, not just edits made in the app.
Search ranking, date/locale handling (DST and non-Gregorian locales), URL ingest, rename backlink-rewrite, Unicode search, a find-duplicates cap, and RAG retrieval tuning (HyDE weighting, rerank cap).
0.27.1 — 2026-06-28
A broad reliability, data-safety, and security pass, plus visual automation building.
Added
When → Where → Do automation builder on the Mac, and plain-English automation creation consolidated into the Automation tab — describe a rule in a sentence and confirm it.
AI-on-change triggers (
file:changed) with loop guards, so an agent can react when a note is edited, not only when one is created.
Changed
iPhone Settings reorganized into a logical flow: AI provider and key merged into one section, Notifications split from Automation, and the manual Mac URL/token tucked under Advanced.
Fixed
Data-loss cluster closed on both Mac and iPhone — a dirty editor buffer is no longer lost to a reload, move, or an incoming iCloud conflict; Version History crashes and conflict/share edge cases resolved.
Concurrency & cost hardening — every AI-spending tool is rate-limited, the embedding index merge-saves atomically (no concurrent clobber), and scheduled runs take a fire-lock.
Security — credential/secret handling tightened, agent access confined to its allowed folders, SSRF-rebinding and prompt-injection backstops, and a hardened raw-HTML sanitizer. CLI commands now exit non-zero on failure.
0.27.0 — 2026-06-26
Tasks, today, and your overviews now emerge from your notes — not from bolted-on dashboards.
Added
Today and Tasks are real notes. Your Today note (the daily note) shows the day’s calendar agenda and what’s due via live
tasksblocks, and your Tasks note rolls up every open to-do across the vault. Tick a checkbox anywhere and it writes back to its source line. Open them from the new Open menu in the toolbar (⌥⌘D / ⌥⌘T).The morning briefing lives in Today. The default Morning digest now folds a short AI briefing (what changed, plus a suggestion) into a
## Briefingsection at the top of your Today note — merged so it never touches your own notes. The toolbar Open button shows a dot when a new briefing has landed.More overviews as notes: Published (every published note + its live URL), Vault Review (the linter’s findings as a checklist you tick off, each linked to the note it flags), and an Ask Log (save an answer from “Ask your notes,” with its sources as wikilinks). These maintained notes live in an
Overviews/folder so your vault root stays tidy.
Changed
Toolbar grouped by scope. The trailing toolbar is now three clean clusters — this-note actions, an Open menu for the maintained notes, and the view toggles — instead of a mixed row.
iPhone parity for all of the above: the Notes tab gains the same Open menu (Today / Tasks / Published / Review) with the update badge; the separate Tasks tab is gone.
Fixed
Hardening throughout the new surfaces: rollup checkbox toggles verify the task text before flipping (no wrong-task toggles), the linter runs off the main thread, the iPhone renders
tasks/queryblocks, and the Ask-Log append is sync-safe.
0.26.1 — 2026-06-26
Fixed
Crash on launch / opening a vault on macOS 26. Checking whether
pandocis installed (to enable Word/ePub export) could run a command on the main thread while drawing the file list, which on macOS 26 turned a routine sidebar scroll into a hard crash. The check is now instant and runs in the background, so the app opens reliably. (No change to your notes — if you hit this, just reopen the app.)
0.26.0 — 2026-06-25
Effortless iPhone↔Mac setup, connect-your-own-agent details, and a clarity pass throughout.
Added
Scan to connect your iPhone. File ▸ Connect iPhone shows a QR your phone scans (Settings ▸ Mac Tools ▸ Scan to Connect) — no typing URLs or tokens, and the secret never leaves your devices. The Mac confirms with “✓ Your iPhone is connected” the moment it links.
Guided Mac setup. Connect iPhone walks a checklist — server running → shared on Tailscale → reachable — with one-click “Share via Tailscale”, plain-language Tailscale steps for first-timers, and an optional “Keep running when Lettuce is closed” for always-on Chat, publishing, and overnight briefings.
Connect your own agent. The Connect-an-agent panel adds a This-Mac / over-Tailscale endpoint toggle and a copyable raw MCP endpoint, REST API base, and bearer token — so you can wire any MCP/HTTP client or the CLI, not just the built-in templates.
First-run guidance. iPhone Chat now nudges you to connect your Mac, and onboarding gains an optional “Connect your Mac” step covering Chat, publishing, and briefings.
Changed
Automations moved to the AI settings (from Appearance) and work with any model — online (Claude, GPT) or local — with clear guidance when no model is set up.
Plainer language throughout. Jargon is defined or dropped (MCP, Tailscale, propose-only, glob and date patterns), and every disabled control now explains itself (e.g. “Mac offline — make sure it’s awake and connected”) instead of silently doing nothing. Troubleshooting aids added on both Mac and iPhone.
Fixed
The phone now reaches the Mac reliably even when its network name resolves to a public address — it connects to your private tailnet address directly.
Rotating the default key keeps Settings open with a clear confirmation; the Automations description field is properly editable; assorted popover, alignment, and first-run fixes.
Auto-updates via Sparkle.
0.25.0 — 2026-06-25
Phone↔Mac power tools, a publishing overview, and polish.
Added
Phone → Mac actions. Publish your site to GitHub, generate an on-demand briefing, and export a note to DOCX/EPUB/PDF/HTML — all run on the Mac, over your Mac Tools connection.
Frontmatter helper on Mac (toolbar popover) and iPhone (sheet): Published/Enhance toggles, removable tag chips, and Title/Description/Date/Author fields.
Published-notes overview on Mac (globe popover + inspector) and iPhone (Settings ▸ Published Notes): every published note with its live URL — open, copy, share, or unpublish in place.
Changed
Mac↔iPhone sync hardening. All Mac/server writes are coordinated (no silent clobber of a synced phone edit), the push-token registry merges conflict copies, evicted notes are downloaded before reading, and conflicts are surfaced vault-wide.
Dark-mode boot splash now uses the real app icon, plus many smaller fixes.
0.24.0 — 2026-06-24
Reliability release — calendar and Mac↔iPhone sync hardening.
Calendar
Mirror and write-back share one actor, so the two sync directions can never write a day note at the same time.
Event-driven sync (
EKEventStoreChanged): calendar edits appear in notes within seconds instead of minutes.Write-back happens before the mirror regenerates, so a phone edit is never overwritten.
Second-pass fixes (synced re-stamp, a persistent conflict banner, no-H1 frontmatter) plus parser fuzz and scale tests.
Changed
Shared-vault writes are NSFileCoordinator-coordinated — a concurrent phone edit is preserved as a conflict copy instead of being silently overwritten.
The push-token registry merges iCloud conflict copies, so a device never silently loses notifications.
iOS downloads an evicted note before reading it (no blank overwrite); opens read-only if it can’t.
Conflicts are surfaced vault-wide — a phone banner and a Mac alert, with a resolver.
0.23.0 — 2026-06-24
Reliability hardening.
Fixed
No double-fired digests. When this Mac runs both the background server and the app, a new cross-process lock guarantees each scheduled digest/inbox run fires exactly once — replacing a heuristic that could skip scheduling entirely.
Cleaner recurring-meeting notes. A one-off event that shares a title with a recurring series no longer injects stray dates into that series’ rolling note.
Smoother dictation (iPhone) — punctuation no longer bleeds across the recognizer’s internal restarts.
0.22.0 — 2026-06-23
Calendar, automations, and voice — your notes and your day, together.
Added
Calendar as notes. Your macOS Calendar (Google/iCloud/Exchange) mirrors into a one-note-per-day agenda; edit a line to update the real event, add a line to create one (conflict-safe, never deletes). Wikilink an event for a detail note — recurring meetings get a rolling note that carries unfinished action items forward.
Natural-language automations. In Settings ▸ Automations, describe an automation in plain English and the model turns it into a digest or notification rule, shown for you to confirm before saving.
Voice capture (iPhone). Dictate a note straight into your Inbox with on-device speech recognition — audio never leaves your phone.
Shared iPhone sync, productized — one tap puts your Mac and iPhone on the same iCloud vault.
Fixed
Morning digests no longer fire late, no double-notifications, and a broad hardening pass across the new features.
0.21.0 — 2026-06-22
Calendar, as notes — connect Lettuce to your calendar and work with events the way you work with notes.
Added
Mirror your calendar into the vault. Your macOS Calendar (which bridges Google/iCloud/Exchange) syncs into a
Calendar/folder, one note per event. The event facts live in frontmatter; the body is yours for meeting notes, preserved across syncs.Calendar-aware morning digest — the digest now opens with a Today section listing the day’s events.
Edit the calendar from notes (opt-in). Change a note’s time, title, or location and it updates the real event. Conflict-safe (an unseen calendar change is flagged, never overwritten) and it never deletes; recurring and all-day events are read-only. Enable in Settings → Calendar.
0.20.0 — 2026-06-22
AI duality with the new Lettuce iPhone app — the Mac runs scheduled AI agents that the companion iOS app drives and surfaces.
Added
Morning digests — define many, each scoped to chosen folders, generated on a schedule.
Overnight inbox processing — raw captures get a title,
#tags, and[[links]]; opt-in auto-filing into the fitting folder.Notifications — agent activity and digests reach your phone, including real push (APNs).
New CLI:
lettuce digest,lettuce process-inbox,lettuce push-test.Digests and inbox processing run on a local model (Ollama) — nothing leaves your machines.
0.19.1 — 2026-06-19
Performance
Snappier note-to-note navigation. Switching notes — including to-do/dashboard notes and notes in different folders — now updates the reading view in place instead of reloading the whole page, so clicking around feels noticeably faster.
0.19.0 — 2026-06-18
A performance release: editing stays smooth as your vault and notes grow, and the reading view keeps up with what you type.
Changed
Read view is a live preview. Switch to Read and you immediately see your in-progress edits rendered — no need to save first. (⌘S still saves to disk; nothing auto-saves.)
Performance
Smoother typing — especially in large notes and large vaults. The editor now styles only the text on screen instead of re-scanning the whole document on every keystroke, and the app tracks its UI state at a fine grain, so a single keypress no longer makes the entire window recompute. (Measured on a 6,000-note vault: ~99% fewer view updates per keystroke.)
Instant to-do dashboards. A note with
tasks/queryblocks no longer re-reads and re-parses the whole vault every time it renders or every time you tick a checkbox — toggling a task is immediate even in a big vault.The graph view scales. Very large vaults render the most-connected notes (and reuse a cached layout) instead of freezing the browser on a giant hairball.
Snappier inspector, quicker agents. The Links inspector (backlinks, related-by-tag, unresolved links) caches its work, transcluded
![[embeds]]aren’t re-rendered on every view, and the duplicate-finder runs off the request path so it no longer blocks other agent calls.
0.18.0 — 2026-06-17
A complete to-do workflow on plain Markdown — tick tasks where you read them, and gather them across the whole vault.
Added
Interactive checkboxes. Checkboxes in the reading view are now clickable — tick or untick one and it writes straight back to the source line. Tasks are tracked by position in the document’s structure, so toggling stays correct even with frontmatter, footnotes, or code blocks around them.
Live
queryblocks. Dataview-stylequeryblocks now resolve right in the in-app reader (not only when publishing), and their links are live in-app[[wikilinks]]— build a note-level dashboard that updates as you read.tasksblocks. A new cross-note task aggregator: a fencedtasksblock gathers checkboxes from across the vault, filtered by status,#tag, folder, or 📅 due date, then sorted and grouped — rendered as one clickable list (tick a task here and it updates its home note). Obsidian-Tasks-style, on plain files.
Fixed
Editor cursor/selection no longer lands a line off. On notes with frontmatter, clicking or selecting in the editor could target the line below the pointer — the folded properties panel’s spacing wasn’t counted in the editor’s height map. Spacing is now measured, so the caret lands exactly where you click.
Links in the reading view show the hand cursor again (hover over any link, including dashboard links, shows a pointer instead of a text cursor).
0.17.0 — 2026-06-16
Keyboard-driven workflow, instant capture, and a safe way to extend Lettuce with your own AI actions and styling.
Added
Quick capture (⌃⌘N). Instantly create an empty note in the Inbox and start typing — no name prompt. It’s named by timestamp at first, then auto-renames itself to your first line once you move on. (Only quick-capture notes are ever auto-titled; your deliberately-named notes are left alone.)
A keyboard-shortcuts cheat sheet (⌘/). One keypress brings up a categorized list of every shortcut, including the ones that aren’t in any menu.
View-mode and inspector shortcuts. ⌘E (Edit), ⌘R (Read), ⇧⌘E (Enhanced), and ⌥⌘I (toggle the inspector).
Custom AI actions. Define your own one-shot AI actions — a name and an instruction — in Settings ▸ AI or right from the AI actions palette (⌘⇧K → “Create custom AI action…”). They run on the current note and appear next to the built-ins. A guided editor with one-tap examples makes them easy to write. Stored as data in
.lettuce/ai-actions.json.Custom reader CSS. Style the reading view with your own CSS snippet (Settings ▸ Appearance, saved to
.lettuce/custom.css) — applied after the built-in styles so it overrides them.
Changed
The in-app Keyboard shortcuts documentation page was rewritten to cover everything currently bound.
Moving or renaming a note in the background (including a quick-note auto-rename as you switch away) no longer yanks your selection to it.
Fixed
Hardened the new surfaces after a pre-release audit: a custom action’s name can no longer smuggle a hidden agent directive into a note; a custom CSS snippet can’t break out of its
<style>block; and the view-mode shortcuts no longer fire (or start an AI render) behind an open dialog.
0.16.0 — 2026-06-15
A big feature release — note-taking power borrowed from Ulysses and Obsidian, plus an accessibility and safety pass.
Added
Trash. Soft-deleted notes now appear in a collapsible Trash section in the sidebar — restore a note to its place (uniquified if the spot is taken) or delete it permanently, and Empty Trash when you’re done. No more digging through a hidden folder in Finder.
Find & Replace in the editor. Press ⌘F while editing for a floating find/replace bar — live match count, ▲/▼ navigation, match-case, and Replace / Replace All. (Read view keeps its existing find bar.)
Export a whole group as one document. Right-click a folder → Export Group as PDF / HTML / Word / ePub — every note in the group, in sidebar order, as a single document.
Per-note version history. Right-click a note → Version History to browse its Git-backup versions, see a diff against the note as it is now, and restore any version in place (kept as a normal, undoable edit). Requires backups to be enabled.
Paste & drop images. Paste (⌘V) or drag an image into a note — it’s saved beside the note and inserted as a Markdown image.
Inline embeds (transclusion).
![[Note]]and![[Note#heading]]now render the embedded note’s content inline in the reading view, not just a placeholder.Daily Notes. ⌥⌘D (or File ▸ Open Today’s Note) opens or creates today’s dated note, in a folder and date format you choose, optionally seeded from a template.
Templates. File ▸ Insert Template inserts a template at the cursor, with a starter pack of 21 (Daily, Weekly Review, Meeting, Project, Reading, Person, Idea, Bug Report, Map of Content, Literature/Permanent/Open-Question, ADR, Postmortem, Feature Spec, Runbook, Release Notes, Blog Post, Newsletter, Essay, Script) created on demand. Placeholders:
{{title}},{{date}}/{{time}}(with optional:FORMAT),{{yesterday}}/{{tomorrow}},{{weekday}}/{{week}}/{{month}}, and{{cursor}}to place the caret. Configure folders/format in Settings ▸ Appearance.Note aliases. Frontmatter
aliases:let a note resolve under multiple names in[[wikilinks]]and rank in Quick Open.Sidebar keyboard actions. With the file tree focused: Delete moves the selected note to trash (with a confirm), Return renames it.
Undo for organizing. Moving, reordering, or renaming a note shows a brief Undo toast.
Changed
Reduce Motion is respected throughout — the sidebar tree, disclosure chevrons, scroll-to-selected, inspector cross-fade, and Read↔Edit fade all become instant when the system setting is on.
VoiceOver now reads the previously-unlabeled icon-only controls (the find bar, the Files/Tags switch).
Templates stay out of the way — excluded from search results and the link graph (they remain in the sidebar, Quick Open, and Insert Template), and rendered as a filled-in preview in Read mode instead of raw
{{tokens}}.Selecting a note from Quick Open, a link, a backlink, or a search result scrolls it into view, expanding its parent folders.
Fixed
A crash on malformed YAML frontmatter. A note whose frontmatter contained a non-scalar key (for example an unquoted
{{placeholder}}) could crash the app on open; the parser now degrades such frontmatter gracefully instead of trapping.
0.15.1 — 2026-06-15
A polish release: smoother movement throughout the sidebar and views, drag-and-drop organizing, and two small refinements.
Added
Drag and drop to organize. Drag a note onto a folder to move it in, or onto another note to reorder it — and drag folders into folders too. (The right-click “Move to” menu and Move Up / Move Down are still there for precise, keyboard-friendly moves.)
Changed
Smoother transitions across the app. Folder disclosure triangles now rotate as they open, switching a note between Read and Edit cross-fades instead of cutting, and the inspector cross-fades between panels. Opening a note from Quick Open, a
[[link]], a backlink, or a search result now scrolls it into view — expanding its parent folders first if needed.About opens in Settings. “Lettuce ▸ About” now opens the polished About pane in Settings instead of the bare system panel.
A saved AI key now reads as set. Settings ▸ AI shows a stored provider key as masked dots with a “Replace” button, rather than an empty field.
0.15.0 — 2026-06-14
A performance, polish, and hardening release. Switching between Read and Edit is now instant, the AI wiki does less redundant work (so it’s faster and cheaper to run), and a fresh audit hardened the import pipeline and .md Quick Look previews.
Changed
Instant Read ↔ Edit switching. Flipping a note between Read and Edit used to briefly reload the view each time; both now stay live, so the switch is immediate with no flash.
Faster, cheaper AI wiki. Capturing a web page or file no longer re-embeds your whole vault — only the new source is processed — and the maintenance loop (
lint_semantic→maintain) no longer runs the same LLM health-check twice. The agent tool list is also leaner, so connected agents spend fewer tokens per session. Retrieval reads less from disk per question.Faster note creation in large vaults.
Fixed
A cursor flicker in the editor (the pointer flipping between arrow and I-beam as you moved the mouse).
A retrieval-staleness bug where capturing a source immediately after moving or deleting a note could leave the semantic index out of date until the next unrelated change.
Security
Hardened note import against malicious third-party exports. Importing an Obsidian/Roam/Logseq/etc. export now: refuses files symlinked to locations outside the export (which could otherwise read e.g. private keys into your vault), strips a forged
published: truethat would auto-publish an imported note, neutralizes planted[!ai]agent directives, and fixes a regex that a crafted file could use to hang the import.Quick Look previews of
.mdfiles are now beacon-safe. Previewing an untrusted Markdown file in Finder no longer loads remote images (a read-tracking vector), runs no scripts, and caps very large files so a preview can’t hang Finder.Stored API keys and tokens are now device-only in the Keychain (
ThisDeviceOnly) — never synced to iCloud Keychain and not exposed to other processes by a broad default.Web/file capture honors a key’s folder restriction, and agent-captured sources no longer auto-queue an unattended AI directive on content no human reviewed.
0.14.0 — 2026-06-12
A security-hardening release for Lettuce’s AI features, from a multi-agent audit of the whole AI surface (the AI draft/lint/mention helpers, the ask/answer pipeline, the provider clients, and the agent server). Most of this is invisible in day-to-day use; two changes are worth knowing about.
Added
A switch to keep cloud embeddings off. Settings → AI now has “Allow cloud embeddings for semantic search.” Semantic search and the
answer/asktools embed your notes; when this is on (the default), they’re sent to your configured cloud embeddings API. Turn it off to keep embeddings to a local endpoint only — keyword search is unaffected.A switch for scheduled AI maintenance. Reactivity settings now has a toggle for running scheduled
lint-semantic/maintainrules, which spend your AI key unattended (see Changed).
Changed
Scheduled AI maintenance is now opt-in. Schedule rules that run AI maintenance on a timer used to run automatically; because they spend your AI key without asking, they now run only when you turn on the new toggle in Reactivity settings. (Ordinary directive schedules are unaffected.) If you rely on scheduled
lint-semantic/maintainrules, enable the toggle after updating.
Security
AI features now consistently treat your notes — and the AI’s own output — as untrusted. Hardened the whole AI surface against prompt-injection from note content: the boundary markers that wrap note text for the model are now unforgeable (randomized per call), and every AI helper that reads note text (relevance reranking, the answer groundedness check, tag suggestions, mention disambiguation) wraps it as data, not instructions. AI-generated text can no longer smuggle a hidden agent instruction into a note, and AI-suggested tags can’t inject hidden front-matter.
Agent access keys are now properly confined for AI tools. A folder-restricted API key could previously have whole-vault content read to the AI and have AI maintenance write outside its folder via the semantic-lint, tag-suggestion, maintenance, activity, and health tools. Those tools now honor the key’s folder restriction like every other tool.
Bounds on AI cost and load. Added a generous per-key rate limit on the paid AI agent tools, an upper bound on how many notes one
answercall can pull in, per-note and total caps on the bodies sent to the AI (so a giant note can’t balloon a request), and a size cap on responses read back from AI/embedding endpoints. Whole-vault embedding now saves progress incrementally, so an interruption no longer means re-embedding everything.
0.13.0 — 2026-06-12
A big polish release: Lettuce remembers how you like to read each note, navigation gets faster everywhere, and the Enhanced (AI) view is sturdier and better behaved.
Added
Find in note (⌘F) for Read and Enhanced views. A floating find bar highlights matches as you type; ⏎/⇧⏎ cycle through them (with wrap), Esc closes and clears.
File ▸ Open Recent lists your recently opened vaults, pruned of paths that no longer exist.
⌥⌘1–9 jump straight to your pinned notes — the Note menu shows each pin by name.
Drop a Markdown file anywhere on the window to open it — same flow as opening from Finder (it lands in your vault’s Inbox, or is selected in place).
Titlebar proxy icon. Drag the current note’s file straight out of the titlebar, or ⌘-click the title to see where it lives.
Changed
Each note remembers its view mode. A note you always read in Enhanced opens in Enhanced; your drafting note opens in Edit. Your overall mode also survives relaunch. A remembered Enhanced view is only honored when its render is already cached — it never triggers an AI call on its own.
Double-click the page in Read or Enhanced to start editing — and the caret lands at the exact paragraph you clicked, not at the top of the note.
Esc in the editor returns to Read (after closing any open autocomplete first).
The Inbox group hides while it’s empty instead of sitting permanently in the sidebar.
Fixed
Opening a file from Finder no longer auto-triggers AI generation. If the app was sitting in Enhanced mode, an incoming file used to immediately start a generation you never asked for; external opens now land in Read view (unless that note’s Enhanced render is already cached — then it’s free and kept).
Saving an AI key in Settings now takes effect immediately — the “set up AI” placeholder in the Enhanced view used to stick around until something unrelated refreshed it.
A perpetual ~5s reload loop with Git backup enabled. The app’s own cache writes re-triggered its file watcher, causing endless re-renders and junk auto-backup commits. Internal bookkeeping files no longer count as vault changes.
Headings that start with an emoji get working anchors again. Invisible Unicode marks leaked into section ids, so table-of-contents links and section anchors pointed nowhere — in the app and on published sites.
Collapsed Enhanced sections now render at a uniform title size (an h1 section no longer towers over its h2 neighbours), and a heading containing a link no longer paints the whole row blue.
Security
The Enhanced view treats model output as untrusted input. Model-supplied headings are reduced to a single inert line (no smuggled markdown, embeds, or HTML); the on-disk cache no longer stores any note body (the body is re-derived and re-sanitized locally on every load, so nothing that writes to your vault can plant rendered content); plan fields are length-capped; superseded generations are cancelled instead of billed; and very large notes (>120KB) skip the AI call with a notice.
0.12.1 — 2026-06-11
A small polish release for the Inbox.
Changed
The Inbox is pinned to the top of the sidebar with its own tray icon, instead of sorting alphabetically among your groups — it’s where loose files land, so it now looks and sits the part. (A folder you happen to name “Inbox” inside another group is unaffected.)
0.12.0 — 2026-06-11
Lettuce now remembers exactly where you were — and Markdown files preview properly in Finder.
Added
Start where you left off. Relaunching Lettuce restores the note you last had open and the exact set of expanded sidebar groups, per vault. The restored note’s groups are always expanded so it’s visible; opening a specific file (e.g. from Finder) still wins over the remembered note.
Fixed
Quick Look preview of Markdown files now works. Pressing space on a
.mdfile in Finder renders the note with Lettuce’s reader styling. The bundled Quick Look extension had never worked in shipped builds: macOS never launched it (a missing protocol conformance), and once launched it crashed looking for its stylesheet (a resource path that only existed on the build machine). Both fixed; a missing stylesheet now degrades gracefully instead of crashing.A rare crash when switching vaults mid-edit. The file watcher could trip a deadlock trap if a vault switch landed exactly during a burst of file events.
0.11.0 — 2026-06-11
Markdown files from anywhere on your Mac now feel at home in Lettuce.
Added
Loose files land in your vault’s Inbox. Opening a Markdown file from outside your vault (Finder “Open With”, double-click, drag to the Dock icon) now copies it into an Inbox group in your open vault and selects it there — you stay in your vault, and the note can wikilink, search, tag, and publish right away. Identical re-opens are deduped; name clashes get a “ 2” suffix; your original file is never touched. (With no vault open, loose files still collect in the universal
~/Documents/Lettuce Inbox.)A Lettuce icon for Markdown files in Finder. Once Lettuce is your default Markdown app (Settings → About → “Set as Default Markdown App”), every
.mdfile shows a Lettuce page icon instead of a generic document.
0.10.1 — 2026-06-11
A small quality-of-life release for creating notes and groups.
Added
Choose where a new note or group goes. The New Note / New Group sheet (toolbar and menu) now has a Location picker — pick the vault root or any folder, instead of being silently locked to whatever folder was selected. It still defaults to the current folder, so the common case is unchanged.
“New Group in …” in a folder’s right-click menu, matching the existing “New Note in …” wording (previously “New Subgroup…”).
0.10.0 — 2026-06-11
Bring your notes into Lettuce. This release adds one-pass import from nine other note apps, plus a faster, snappier app on large vaults.
Added
Import from another app. Migrate notes from Obsidian, Bear, Ulysses, iA Writer, Notion, Evernote, Roam Research, Logseq, and Apple Notes — via File ▸ Import… (a guided wizard) or the
lettuce importCLI. Non-destructive (your originals are never touched): each app’s Markdown dialect is normalized, attachments are copied, and you get a migration report. Importing into an existing vault never overwrites.Onboarding “Import from Another App…” — switchers can bring their notes over right from the first-run screen, alongside Open Example / Create New / Open Existing.
Docs: a full
lettuce importreference and a “Migrating from another app” guide in the in-app documentation.
Changed
New notes open ready to type. Creating a note now opens it in Edit mode instead of inheriting whatever view (Read/Enhanced) you were in.
Instant create/delete/move/rename on large vaults. These used to pause while the whole vault was re-scanned from disk; they now update incrementally, so on a multi-thousand-note vault they’re effectively instant (a ~100ms+ stall is gone).
Fixed
Import hardening (from a pre-release audit): non-UTF-8 notes (old Windows/Evernote exports) are no longer silently dropped; a malicious export can’t pull files in via symlinks; Bear
#tag#no longer mangles prose with multiple tags; plus several robustness fixes (corrupt-archive handling, clearer CLI errors).Link resolution after creating a note — a freshly-created note is immediately a valid
[[wikilink]]target from other notes.
0.9.3 — 2026-06-10
A few small AI-settings improvements.
Added
Claude Fable 5 support. Anthropic’s new flagship model (
claude-fable-5) is now offered in the Anthropic model dropdown. Pick it in Settings → AI, or type any model id you like.
Changed
Model picker is now a single combo box. The model field and its presets are combined into one editable dropdown with type-ahead — pick a common model or type a custom one.
Fixed
“Set up AI…” now opens Settings on the AI tab. Previously it opened Settings on whatever tab you’d viewed last (e.g. About), instead of taking you straight to where you add a provider and key.
0.9.2 — 2026-06-09
A performance release — faster launch, snappier editing, and lower memory use, especially on large vaults. Nothing changes about how Lettuce works; everything’s just quicker.
Improved
Faster launch. The window, sidebar, and editor appear right away while indexing finishes in the background, instead of the window waiting on a full scan of your vault. Repeat launches reuse a saved search index and note scan, so they’re quicker still.
Instant saves and live updates. Saving a note — or an edit made by an agent, or one synced in from another Mac — now refreshes just that note instead of re-reading the whole vault (on a large vault, a ~100× cut in work per edit). The reader updates from memory rather than re-reading from disk.
Smoother typing and search. The word count and the search box no longer recompute on every keystroke, so typing in a big note and searching a big vault stay fluid.
Snappier navigation. Switching notes reuses the editor and reader views and caches rendered pages, so flipping between recent notes is instant.
Lower memory use. Note text now lives in an on-disk search index instead of staying resident in memory, embedding vectors are kept at half precision, and Lettuce releases its largest caches automatically when the system is low on memory.
Faster semantic search (Accelerate-backed similarity), and the agent server now builds its link graph only when an agent actually queries — so opening a vault you don’t run agents against does less work.
0.9.1 — 2026-06-09
A first-run fix.
Fixed
New Note / New Group now work before you’ve opened a vault. On a fresh install you can create a note or group straight away — Lettuce sets up your vault folder, then creates it — instead of the buttons doing nothing until you’d opened a vault by hand.
A moved or deleted vault no longer reopens as an empty, unusable window. If the folder your last vault lived in is gone (deleted, moved, or an iCloud vault that hasn’t synced down yet), Lettuce falls back to the start screen with a clear message instead of a phantom “0 notes” vault you couldn’t create in.
0.9.0 — 2026-06-08
Sync your vault across Macs with iCloud Drive, plus versioned local snapshot and Git-history backups — all keeping your notes as plain Markdown at a real path.
Added
iCloud Drive sync. Keep your vault in iCloud Drive and it syncs across your Macs — while the notes stay plain Markdown files at a real path, so Claude Code, the MCP server, and other agents keep reading and writing them normally. Settings ▸ Sync & Backup shows sync status and offers one-click Move Vault to iCloud Drive and Download All Files (for notes not yet downloaded). No data leaves Apple’s iCloud.
Reopen last vault at launch. Lettuce reopens the vault you used last when it starts (so a synced vault comes back automatically). Toggle in Settings ▸ Sync & Backup.
Local snapshot backups. Timestamped
.zipsnapshots stored outside the vault (so iCloud can’t corrupt them), with a retention limit, automatic hourly/daily backups, Back Up Now, and Restore into a new folder (your current vault is never overwritten). Alsolettuce backup/lettuce restoreon the CLI.Git version history. Optionally keep a full edit history in a Git repo stored outside the vault — edits auto-commit a few seconds after you save. Browse versions and restore any one into a new folder, with optional push to a private remote. Also
lettuce backup --git/lettuce backup log.iCloud sync-conflict surfacing. If two Macs edit the same note while offline, iCloud writes a conflict copy. Settings ▸ Sync & Backup now flags “N sync conflicts” with a Review in Finder button so you can resolve them, instead of silently indexing the duplicate.
Improved
iCloud sync hardening. Moving a vault to iCloud no longer carries machine-local state into the synced folder — caches (vectors/passages), last-run timestamps, and the absolute backup location are stripped from the copy, so two Macs don’t spawn conflict copies of internal files or cross-contaminate backup/schedule state. Your notes and automation rules (
schedules.yml,triggers.yml, sidebar order) still sync.Download All Files now waits for downloads to land, reindexes so previously-evicted notes reappear immediately, and reports progress (including a clear “still downloading — check your connection” when iCloud is offline) instead of firing and forgetting.
Backups skip evicted iCloud files. A snapshot or Git commit of an iCloud vault now downloads not-yet-synced notes first, so a backup can never silently capture empty
.icloudplaceholders instead of your content. Scheduled backups defer a tick (and retry) rather than writing an incomplete archive; manual ones warn if files are still downloading.Leaner Git history. The version-history repo no longer tracks the embedding caches, last-run state, or the suggestion queue (they’re regenerable and were committing multi-megabyte blobs on every reindex) — same exclusions snapshots already use.
Consistent snapshots. Snapshot reads are now file-coordinated, so an in-flight iCloud sync write or editor save can’t tear the archive.
Git availability is surfaced. If
gitisn’t installed, the Keep version history toggle is disabled with a one-line hint (xcode-select --install) instead of silently doing nothing.CLI —
lettuce backupprints which vault it’s snapshotting (no silent fallback to the current directory), andlettuce restorerefuses a non-empty destination.
Fixed
A failed Move to iCloud (e.g. out of space mid-copy) now cleans up the half-copied vault so a retry starts clean.
Concurrent Git backups no longer collide. The auto-commit, the schedule poller, manual backups, and a separate
lettuce serveprocess on the same vault are serialized by an advisory repo lock, so overlapping commits can’t fail onindex.lockand silently drop.Restore can’t overwrite your vault. Both snapshot and version restore refuse a non-empty destination, so they can never merge into or clobber an existing folder.
Pushed backups don’t clobber across Macs. Git backup now pushes to a per-machine remote branch (
backup-<host>) instead of force-pushing a sharedmain.Backup location stays outside the vault. Choosing a backup folder inside the vault is now refused (and an in-vault location from a synced
backup.ymlis ignored) — otherwise the archives would ride into iCloud sync, the very thing out-of-vault backups exist to prevent.lettuce backup --keep 0no longer deletes the snapshot it just created (the retention floor is 1).Snapshot timestamps gained sub-second precision so two backups in the same second sort correctly for retention/pruning.
0.8.4 — 2026-06-08
A launch-stability fix.
Fixed
Launch reliability — API keys are now read from the Keychain off the main thread. If macOS ever shows a Keychain access prompt at startup, it can no longer stall the app while it’s coming up; the window stays responsive and the local server starts once the keys resolve.
0.8.3 — 2026-06-08
Added
Set as default Markdown app. Settings ▸ About has a one-click “Set as Default Markdown App” button — open
.mdfiles in Lettuce by default (and a green confirmation once it’s set). Lettuce still doesn’t claim the default on install, so it never hijacks your existing editor; it’s opt-in.On-device crash logging. If Lettuce ever crashes, it now records a backtrace to its local log (Settings ▸ About ▸ “Reveal log” / “Report a bug”) so you can attach it to a report. Stays entirely on your machine — no network, no third-party analytics, consistent with the rest of the app.
0.8.2 — 2026-06-08
A settings-and-consistency pass that tidies the preferences window, the inspector, and the automation editors.
Improved
Settings — every tab uses the same grouped style (Reactivity rebuilt to match Appearance/AI/Agents), each pane sizes to its own content (no more window jump or scrollbars), and the model selector is a clear field + Presets menu instead of a confusing dual control. The preset lists now cover current models per provider (Anthropic, OpenAI, Gemini), and the field still accepts any custom model ID.
Reactivity editors — adding a trigger or schedule now offers a folder picker: pick a vault folder to fill
file:created:<folder>/**(triggers) or<folder>/{{date}}.md(schedules), instead of hand-typing the path.Inspector — the Outline, Agent edits, and tag/search lists now match the Links panel’s clean styling, and empty states (“No notes”, “No tags”, “No results”, “Ask anything about this note”, …) are unified on one consistent component.
Fixed
The model selector (in Settings and first-run onboarding) no longer shows a phantom second model value next to the field.
0.8.1 — 2026-06-07
A UI-polish release that sharpens the inspector, the sidebar, and the everyday controls.
Added
Text zoom — press ⌘+ / ⌘− to scale the editor and reading text anywhere in the app (kept in sync with Settings ▸ Appearance).
Improved
Links inspector (was “Backlinks”) — renamed to reflect what it actually shows. Its sections (Backlinks, Related by tag, Unlinked mentions, Unresolved links) now carry item counts, start collapsed as a tidy stack, expand on click, and each has an ⓘ that explains it. Stray separator lines are gone.
Linking a mention now confirms in place — the row becomes “✓ Linked — now in its Backlinks” and the section stays put, instead of silently vanishing.
Recent in the sidebar matches the folder rows (same disclosure arrow and spacing) and starts collapsed.
New Note / New Group buttons have proper hover feedback, and the name dialog matches the app’s other sheets (icon + title header, grouped form, prominent Create).
Tidier toolbar — the theme/text-size menu moved out; theme, font, and size live in Settings ▸ Appearance.
Consistent dialogs & messages — trigger/schedule editors match the standard sheet style, and status/error text uses uniform typography.
Fixed
The window no longer clips the sidebar or shifts the toolbar at its smallest size.
The starter example vault is tucked under a Sample vault folder so it doesn’t clutter your notes.
0.8.0 — 2026-06-06
A workflow-and-polish release: a live AI-enhanced view, a universal Inbox for loose Markdown files, a real menu bar with Markdown formatting shortcuts, and a refreshed sidebar.
Added
Enhanced view. A third mode beside Edit and Read renders the AI-structured version of a note — collapsible sections with ✨ summaries — live in the app, not just when publishing. Generated on demand and cached; links navigate just like the reader, and a tasteful loading view keeps your place while it generates.
Universal Inbox. Open any loose
.mdfrom anywhere — Finder’s “Open With”, drag onto the app, or the command line — and it’s collected into~/Documents/Lettuce Inboxinstead of turning its folder into a vault. Originals are left untouched (copied, and de-duplicated). Reach it any time from File ▸ Open Inbox.A proper menu bar — new File, View, Format, and Note menus with standard shortcuts (New Note ⌘N, Open Vault ⇧⌘O, Save ⌘S, Export…, and more); actions are no longer toolbar-only.
Markdown formatting shortcuts — ⌘B/⌘I bold/italic, ⌘K link, ⌘1–3 headings, ⌘⇧8/⌘⇧7 bullet/numbered lists, from the new Format menu.
Drag to reorder notes in the sidebar, and AI setup during onboarding (pick a provider, model, and key on first run).
Improved
Sidebar — New Note / New Group now live in the sidebar where your notes are; folders expand in place; the Recent section collapses; and search (“Search contents”) is clearly distinct from Quick Open.
Settings split into focused Appearance, AI, and Agents tabs.
The window remembers its size and position across launches.
Faster on long notes — the reading view renders off the main thread, so opening a big note no longer hitches.
Cleaner inspector and controls — the cramped icon row became a labelled menu; consistent empty states; VoiceOver labels on icon-only buttons; clearer reveal/copy affordances for keys.
Fixed
Notes no longer show their title twice when the first line repeats the note name.
0.7.2 — 2026-06-03
A retrieval-quality and answer-reliability release.
Improved
Much better natural-language search — questions phrased as full sentences now match far more reliably (docs-eval hit-rate 4.5% → 77%), so “ask the wiki” and agent search find the right pages instead of coming up empty.
Fixed
AI answers no longer fail silently under load. Transient provider errors (rate limits, 5xx, network blips) are retried automatically, so a single hiccup during a burst of questions no longer collapses an answer to a generic “couldn’t synthesize” message.
Real failures are now actionable — an expired key or a rate limit is surfaced as “Couldn’t reach the model — <reason>” alongside the retrieved pages, instead of masquerading as “the wiki has no answer.”
Embedding long notes no longer fails on context-length overflow — oversized inputs are truncated and retried.
0.7.1 — 2026-05-30
A reliability, safety, and security-hardening release — and the first build with built-in auto-updates.
Added
Automatic updates via Sparkle — Lettuce can update itself (Settings → About → Check for Updates).
Connect an agent wizard for Claude, OpenAI, and Gemini (Settings → Agent API server).
Universal binary — runs natively on both Apple silicon and Intel Macs.
In-app Report a bug and Reveal log, plus an on-device diagnostic log for support.
Fixed
Never lose unsaved edits — the editor now autosaves when you switch notes or quit the app.
Delete Group and Move to Trash now ask for confirmation before deleting.
The agent server reports clearly when it can’t start (e.g. the port is already in use) instead of showing a false “Running”.
AI errors now show the real provider message instead of a cryptic code.
A clearer first-run permission prompt, and status is visible before a vault is open.
Security
Two rounds of security + launch hardening: prompt-injection fencing across the AI features, an embeddings-privacy gate (note text isn’t sent to OpenAI unless you choose an OpenAI-compatible provider), request resource caps, the agent token kept out of logs, reserved-directory write protection, and complete third-party license notices.
0.7.0 — 2026-05-30
The LLM-wiki release — turn your vault into a compounding knowledge base your agents can search by meaning, answer questions from, and keep current.
Added
Semantic search.
semantic_search(andlettuce search --semantic/--hybrid) finds notes by meaning, not just keyword overlap — optionally fused with BM25 keyword ranking. Needs an embeddings provider (any OpenAI-compatible endpoint, including a local model like Ollama).Ask your wiki (RAG).
answer(andlettuce answer <vault> <question>) retrieves the most relevant passages from your notes and writes a cited answer grounded only in them — passage-level retrieval with verbatim quoted spans, plus optional reranking, query expansion, link-graph–aware retrieval, and a faithfulness self-check. Ask the wiki, not the model.The LLM-wiki loop.
lettuce wiki initscaffolds a compounding wiki;lettuce ingest <url | file | dir>pulls sources into a rawsources/layer (readability for web pages, PDFKit for PDFs, pandoc for docx/epub/odt/…); thefile_pagetool writes a durable page and keepsindex.md’s catalog andlog.mdin sync. Capture → compile → query → compound.More retrieval & upkeep tools:
related_notes(meaning-based “suggest links”),find_duplicates,topic_map(cluster notes and flag clusters with no hub page),wiki_health(a 0–100 score),recent_activity,lint --semantic(an LLM health check for contradictions, stale claims, missing concepts, open questions, and sources worth ingesting),wiki_maintain(files those findings as> [!ai]directives), andeval(recall@k / MRR / answer-faithfulness against your own question set).Passage-level embeddings. Notes are chunked into section-sized passages and embedded individually, so
answerfeeds the model the specific passage that bears on a question instead of whole notes.
Changed
Embeddings stay live. A changed note is re-embedded automatically before the next semantic query, so retrieval always reflects your latest writes;
reindex_embeddings/lettuce embedforce a full rebuild.Headless self-maintenance. A long-running
lettuce servepolls.lettuce/schedules.ymlevery 60s, so scheduled> [!ai]directives and maintenance passes fire even with no GUI open.Documentation. A multi-round, code-grounded audit brought the in-app documentation and the published docs site into exact agreement with the shipped CLI / MCP / config / automation surface.
0.6.1 — 2026-05-29
A security & correctness hardening release from a full multi-agent audit of the server, rendering/publish, vault, and GUI layers. No new features; no API or vault-format changes. Recommended for anyone exposing their vault to AI agents or publishing a public site.
Security
Rendering & publish (stored XSS / local-file exfiltration). Every link and image URL emitted by the Markdown renderer is now validated against a scheme allowlist (with control characters stripped), so a
javascript:/data:URL in note content can no longer execute in the published site or the in-app reader. A Content-Security-Policy is applied to both the published pages and the reader, and the reader WebView only navigateshttp(s)/mailto. Published image sources are confined to the vault — absolute paths,.., and symlink escapes are rejected — so a crafted note can’t copy a local file into the public site.Folder-scoped API keys. Vault path handling is unified through a single canonical form that rejects
.., so afolderAllowlist-scoped key can no longer reach notes outside its folder via traversal or a symlinked parent directory. Catalog, search, and mention reads now filter results by the key’s allowlist on both REST and MCP.Frontmatter patches validate the key and reject control characters, so an agent can no longer inject additional YAML keys (e.g. flip
published: trueon a private note).Denial of service. An out-of-range numeric tool argument no longer crashes the server; web ingestion now blocks loopback/link-local/private hosts (SSRF) and caps response size, time, and redirect hops.
Fixed
writein append/prepend mode no longer replaces a note’s contents when the existing file isn’t valid UTF-8 (silent data loss).Proposal and agent-edit operations validate identifiers and respect the key’s folder scope; the editor soft-lock can no longer get stuck as a permanent per-note write block.
Move proposals disclose the wikilink-rewrite blast radius (“also rewrites N other notes”) in the review diff.
A range of robustness fixes: git-deploy hardening, hung-subprocess timeouts, concealed-clipboard for copied secrets, correct CLI exit codes, bounded glob matching, NUL-safe full-text indexing, and AI-enhancement plan/cache correctness.
Changed
Vault writes now reindex incrementally (only the edited note’s search row, tags, and link edges) instead of rebuilding the whole index on every edit, so writes stay fast at scale.
Test infrastructure
Six new regression suites covering the audit fixes; the full suite is now 1,328 XCTest cases (all green), plus the jsdom JS suite.
0.6.0 — 2026-05-28
The agent collaboration release. Twelve features that change how humans and AI agents work together inside the same Markdown vault, capped by Suggestions mode — a propose-then-review pipeline so an agent’s writes can show up as diffs in the GUI before they hit your files. Plus a substantial production hardening pass: 770 new tests, mutation testing, property-based fuzzing, HTML snapshots, performance budgets, and CI scripts for code signing, build determinism, and dependency audits.
Added
Suggestions mode (Tier 3)
Propose-only API keys. Mark a key with
--propose(CLI) or the toggle in Settings → API keys. The agent’s writes are queued asProposals under.lettuce/proposals/<id>.jsoninstead of committing directly. The user reviews each one with a unified line-by-line diff and accepts (commits through the normal write path) or rejects (discards).Per-row staleness detection — if the file changed between proposal and accept, the user sees the reason (
contentDrifted,targetAlreadyExists,sourceMissing,destinationOccupied) rather than a silent overwrite.Two new MCP tools for agents to manage their own queue:
list_my_proposalsandwithdraw_proposal. Per-key ownership: agents can only see + cancel their own.GUI: new “Proposals” inspector tab with badge count, per-row
+N/−Mline deltas, and an Accept / Reject / Show-in-note modal.REST parity: PUT/PATCH/DELETE/POST move on
/api/v1/notes/**and/movenow honorproposeOnlythe same way MCP does — REST is no longer a Suggestions-mode bypass.
Reactivity (Triggers + Schedules)
Triggers:
.lettuce/triggers.ymlrules that fire on events (today:file:created:<glob>) and inject> [!ai] <prompt>directives into the affected note. Glob patterns support**(any depth) and*(within segment), segment-bounded.Schedules:
.lettuce/schedules.ymlrules withdaily HH:MMorweekly <Day> HH:MMthat append directives to a templated target note ({{date}},{{year}},{{week}}). Idempotent re-fire; one-time catch-up when offline.Reactivity tab in Settings with add/edit/delete sheets, validation, and live
{{date}}preview.
Agent collaboration primitives
AGENTS.mdconvention at vault root, auto-surfaced inget_vault_infoas theagentsFilefield. Newlettuce agents initCLI scaffolds a starter tailored to the vault’s actual folders + tags.@handlementions in note bodies, exposed via theagent_mentionsMCP tool. Email-like patterns and code spans excluded.> [!ai]directives — Markdown callouts that flip to[!ai-done]when an agent callscomplete_directive(path, line, response?). Optional response splices back into the same callout, attributed.Agent edit timeline pane in the inspector. Today/Yesterday/Earlier-this-week buckets, per-edit
+N/−Mline deltas, revert button, and “mark reviewed” badge clearing.Scoped API keys: per-key
folderAllowlist(e.g.["Inbox", "Areas/Work"]) enforced on REST and MCP forpath/from/toargs.Multi-key UI in Settings → API keys with add / remove / reveal / copy / mode toggle.
Ask an agentinspector pane — inline chat conversation about the current note, with “Insert into note” buttons per assistant reply.Command palette (⌘⇧K) for one-shot AI actions: TL;DR, outline, proofread, next-steps, tighten, summarize.
Ergonomic MCP tools
read_outline(path)— heading outline (level + title + anchor id) without the body. Cheaper thanread_notewhen you only need structure.link_graph(path, depth)— BFS the local subgraph (both outbound + inbound) around a note up to depth 5. Build a context bundle without N round-trips.apply_edits(path, edits)— atomic find/replace edits to a note. Eachfindmust match exactly once; the whole call rolls back if any fails.
Documentation vault
Bumped to version 6 with new recipe pages: Daily Triage Agent, Research Assistant, Tag Curator, and Suggestions Mode. The index links every recipe; agents reading the docs vault can self-onboard to the conventions.
Fixed
Symlink out-of-vault exfiltration (security). A symlink inside the vault pointing to a path outside it (e.g.
~/.ssh/id_rsa) could be read via the REST/MCPread_notetool.VaultService.fileURL(forRelativePath:)now re-validates the symlink-resolved path is under the vault root.REST endpoint bypass of Suggestions mode (correctness). A propose-only key using REST instead of MCP would commit directly. All four REST write endpoints (PUT/PATCH/DELETE/POST move) now route through the proposal store the same way MCP does, returning
202 Acceptedwith{status:"pending", proposalId:…}.MCP write tools didn’t propagate identity to
agent:attribution. Every MCP write was logged as the generic"agent"and triggeredfile:createdrules recursively. Tools now threadidentity.labelthrough; the agent-edit timeline shows the real agent + triggers correctly skip agent-attributed writes.
Changed
MCPTool.callsignature gained anidentity: APIIdentityparameter. All built-in tool closures updated;list_my_proposalsandwithdraw_proposalare now first-classMCPToolentries (previously inline) so they’re discoverable viatools/list.DocsVault.ensure(at:refresh:)added alongside the existingensure(refresh:). The new variant takes an explicit directory so tests can drive the regenerate-vs-skip logic without touching~/Library/Application Support/Lettuce/Documentation.APIKey.proposeOnly: Boolfield added. Decoder defaults it tofalseso legacy Keychain blobs round-trip cleanly on upgrade.
Test infrastructure (development-only — no runtime change)
+770 tests, +159% growth — from 484 to 1,254 XCTest cases plus 10 Swift Testing tests as a migration sample.
Property-based fuzz tests with seeded LCG (reproducible via
LETTUCE_FUZZ_SEED). 12 properties × 100 iterations per run, exercising the markdown pipeline + sanitizer + slug + frontmatter + wikilink + typography paths.HTML rendering snapshots for 10 canonical inputs — committed under
Tests/LettuceKitTests/Snapshots/HTMLRender/. Drift fails with a diff path.Performance budgets on 8 hot paths (render, link/tag/search index rebuild, mention scan, lint) with loose ceilings sized for CI variance.
Public API surface snapshots for LettuceKit (450 lines) + LettuceServer (214 lines). Renaming a public method drifts the snapshot.
Schema contracts for
.lettuce/triggers.yml,.lettuce/schedules.yml,.lettuce/schedule-state.json,.lettuce/proposals/<id>.json, and theAPIKeyKeychain blob (with legacy-shape backward compat).Mutation testing —
Scripts/test-mutations.shruns 10 hand-curated mutations across 4 source files (Triggers, Slug, Tag, Frontmatter); 10/10 caught. Found and plugged one real test-suite gap.Secret leak scanner — pattern-based regex check on every commit (Anthropic / OpenAI / GitHub / AWS keys).
Public-doc baseline + TODO/FIXME baseline — set-difference snapshots so new gaps fail without forcing a flag-day cleanup.
Scripts + CI
Scripts/test-ui.sh— gated XCUITest-style app launch tests via subprocess (SwiftPM testTargets can’t host XCUITest natively; this is the pragmatic alternative).Scripts/test-sanitize.sh—swift test --sanitize=thread.Scripts/test-leaks.sh—leaks --atExit -- xcrun xctest.Scripts/test-signing.sh—codesign --verify, Gatekeeper assessment, and notarization-staple check (--strictfor release verification).Scripts/test-determinism.sh— two clean release builds, byte-compares the binaries (accepting LC_UUID as upstream non-determinism).Scripts/audit-deps.sh— Swift dependency tree + Package.resolved pins +npm auditfor Tests/js.Scripts/test-mutations.sh— hand-curated mutation testing across multiple target files..github/workflows/test.yml— 4 jobs on every push: swift, js (jsdom), ui (app launch), secret-scan (regex pre-flight on Ubuntu). Concurrency-cancels stale runs.
Known limitations (deferred)
Multi-file proposal bundles. A
move_noteproposal records the rename as one file-state-change; cross-note link rewrites happen as a side effect of accept but aren’t visualized in the diff sheet. Planned for v2 of Suggestions mode.Modify-and-Accept (user tweaks the proposed diff before committing). Today: accept or reject; no inline edit.
“Accept all from agent X” bulk action — one-line UI add when there’s demand.
Folder operations (
create_folder/rename_folder/delete_folder) are rejected from propose-only keys in v1. Multi-file ops would need bundling.
0.5.0 and earlier
See git history. 0.5.0 shipped the initial Markdown editor, vault watcher, embedded HTTP + MCP server, publishing pipeline (static site + GitHub Pages deploy), LLM enhancement (Anthropic / OpenAI / Gemini), and the LLM-wiki ingest/query/lint workflow.