OpenKnowledge

v0.28.0

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

Minor Changes

  • Link authoring in the visual editor now matches the conventions of the editors you already know. Typing a full URL (https://…, www.…, or an email) and pressing space or enter converts it to a link — including local-development URLs like http://localhost:5174 — while plain words and filenames like AGENTS.md are never touched, and one undo restores plain text. Pasting or dropping a lone URL links it; pasting a URL over selected text links that text instead; Cmd+Shift+V still pastes plain. Typing markdown's [text](url) shorthand converts on the closing parenthesis. Cmd+K is now dual-role: with text selected it opens the link popover (focused, pre-filled from your clipboard when it holds a URL), with the cursor inside a link it opens that link for editing, and everywhere else it keeps opening the command palette. Linkification never fires on content written by other collaborators or agents — only on your own local typing and paste gestures. Also fixes two long-standing popover bugs: the URL input now reliably takes focus on open, and Escape correctly closes the popover after dismissing path suggestions.

  • Settings → This project gains an "AI tools" section — the project-scoped sibling of the "AI tools & CLI" section. It manages OpenKnowledge's project-local footprint for the project the window has open: the per-editor project MCP config files (.mcp.json for Claude Code, .cursor/mcp.json for Cursor, .codex/config.toml for Codex, and the OpenCode/Pi equivalents) and the project runtime skill (.claude/skills/open-knowledge/). Every row reflects its live installed state and a click installs or uninstalls that one component; removal follows the same guest discipline as install (only entries OpenKnowledge recognizably wrote are deleted). Because a written project config is not always a connected one, each installed row states its remaining step — Claude Code needs a one-time approval, Cursor must be enabled in its own settings, Codex auto-connects on a trusted project. Editors with no project surface (Claude Desktop) are omitted. Mutations resolve and serialize against the sender window's project in the desktop main process.

    This also fixes a related leak in the existing "AI tools & CLI" (user-global) section: project-only editors such as Pi have no user-global MCP config, so they surfaced there as a permanently-unmanageable row. The global section now lists only scope: 'global' editors; Pi is managed in the new project section instead.

  • Add manual rename to terminal tabs. Double-click a terminal tab (or press F2 while it's focused) to give it a name of your own, edited inline. The custom name pins over whatever title the running program sets via its terminal title escape sequence — useful for agent CLIs that constantly rewrite their title — so the tab keeps the name you chose. Press Enter or click away to commit, Escape to cancel; committing an empty name clears the custom label and restores the program's title (or the positional "Terminal N" default).

  • Reorder terminal tabs. Drag a terminal tab to a new position with the pointer, or move the active tab with ⌘⇧← / ⌘⇧→ (keyboard reorders are announced to screen readers). Untitled tabs now carry a sticky number that stays with the session, so reordering them is visibly meaningful instead of silently renumbering, and ⌘1–9 still jumps to the tab at that visual position. The drag reuses the editor's tab chrome, and in the standalone terminal window a drag across the tab strip reorders tabs instead of moving the window. Your custom names and tab order are retained by the main process, so a renderer reload (View → Reload) restores both names and order; a full app quit still starts fresh, since the shells themselves don't survive a restart.

Patch Changes

  • Clicking anywhere in an Ask AI composer now focuses its input. Previously only the text itself was a focus target, so the padding around the field, the gaps beside the send button, and the empty space in the card were dead — a click there did nothing. Both composers get the standard chat-composer behavior: the bottom docked composer (open-doc and folder-overview modes) and the empty-state "Create with AI" composer. Keyboard and screen-reader users are unaffected — the input keeps its own semantics and is still reached directly via Tab and ⌘L.
  • Fix git rename detection for non-ASCII filenames in two more places. A shared doc or folder whose name contains non-ASCII characters (umlauts, accents, CJK) that is renamed on the remote now reports its correct new location instead of showing as deleted, and version-timeline entries recover the real document name instead of garbled text. All git path-listing now routes through a single NUL-safe helper (git-paths.ts) so this class of bug cannot recur at new call sites.
  • ok deinit (and the per-project sweep in ok uninstall) now removes OK-installed skill projection symlinks (pack and authored skills under .claude/skills/, .cursor/skills/, etc.) instead of refusing them with "Refusing to write through a symbolic link" — removal unlinks the link itself and never touches its target. Dangling projection symlinks are cleaned up too; the refusal for symlinked ancestors that escape the project is unchanged.
  • Editing inside a Callout, tab, accordion, or table cell in the visual editor now always reaches collaborators and reopens with exactly the content you see. Previously the editor could hold a cached copy of a component's original source and, when the inside was edited, serialize those stale bytes for everyone else — your own editor looked right while a teammate (or a fresh reopen) got the pre-edit content, or in rare cases structurally-broken markdown. The server now re-derives a component's markdown whenever its live contents diverge from that cached source, regardless of which surface made the edit, so what you see is what everyone gets. A drain-time legality check backs this up: if a serialization would still lose content, it is caught at the moment the bytes are written and a recoverable snapshot is kept instead of shipping the corruption.
  • Fix the exec MCP tool being unable to read any file below the project root on Windows. cat, ls, grep, and find against a subpath (e.g. cat notes/x.md) returned "No such file or directory" even though the file existed, because the bundled just-bash sandbox judged every backslash-separated Windows path as "outside sandbox". Bumping just-bash to the release that handles Windows path separators restores subpath reads/listings; only genuinely-absent files now report ENOENT. macOS and Linux are unaffected.
  • Fixed symbolic links (mode 120000) being automatically staged as deleted in the background Git sync loop. The filesystem scanner now correctly walks and includes symbolic links inside the content directory so they are recognized as on-disk files and are not incorrectly removed from Git tracking during sync commits.
  • Hide server-launched Git and helper subprocess console windows on Windows by setting hidden console spawn options on direct child-process calls.
  • Make the open-knowledge-ui entry in .claude/launch.json launchable on Windows. Previously ok init always wrote a /bin/sh chain, so Claude Code Desktop's preview pane could not start the OpenKnowledge UI on Windows (there is no /bin/sh). On Windows, ok init now scaffolds a powershell -NoProfile -NonInteractive -Command <chain> entry that resolves the npm-global ok.cmd shim first, then npx.cmd, then common version-manager/installer paths, and runs ok start --ui-port so the opened folder gets its own collab server. The ok start launch.json repair sweep now recognizes both platforms' canonical shapes on every OS, so a launch.json committed on one platform is never rewritten back and forth by the other, and custom entries are still preserved.
  • Fixed the project switcher's worktree list not refreshing until an app restart. A worktree created outside the current window — a git worktree add in a terminal, or a create in another OpenKnowledge window — now appears when the window regains focus, instead of staying hidden until you quit and reopen. The cached worktree model now revalidates on window focus / tab-visible, the same signal the file list and graph already use to recover from stale data.

View v0.28.0 on GitHub