OpenKnowledge

v0.38.0

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

Minor Changes

  • The OpenKnowledge desktop app can now be built for Windows and Linux. This first slice makes the app buildable and full-featured on both platforms — installers are not published yet (they'll appear on the releases page after internal QA):

    • Windows: one-click per-user NSIS installers (x64 + arm64) that put the bundled ok CLI on your PATH and register openknowledge:// links. Linux: AppImage and deb packages (x64 + arm64); the deb installs /usr/bin/ok and registers links system-wide, while AppImages self-register a link handler each time they run.
    • Windows and Linux windows get proper chrome: a frameless titlebar with native window controls and an in-app menu bar (File / Edit / View / Window / Help) that mirrors the macOS menus.
    • Everything the Mac app wires up on your machine now works on Windows and Linux too: MCP entries for your editors (Claude, Cursor, Codex, and friends), Agent Skills, and ok launching the desktop app when installed.
    • The built-in terminal stays macOS-only for now; its buttons and settings are hidden on other platforms instead of failing.
  • Add an in-app feedback form. A new "Send feedback" action in the Resources menu opens a short form to rate OpenKnowledge (good / not great), pick what got in the way, add a message, attach up to three screenshots, and optionally share an email for follow-up. Submissions file a ticket to the OpenKnowledge team's feedback intake.

Patch Changes

  • Agent write bursts across many documents no longer stall with "server busy" (503) once 256 documents have been touched. At the session cap the server now evicts the least-recently-used idle agent session — flushing its document to disk first — so large bursts stream through a bounded working set. Sessions used within the last few seconds are never evicted, and a 503 is still returned only when every session is genuinely in use. Undo history for an evicted session ends with it (same as a disconnect); a later write on that document starts a fresh session under the same agent identity, so edit attribution is unaffected. New diagnostics: an ok.sessions.evictions_total OpenTelemetry counter and an agentSessionEvictions counter on GET /api/metrics/reconciliation.
  • Add POST /api/agent-write-batch: apply up to 100 document writes in one HTTP call. Each entry uses the same write semantics as POST /api/agent-write-md (create or update, append/prepend/replace, per-entry summary, .mdx extension on create) and every entry is attributed to the calling agent. Outcomes are per-entry — a reserved doc name, merge conflict, or disk failure fails only that entry while its siblings land — and the response reports per-entry results with broken-link validation that resolves links between documents written in the same batch. The batch amortizes what N single calls pay N times: one round-trip, one presence/focus update, one admitted-doc-set scan for link validation, and one coalesced shadow-repo commit. The per-document mermaid render validation and lint advisories stay on the single-write endpoint.
  • Error and warn log lines across the server, CLI, and desktop main process now attach the raw error under the err key, so on-disk JSONL logs (what bug-report bundles collect) carry the full name/message/stack instead of a pre-stringified message with no stack. API error log lines additionally carry the request's x-request-id for correlation with the access log and client reports, the MCP stdio logger serializes Error values instead of flattening them to {}, and the desktop root logger gained explicit err serializers. No wire-shape changes.
  • Workspace search now maintains its full-text index incrementally. Previously any file change invalidated the whole search corpus and the next search rebuilt the entire index from scratch on the server's event loop — on a large workspace, a write burst with interleaved searches meant repeated full re-indexing. The server now diffs the document set against the live index and applies per-document insert/update/remove, so one write re-indexes one document. A from-scratch rebuild remains as the cold-start path and as an automatic fallback whenever the incremental patch cannot be proven consistent.
  • Agent writes no longer block the server on large-document markdown parsing. The parse that turns a written document's markdown into editor structure now runs on a bounded worker-thread pool for documents past 8KB, so a big write (or rollback, edit, frontmatter patch) no longer freezes every other in-flight agent tool call while it parses — the event-loop stall for a concurrent 1MB write drops from roughly 2 seconds to roughly half a second, and small-write latency under load matches idle latency. Small documents keep the faster inline path, output is byte-identical either way, and any worker failure transparently falls back to the previous inline behavior.
  • Bug-report bundles now capture watcher decisions and lifecycle breadcrumbs. The file watcher keeps a bounded in-memory ring of its last 256 decisions — dispatched events, self-write skips, and drops with a bounded reason (symlink escape, filter exclusion, unreadable/raced file, reserved doc, stat failure) — served by a new loopback-only GET /api/metrics/watcher-recent endpoint and staged into the full diagnose bundle as state/watcher-recent.jsonl (one decision per line, paths pre-normalized; doc names anonymized by the existing --redact pass). Drops also increment an ok.file_watcher.drops counter and roll up into a periodic drop-count summary log line, so "my file didn't sync" is diagnosable from a bundle. Near-silent critical subsystems gained debug-level lifecycle breadcrumbs keyed on doc/agent/session: agent-session create/join/close/undo/write transitions, bridge-watchdog tolerance/path-B/split-brain firings plus a content-free diff summary (lengths and first-divergence offset, never document bytes) on every emitted invariant violation, and the client provider pool's reconnect/recycle path (recycle timers, mismatch buffer capture, IDB clears, replay fallbacks) via structured console breadcrumbs the log forwarder ships to the server log. The pino file sink now admits debug records by default (OK_FILE_LEVEL overrides; terminals keep the base level) so bundles capture the breadcrumbs without extra terminal noise.

View v0.38.0 on GitHub