OpenKnowledge
Changelog

v0.72.0

Released Sep 14, 2026.

Minor Changes

  • Allow individual list items and selected groups to be dragged within a list or elsewhere in a document, preserving task states and renumbering every item of each affected numbered list. Moving a whole numbered list preserves its authored numbers unless its items merge into another list. Use Cmd+Shift+↑ or Cmd+Shift+↓ on macOS (Ctrl+Shift+↑ or Ctrl+Shift+↓ on Windows and Linux) to move the current list item or selected neighboring items with the keyboard.

  • Show "By meaning" in the omnibar for a keyless loopback embeddings endpoint.

    With semantic search enabled and the endpoint set to a loopback address (localhost, 127.0.0.1, or [::1]), OpenKnowledge already treats a missing API key as "not required": the connection test passes, ok embeddings status reports the key as not required, and the server embeds without an Authorization header. The omnibar ignored that and only offered "By meaning" once a key was stored, so the search never fired and, because indexing starts on the first "By meaning" search, the corpus never embedded either. Adding a placeholder key was the only way to unblock it.

    The omnibar now offers "By meaning" whenever semantic search is enabled and either a key is stored or the endpoint does not need one. Semantic search responses distinguish indexing, no match, a short query, an incapable configuration, retryable provider failures, and repeated vector-size drift that requires restarting OpenKnowledge. An endpoint that ignores explicitly configured dimensions now stops with a Settings remedy instead of looking perpetually unfinished. Indexing keeps the coverage banner and polling active, a completed search with no vector match shows no results, retryable provider failures show retry and pause coverage polling, and terminal vector-size drift shows its restart remedy without offering a retry. A transient status-probe failure retains the last known capability and retries automatically, while a malformed response uses a generic retry state without arming the status poller. Non-loopback endpoints without a stored key are unchanged: the pill stays hidden and the connection test still reports a missing key.

