OpenKnowledge

v0.42.0

Released Jul 29, 2026. Part of the OpenKnowledge changelog.

Minor Changes

  • Report a bug now keeps a history of your reports so a send that fails (or a dialog you closed) no longer means starting over. Each report you generate is saved with its last-known state, and you can find it again from a new "Bug report history" command in the palette or from a "Previous reports" section in the Report a bug dialog. From the list you can retry sending an existing report without regenerating it, reveal its file in Finder, or delete it. Retry re-sends the exact bundle you already made, so a report that failed the first time can reach the team on the next try, and the history survives closing the dialog and restarting the app.

    Reports are also cleaned up automatically. Once a report is confirmed sent, its (potentially large) zip is reclaimed from disk while a lightweight record of the send is kept, and unsent reports are bounded so old bundles do not pile up. The most recent report you have not sent is never removed. Everything stays on your Mac, redaction is unchanged, and reports are only ever sent when you choose to send them.

  • Frontmatter schemas now accept draft-06, 2019-09, and 2020-12 in addition to draft-07.

    Any of four dialects, validated against its own rules. A schema file declaring draft-06, draft-07, 2019-09, or 2020-12 is compiled against that dialect, so $defs, prefixItems, dependentRequired, and the rest behave as their spec says rather than being ignored. Each URI is accepted in http or https form, with or without the trailing #. Previously anything but draft-07 was skipped entirely with a configuration problem telling you to downgrade — a 2020-12 schema, which has been the current dialect since 2020, got you no validation at all.

    An absent $schema still means draft-07, and that is still what gets scaffolded. Creating a schema from Settings ▸ Plugins ▸ Frontmatter schemas writes the draft-07 skeleton as before: it is the most broadly supported dialect among external tools, and the friendly subset the Fields editor writes is spelled identically in all four. Nothing about an existing project changes.

    format keeps asserting on every dialect. From 2019-09 on, the spec demotes format to an annotation validators may ignore. OK asserts it everywhere instead, so raising a schema's $schema line never silently switches off format checks it already had. This is deliberately stricter than the spec.

    Dialects older than draft-06 are still skipped, now with a configuration problem that names what is supported instead of demanding draft-07.

    Fixed: editing a schema that declares $id silently stopped it validating. The validator instance outlives any one schema and registers each compiled schema under its $id, so recompiling an edited file whose $id was unchanged was refused — and because compile failures are swallowed by design, the governed documents just quietly stopped reporting violations until the process restarted. The stale registration is now dropped before recompiling. This bug predates dialect support and affected draft-07 schemas equally, but $id alongside $defs is idiomatic in 2019-09 and 2020-12, so it would have been far easier to hit.

    The no-code Fields editor and the property panel needed no changes: both were already dialect-agnostic, reading only the friendly subset (type, enum, items.enum, pattern, format, description, required) and preserving every other keyword verbatim. A 2020-12 schema opens in Fields and round-trips with its $defs, $id, unevaluatedProperties, and prefixItems intact — prefixItems is not modeled, so it appears in the existing "advanced rules" note alongside allOf.

Patch Changes

  • Fix microphone access for CLI tools run in the OpenKnowledge terminal on macOS.

    Any tool that asked for the microphone from a shell launched inside the app failed silently. No permission dialog appeared, OpenKnowledge never showed up under System Settings → Privacy & Security → Microphone, and from the tool's side recording simply captured silence with no error — so there was no way to grant access and no signal that anything was wrong.

    macOS attributes a permission request to the responsible process — the top-level app that started the chain — not to the process that actually asked. A tool running in the terminal therefore requests the microphone as OpenKnowledge. Under Hardened Runtime the app must carry com.apple.security.device.audio-input to be eligible to prompt at all; the app was missing it, so macOS denied every request without ever showing a dialog. The entitlement is now declared on the main app bundle, matching how VS Code, Zed, Ghostty, and Cursor ship the same capability.

    The consent dialog's text is now declared by the app as well. It previously fell through to Electron's stock string ("This app needs access to the microphone"), which described the wrong thing — the app records no audio of its own. It now reads "A program running in OpenKnowledge's terminal wants to use the microphone," so the permission being granted is accurate at the moment it is granted. Granting it covers any tool run in the terminal; macOS shows the recording indicator whenever the microphone is live, and access stays revocable in System Settings.

    The entitlement is deliberately scoped to the main app bundle and not to helper processes, and the camera equivalent is not included.

  • Add Back and Forward navigation to Open Knowledge Desktop's expanded sidebar, collapsed title bar, View menu, command palette, and platform shortcuts. Opening files, folders, assets, or skill files now adds an entry to the navigation history, while history traversal reuses the active tab.

    Move file-tree actions beside the project root, improve shortcut hints and navigation grouping, and fix Cmd/Ctrl+Shift+N so New folder no longer opens the New file dialog.

  • Stop the slash menu from silently replacing an adjacent image or component on insert.

    Picking a slash-menu item used to delete the typed /trigger in one editor transaction and run the item's insert in a second. Under load, a transaction fired during the delete (for example the collaboration layer reacting to it) could move the selection onto a neighboring selectable block, and the insert would then overwrite that block instead of inserting at the caret: the user typed /image, pressed Enter, and a previous image vanished with no error and no useful undo trail. The trigger delete and the item insert now land as one transaction, so nothing can divert the insert onto existing content. The other insertion menus (# tags, [[ wiki links, @ mentions in the Ask AI composer) already inserted atomically and are now guarded by a lint rule and regression tests so none of them can regress to the split form.

  • Harden tooltip coverage by exercising the real tooltip primitives in component tests and preventing mocks that hide provider or event-composition regressions.

View v0.42.0 on GitHub