v0.58.1
Patch Changes
-
Prepares share links to work correctly for projects whose Open Knowledge content lives in a subdirectory of the repository (configured with
content.dir). Existing share links are unaffected. -
The new-file keyboard shortcut now skips the dialog when there is nothing to ask. With no template resolved for the folder you're creating in, the only field left was a name you were about to retype in the editor anyway, so the shortcut creates an
untitleddoc (thenuntitled-2,untitled-3, …) and opens it straight away. Add a template for the folder and the dialog comes back, because now there's a real choice to make. The New file dialog itself also drops the "Start from" picker entirely when no templates resolve, instead of showing an empty picker plus a hint — that applies to every surface that still opens it (file tree, command palette, folder overview). -
Stop an app-shell crash from deleting a file you are in the middle of creating, and stop the crash-recovery button from walking you back into the same crash.
If the app shell crashed while an inline file or folder create was still open, the crash unmounted the file tree and its cleanup hard-deleted the file you had just made. The cleanup could not tell an error-boundary unmount apart from you cancelling the rename, so it deleted in both cases. The two are now distinct intents. Cancelling a rename still removes the placeholder exactly as before, including the delete and the return to your previous location. A crash or an ordinary unmount now leaves the created file exactly where it was created. It is not deleted and it is not moved to Trash, because a crash is not a retraction of your request to create the file.
A cleanup failure is now reported to a log channel that lands in the diagnostics bundle, carrying the file kind and path, so a cleanup with no surviving UI to show a toast no longer fails silently. Reporting a failure is no longer tied to whether the cleanup can update the UI.
On the recovery side, the app-shell error screen's Try again no longer replays the document that caused the crash. Previously it remounted the app, which re-read your saved tab session and reopened the very document that had just crashed, so Try again deterministically re-crashed. A repeat crash on the same error now skips the saved tab session restore, and the app comes back without the crashing document. This covers both ways a session is restored, the synchronous web path and the desktop session state, so it holds in the packaged desktop app and not only in the browser. When a restore is skipped, a notice tells you that your last open document could not be restored, so the empty workspace reads as a deliberate recovery rather than a forgotten tab. The notice is translated in every supported locale.
A recovery that skips the restore also stops saving your tab session for the rest of that recovery, so the tabs you had before the crash are still waiting for you the next time you launch. Without that, the first document you opened after the recovery would be written over the whole stored session and every other tab, pin and split would be gone.
Known limitation: the skip lasts for the current session only, so it never becomes permanent and a later reload restores your tabs normally. The trade-off is that if the crashing document is still the one saved in your tab session, relaunching the app can reopen it and reproduce the crash. Durable recovery needs to identify the offending document reliably, which the app-shell error boundary cannot do today because it also catches crashes that originate outside the document view.
The delete endpoint itself and the underlying render loop that triggered these crash reports are unchanged.
-
Starter pack cards now say what a pack contains and what clicking one does. Each card shows a "N files · N folders" count and a "See what's added" footer, so it's clear the click opens a preview rather than installing anything, and hovering (or focusing) a card lists the folders the pack scaffolds with a one-line summary for each. The Navigator's starter-pack pills, which previously showed only a name, now show the pack description on hover.
-
Settings got a simpler sidebar with clearer ownership. "This project" now has a Preferences page, mirroring the one under User, and the attachment-location control moved there from User → Preferences, where it wrongly suggested a personal setting (it writes the shared project config; it now carries a Project scope badge). Content rules and Terminal folded into the same page as blocks under one page title. Sync and Config sharing merged into one "Sync & sharing" page. Everything that moved is still searchable by its old name, and old settings deep links land on the page that absorbed them.
-
Stop re-seeding the built-in skills into agents you removed them from
Seeding
open-knowledge-discoveryandopen-knowledge-write-skillran on every
launch and topped the bundles back up into every agent folder on the machine, so
uninstalling one from a single agent was undone the next time OpenKnowledge
started. Agents that read the shared~/.agents/skillshub also ended up with a
second copy under their own path and reported a name collision.Seeding is now a first-run act: once a bundle exists anywhere the user can reach
it, its host set is theirs to choose and the sweep leaves it alone. A machine
where the bundle is absent everywhere still gets the full set, so a fresh install
is unchanged.Uninstalling a built-in from one agent also works now — the reserved-name gate
that guards authoring was rejecting the lifecycle verbs too. -
Fixed MCP write tools (
write,edit,move,delete, and related) returningHTTP 401when the server runs behind an authenticating reverse proxy with--external-url/OK_EXTERNAL_URLset to the public origin. The tools' internal server-to-self API calls were being issued against the public, auth-gated URL, so they hairpinned out through the proxy and hit the login gate instead of the local server. These self-calls now always target loopback, so a singleOK_EXTERNAL_URLpointing at your public origin gives working remote UI, reads, and writes at once. User-facing preview and share links are unaffected — they were never derived from this URL. -
For fresh PATH setups, the desktop app now adds the
okcommand to Fish only when Fish is the login shell or has independent usage or configuration evidence. New Zsh and Bash setups no longer create an unused Fish configuration file; files recorded by older installs remain available to Settings andok uninstallfor cleanup. -
Fix the ACP failed-to-start surface. A retried launch that failed the same way each time used to stack three visually-identical
"Claude couldn't start · initialize failed: ACP connection closed"cards in the transcript — with the real error buried under a wall of unrelatednpm warn …lines behind aShow detailstoggle, and theRetrybutton only on the last card. The card now coalesces adjacent identical failures into one entry (with a subtle(N attempts)count), pulls the primary error line out of the stderr tail and surfaces it under the headline, and colorizeserror/warnlines when the reader does expand the full detail. Retry is always on the active card because there's now only one. -
Fix Claude Agent (and any npx-launched ACP agent) failing to start in the desktop app when OK is run through
pnpm dev. pnpm broadcasts itspnpm-workspace.yamloverridesblock to every child vianpm_config_overrides, in pnpm's flatparent>childkey shape. The ACP subprocess re-entered npm throughnpx exec, arborist rejected the flat key, and launch crashed withnpm error Override without name: <parent>><child>. Agent launch now drops that one env var before spawn; every other npm env — user-set (npm_config_userconfig, nerf-darted auth tokens) or merely-warning pnpm broadcasts — still reaches the spawned agent. -
Add native Excalidraw drawing-canvas support for
.excalidrawfiles. Opening one in the editor now mounts an infinite canvas board; changes serialize to the file'sY.Text('source')as an Excalidraw JSON snapshot and sync live across peers.Scoped to the
.excalidrawextension only..canvaswas intentionally left alone — it's already Obsidian's canvas JSON schema, which the text viewer opens with syntax highlighting; Excalidraw can't parse it. -
The desktop app's Move-to-Trash confirmation dialog now shows the actual file name instead of the literal placeholder
{name}. The bug was an ICU-MessageFormat escape hazard: the source string wrapped the interpolation in single quotes ('${name}'), and ICU treats a'…'-wrapped section as an escape that renders its contents verbatim — so the compiled message catalog stored one flat string with no interpolation slot and the runtime displayedAre you sure you want to delete {name}?to the user. Switched to double-quote wrapping (which matches the rest of the app's convention and has no ICU escape meaning), added a regression guard test, and refreshed all eleven translated locales. -
In-app agents now know they're talking to Open Knowledge. The ACP handshake identifies the app by name and version (the protocol's
clientInfofield), so agents can show which client is driving them, cross-implementation debugging gets version context, and Open Knowledge is counted correctly in ACP ecosystem usage metrics instead of appearing as an anonymous client. -
Blob Run goes back to being a secret, and reads better once you find it. The Resources menu no longer lists the game — the mascot gesture, the command palette, and the mascot button on the connecting banner still open it — and the Community section now leads with GitHub, then X, then Discord. Waking the game from the mascot takes eight rapid clicks instead of four, and a burst that is already in flight is no longer restarted by the clicks that follow it, so the fireworks the clicking earns actually get to play. In the game itself, the score moved from the far corner of the track to directly under the blob, where the player is already looking, and the key names in the hint line now render as keycaps.
-
MCP tools now declare their schemas as JSON Schema 2020-12, so clients that validate structured output no longer reject the entire tool surface. The MCP SDK converts our tool schemas without specifying a target dialect, which lands on draft-07, and a client validating against the declared dialect refuses to compile the schema and drops the tool before it can run. Because every OpenKnowledge tool declares an output schema, one strict client turned that into a total MCP outage: no reads, writes, or searches succeeded. Only the declared label was wrong, never the schemas themselves, so this is a relabel with no change to what any tool accepts or returns.
-
Reopening the app while a macOS update is still installing no longer shows a false "Update to X didn't install" notice, and no longer spends one of the three chances that notice gets. The install runs after the app quits, inside a separate process the next launch cannot see, so reopening a minute later booted the old version and that was read as a failed install. It was also self-defeating: the reopen is what interrupts the install, and an interrupted attempt re-stages, so the update being declared dead is the one that would have landed on the next quit. The app now holds the verdict while the install may still be underway, and reports a genuinely failed install on a later launch instead.
The wait now runs from the moment the install actually starts, which is when you quit or click Relaunch now, rather than from when the download finished. An update that downloaded quietly in the background hours before you quit still gets the full window.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon | OpenKnowledge-arm64.dmg |
| Windows | x64 | OpenKnowledge-Setup-x64.exe |
| Windows | arm64 | OpenKnowledge-Setup-arm64.exe |
| Debian / Ubuntu | x64 | OpenKnowledge-amd64.deb |
| Debian / Ubuntu | arm64 | OpenKnowledge-arm64.deb |
| Fedora / RHEL | x64 | OpenKnowledge-x86_64.rpm |
| Fedora / RHEL | arm64 | OpenKnowledge-aarch64.rpm |