Patch Changes

  • Settings > Agents now states when an integration only supports global configuration instead of silently omitting the project section.

  • Open the selected terminal agent's setup dialog from Connect tools. Terminal agents now use the same MCP connection checks as Agent connections in Settings. Canceling setup keeps the warning available, and completing setup refreshes it. After installing tools from the terminal or Settings, a notice lets affected open terminal sessions in the same window restart to use them. A failed connection check keeps Retry available until it succeeds. Dismissing a warning remains specific to that notice and terminal session.

  • Reloading the desktop app's window right after you close or restart a terminal no longer brings the closed session back. It used to come back as an extra tab bound to a shell that was already shutting down, and after a restart that tab carried the same name as its replacement, such as a second Terminal 2. A session now leaves the window's session list when you close or restart it, rather than when its shell finishes exiting.

  • The line your cursor is on is scrolled clear of the Ask AI composer whenever the composer comes back over a document. That is bringing it back from its status-bar badge or with the Ask AI keyboard shortcut, and closing the terminal, the agents panel, or a diff view so the composer returns over the document you were reading. Pressing the shortcut while the composer is already up focuses it without moving the page.

    Only the visual editor used to do this. The clearance now also holds in markdown source mode, in any file the editor opens in a text view (.ts, .py, .json, .yaml, .txt and the rest), and in a .mmd or .mermaid diagram's source pane, where the cursor used to end up buried under the composer.

    Switching documents or editor surfaces while the composer is already open leaves the scroll position alone. A document you come back to opens where you left it, and switching between the visual editor and markdown source lands where the mode switch puts you rather than being pulled to the cursor.

  • Fix the Accept current / Accept incoming buttons on a stale-write conflict where both versions are identical: clicking one as soon as it appeared did nothing, and the conflict could not be resolved until the view was reopened.

  • ok ps, ok stop, and ok uninstall no longer stall for seconds while inspecting running processes, and neither does the desktop uninstall flow. A process that stops responding is queried twice, each attempt bounded at two seconds, so it still adds to the inspection.

  • Keep the install affordance on an agent row whose tool is gone but whose OpenKnowledge files are not.

    A row in Agent connections tracks two independent facts: whether the tool itself is on this machine, and whether OpenKnowledge has written its MCP entry and skill files into that tool's config. When the tool was absent but the files were present, the row collapsed both into a single Remove button. The way back in disappeared, and because an absent row also defaults its toggle off, Remove was the only live control left on it.

    Install is now the row's main action whenever the tool is missing and OpenKnowledge has a download link for it (How to set up otherwise), and cleanup moves beside the hint as a muted underlined link. The hint says which of the two facts each control is about: Not installed · OpenKnowledge files present.

    This matters most on a tool with two rows. Cursor has one for the CLI and one for the editor, and they share a single set of files. With the CLI off PATH and the editor installed, the CLI row read Not installed and offered only to delete the .cursor/ config the editor was using.

    Where one agent has two rows — a CLI and its editor, sharing one setup — the hint and the cleanup link appear only when the sibling row's tool is confirmed absent — if OpenKnowledge cannot tell, it makes no residue claim. With cursor-agent off PATH and the Cursor editor installed, the CLI row now reads a plain Not installed and leads with Install; cleanup stays on the editor row, where the files are actually in use.

    The outline Remove button now appears only on rows whose tool is present.

    Files left in the home of a tool that was never installed are out of scope here; this changes what the row offers, not what put them there.

  • Open Settings from the project navigator in supported desktop installations to customize your theme and, when available, terminal access and connections to your AI tools. Reopening setup shows a customization heading while first launch keeps its welcome heading.

    Settings commands now share window routing across native menus, in-app menus, and deep links. Editor windows, including single-file editors, open full settings. On supported desktop installations, invoking Settings from a menu with no windows opens the navigator and its customization dialog. External Settings links open editor settings or the navigator without forcing the integration consent dialog. Unsupported installations direct you to use Settings from a project window.

  • CLIs installed in ~/.ok/bin are now found and launchable even when the shell PATH block was declined or deleted.

    On macOS and Linux (packaged builds, not AppImage runs), OpenKnowledge creates ~/.ok/bin and puts its own ok command there whether or not you let it edit your shell startup files, and the built-in terminal already ran with that directory on its PATH. The checks that decide whether a CLI is installed did not. A tool sitting in ~/.ok/bin therefore read as missing, so Settings offered install instructions for a command the app could already run, and the toolbar control that would have launched it stayed hidden. Slidev was the reported case. Claude, Codex, and every other terminal CLI were affected the same way.

    The presence checks, the Slidev launch, and the CLI launches the built-in terminal starts for you now compose their child environment through the same helper, so all three put the same OK-managed directory first on their child's PATH. All three also reassert that directory after your startup files have run, so a startup file that replaces PATH can no longer hide the installed command. The reassert skips the directory when it is already there, matching the rule the environment layer follows, so it appears once rather than twice and your own PATH ordering is left alone. Commands you type yourself in the terminal are not reasserted and keep your PATH exactly as your startup files left it.

    Presence checks and global Slidev launches now run the same shell mode as the built-in terminal. On macOS that is a login interactive shell, unchanged. On Linux it is an interactive shell, which is what the terminal already used and what the desktop convention expects, so a slidev shell function or alias defined in ~/.bashrc is now both detected and launchable rather than detected and then failing with command not found.

    The tradeoff on Linux is that a global deck launch is no longer a login shell, so anything set only in your shell's login-only startup files (a proxy, a JAVA_HOME, a version manager init) no longer reaches the deck. For bash those are /etc/profile, /etc/profile.d/, ~/.profile and ~/.bash_profile, and for zsh they are /etc/zprofile and ~/.zprofile. Move the setting to the file your shell reads for every interactive session, ~/.bashrc for bash or ~/.zshrc for zsh, if your deck's toolchain needs it.

    Global Slidev launches also disable shell job control before starting the deck, so closing a slides window reliably stops the dev server instead of leaving it running and holding its port. POSIX shells get set +m and fish gets status job-control none, both emitted after your startup files have run so a startup file cannot turn job control back on. A fish deck was already contained at fish's default job-control mode, but a config.fish that sets status job-control full took that away, and the opt-out now covers that case too.

    A CLI-presence check and a Slidev dev server are no longer told they are the OpenKnowledge terminal. Launching the app from inside the built-in terminal used to pass that marker down to them, which made agent skills treat a probe or a preview server as a hosted agent session. The terminal itself still carries the marker.

    Windows never had the reported bug: there the installer puts the CLI on your PATH itself rather than through a ~/.ok/bin shim, so those checks already saw it. Windows does pick up two changes from the same work. The presence checks now run with the app's own bundled CLI directory ahead of the PATH they inherit, and the Slidev launch now writes its composed PATH under the variable name Windows actually uses, instead of adding a second, empty one beside it.

  • Fix a bug where clicking Enable terminal while project settings were loading could leave the terminal off. Enable terminal, sidebar view toggles, skill pinning, and Reset view filters refuse settings changes until the relevant settings load. The theme picker in AI tools & CLI still works locally when shared settings are unavailable; otherwise it waits for them to load. A rejected settings write leaves the current theme in place. Native View-menu actions remain available and report a loading notice during this window.

  • A save for a document whose file is gone is now refused instead of recreating the removed file with text you never saved.

  • Dismiss the macOS uninstall result after revealing its cleanup log. Restore the localized completion checklist with Cleanup log and Reveal in Finder controls, keeping progress visible while the original app exits and cleanup runs. Use a disposable profile, exit before Finder reveal, and fall back to the system result dialog if the helper fails or its renderer stops responding.

    Allow uninstall and project deinitialization to recover malformed server-lock residue only after successful process and listener inspection finds no associated live server candidate. Preserve recovery of dead PID-only locks. Global-only uninstall can retain project state whose lock records another machine or an unverified owner; deinitialization still refuses those locks. Read failures, incomplete inspection, and live server candidates remain blockers. ok clean now reports access and ownership refusals, while ok status, ok ps, and ok diagnose identify live PID-only records as having an unverified owner. ok stop will not signal those records, even with --force.

    Clean up owned temporary lock fixtures. Report dependent cleanup skips separately from root failures in human output, retain the JSON failed[] contract, and expose blocked dependent operations in an additional blocked[] array.

  • On Windows, ok uninstall and ok deinit read the live process creation time through the native addon instead of launching PowerShell. Cleanup continues to refuse a reused or unverifiable PID. POSIX process checks retain ps.

    A Windows addon that is missing, unusable, or unable to complete the query refuses removal without a PowerShell fallback, and the refusal names the action for the fault it hit: reinstall OpenKnowledge when the component could not be loaded, or rerun from an account that can inspect the process when the component loaded and Windows refused the query, where reinstalling would not help. Either way you can stop the server yourself and confirm it exited. The failure detail is recorded in ~/.ok/logs rather than printed.

View v0.72.0 on GitHub