v0.15.0
Part of the OpenKnowledge changelog.
Minor Changes
Search and the ⌘K omnibar now surface every file in your project, not just markdown notes. Part 1 made the sidebar tree show all files; this extends that to search so the two agree.
- Type part of any filename or folder path in ⌘K to jump to it —
data.csv,FileTree.tsx, an image, a config file — regardless of type. Markdown is still ranked first; non-markdown files match by name and path. - Folders that contain only non-markdown files are now searchable, and partial folder-path queries (e.g.
server/src) resolve. - Tracked dot-path files (
.changeset/,.github/) are searchable (rank-deprioritized) without being sent to the embeddings provider. - A link to an existing non-markdown file no longer renders dead; a genuinely missing target still does.
- The move/rename and new-file destination pickers list the same all-files set the tree shows.
- The omnibar shows a one-line hint when a query matches only file names (no content), and an empty-results note pointing to the file tree when a query matches nothing.
- MCP
searchreturns all files by name/path and points agents atexecgrepfor exhaustive content search. - Intentional hardening: secret-bearing files and directories (
.env*, SSH private keys includingid_ed25519/id_ecdsa/id_dsa,.netrc/.npmrc/.pgpass/.git-credentials,*.pem/*.key/*.p12/*.pfx/*.keystore/*.jks/*.ppk, and the.ssh/.aws/.gnupg/.kube/.dockerdirectories) are excluded from all surfaces — the Part 1 "Show All Files" tree as well as search and/api/documents. The unauthenticated local HTTP API is bindable to non-loopback hosts; closing this name-egress channel is the floor whether or not.gitignorecovers the path.
The file index now indexes names/paths for all files and full content for markdown only, with ContentFilter kept on (gitignored/build content stays out of search) and a 50,000-entry cap on the name-only tier (
OK_SEARCH_MAX_ENTRIES).- Type part of any filename or folder path in ⌘K to jump to it —
Patch Changes
Reword the open-folder onboarding dialog. The title is now "Setup Open Knowledge in this folder?" and the description reads "Open Knowledge stores its configuration and internal files inside a newly created
.okdirectory in your project root folder." The pointer to "Advanced settings" is dropped from the description; the Advanced settings section and the top-level Share-this-setup selector are unchanged.Introduce the docked terminal in OK Desktop — an embedded shell beside the editor for running your tools without leaving the app. Toggle it with ⌘J or the new top-level Terminal menu. It ships polished for daily use:
- Matches your theme — light, dark, or system, and re-skins live when you switch themes (no restart).
- Available by default — opens on first use with no consent dialog; disable it per-project in Settings.
- Top-level Terminal menu — New Terminal and Kill Terminal, between View and Window like a native editor.
- Trash to kill — actually ends the shell session rather than just collapsing the panel; reopening starts a fresh shell, while collapse keeps the session running.
- Cleaner agent hand-off — launching an agent into the terminal no longer appends the web-only "open the editor in web view" line.
Opening or starting a new terminal now focuses the input so you can type right away, and killing a terminal after an agent hand-off opens a blank shell instead of replaying the previous prompt.
The Open Knowledge MCP server no longer emits a handshake
instructionsblock. That block was injected into every project the (globally-registered) server connected to — including non-Open-Knowledge projects — which steered agents toward OK tools they could not use there. Agent guidance for OK projects is delivered by the installedopen-knowledgeproject skill, which is the single source of that contract.Fix the empty-state "copy prompt" rows not working when OK runs inside an embedded host iframe (e.g. Claude). The copy buttons called the async Clipboard API directly, which the host frame's Permissions-Policy refuses inside an iframe — the rejection was swallowed silently, so nothing copied and the row never showed "Copied". The copy now routes through the shared clipboard adapter, whose
execCommandfallback succeeds under the click's user activation where the policy-gated async write is blocked.Add an AI prompt composer to the empty-state screens. Describe what you want to build and hand it off to your coding agent (Claude, Codex, or Cursor) — it composes a project brief and opens the agent to scaffold your knowledge base to match, using the same handoff path as "Open with AI". One-click starter prompts are tailored to the surface (build-from-scratch ideas on a brand-new project; spec / architecture prompts when the project already has content). The agent picker lists your installed agents and remembers your last choice per machine; when none are installed, Create is disabled with a hint.
The composer now leads both empty-state surfaces; the old "With AI" editor-launch cards and the "New file" card on the post-init screen are gone (a "or create a new file" link covers blank files). Starter-pack descriptions are shorter and friendlier, and the "Entity vault (GBrain-compatible)" pack is renamed "Personal CRM".
When OK runs embedded inside a host agent (Cursor/Codex/Claude) — where launching an agent would loop back — the empty state shows the same starter prompts as copy-to-paste rows instead, so you can grab one and paste it straight into the chat without leaving the agent.
The Create-new-project dialog in OK Desktop is now name-first. You type the project name in a focused field at the top, then see a read-only Location with a Browse button to change where it lands and a live "Will be created at: …" caption showing the exact folder before you commit. Naming a project no longer means using the OS folder picker's New Folder button or hitting an "already has files" wall first. A name that collides with an existing non-empty folder, or one that can't be turned into a valid folder name, is flagged inline on the name field. The nested-project and parent-git-repo guards are unchanged.
Make the image / video / audio upload affordance discoverable on the property panel and consolidate alignment to one surface. Three changes:
Collapse three alignment surfaces into one. Image / video / Embed / CommonMarkImage previously exposed alignment in the floating bubble menu, in the per-block chrome bar, AND in the PropPanel
AlignSelect. The bubble menu (ImageAlignButtons) is the canonical surface; the chrome-bar trio and PropPanel Select are removed, and thealignPropDef carrieshidden: trueso the prop still travels through the registry (MCP queries, descriptor docs, render path) without producing a redundant control. The rest of the cluster (PRD-7054 origin findings) follows:The upload control rendered as an icon-only square next to the URL input, which read as decoration; users skipped it entirely and fell back to URL-paste as the only "working" path. Replaced with a full-width labeled "Upload from computer" button that pairs the icon with explicit text — the visible label doubles as the assistive-tech accessible name, so the screen- reader contract stays intact without
aria-label.The asset-autocomplete dropdown bound its width with the Tailwind v3 implicit-
var()shorthandw-[--radix-popover-trigger-width]. In Tailwind v4 that form emits literalwidth: --radix-popover-trigger-width— invalid CSS, silently ignored — so the suggestion list auto-sized to its longest asset path (~550px-wide) and overflowed the parent prop panel, swallowing the upload affordance in the visual chaos. Switched to v4's parenthesized formw-(--radix-popover-trigger-width); a DOM-level regression test pins the syntax so a future revert fails CI instead of users.
Fix horizontal scrolling in the project switcher's recent-projects menu. Long project names and paths now truncate with an ellipsis inside the dropdown instead of forcing the menu wider than its container and introducing a horizontal scrollbar. The recents list clips overflow on the x-axis, and each row shrinks to the menu width so both the name and the path ellipsize cleanly.
Publish-to-GitHub: pick the owner with a radio list and default to an org
The "Publish to GitHub" dialog now renders the eligible owners as a radio list (one card per owner) instead of a dropdown, so every choice is visible at a glance. When you belong to one or more organizations the wizard pre-selects the first org rather than your personal account, since a knowledge base is far more likely meant for the team, and accidentally publishing it under a personal login is annoying to undo. With no org available it falls back to your own account as before.
The file sidebar no longer flashes a red "Could not reach server" error during a desktop auto-update relaunch. While the app restarts to install an update, the server is intentionally torn down for a few seconds — the sidebar now shows a calm "Relaunching to install the update…" notice instead, and quietly re-attempts the listing so it self-heals the moment the server returns (for example, when a relaunch is aborted). A genuine outage with no relaunch underway still surfaces the honest error immediately.
Remove the broken "Upload file" button from the file sidebar. This drops the upload-via-file-picker entry points: the sidebar toolbar button, the folder and empty-area right-click menu items, and the empty-state button. Drag-and-drop file upload onto the file tree is unchanged.
The "Share this setup with your team?" choice in both onboarding dialogs (Open-folder and Create-new-project) now sits at the top level as two side-by-side cards — Shared vs Local only — instead of being buried under "Advanced settings." The copy is shorter and plain-language; the technical detail (which files, git mechanics) stays in the info tooltip next to the question. Both dialogs render the same selector via a new shared
SharingModeFieldcomponent.