v0.66.1
Patch Changes
-
OpenKnowledge's user-global skills now install for LM Studio. LM Studio reads Agent Skills from
~/.lmstudio/skills, listed as Bionic Skills in its agent mode, but OpenKnowledge treated it as an MCP-only host, so skills were never written there and the Skills panel never listed anything installed under it. Installing a tool that reads the shared.agents/skillsfolder now makes that folder available as a skill destination. Two tools read it: LM Studio reads it for project skills rather than a.lmstudio/folder, and OpenClaw reads it at user scope, so an OpenClaw user will see a~/.agents/skillsrow appear too. OpenKnowledge previously offered the folder only once a project already used it, so the only way to make the first placement was to type the path into Add custom path. The folder stays neutral: it appears because something on your machine reads it, is never preselected, and carries no per-tool marks. It is offered as a destination but not as a merge target until it exists, so accepting an offer never creates the folder behind your back or relocates skills into it. With neither tool installed, nothing changes. -
Back off pulls and pushes independently, and make the sync panel's file list readable at scale.
Auto sync kept a single count of recent failures. Both loops added to it, but only the pull loop read it, and only a successful pull could clear it. A push that kept being rejected therefore stretched the interval of the very loop it defers to when its own retry is exhausted, and a push that recovered left the count standing until a pull happened to run. Each direction now keeps its own streak: 3 consecutive failures hold the next attempt for at least 5 minutes, 5 for at least 15, and 8 for at least an hour — floors rather than replacements, so a configured interval longer than the tier is never shortened to it. (Pull already had this ladder but applied it as a replacement, which could speed a slow interval up; it is now a floor there too.) The two counters are independent — push failures do not slow down pulls and vice versa — and either counter resets immediately on a manual trigger or on a success in that direction. Saving state written by an earlier version still restores its pull backoff.
A push does not check for updates first — it sends, and reconciles only if the remote turns it back. Checking less often than you push therefore leaves each push to discover the remote moved and catch up before it can land, which costs nothing on a repository nobody else writes to and adds a round trip on every push when someone does. The sync settings note this where the two intervals are chosen, in Auto (Pull and Push) and only when the push interval is the shorter of the two. It is a note, not a restriction: fast pushes with slow update checks remain a reasonable setting for a repository you are the only author of.
The panel listed every changed path as its own row, up to a hundred per section, each clipped at the end to fit. On a real working tree that produced a column of near-identical strings — every row showing the same visible prefix, with the filename that distinguished it cut off — and a panel tall enough to push the sync controls off screen. Paths are now grouped by folder, with the directory stated once in a group header and the rows carrying only what is left of the path. A directory shared by everything in a section is lifted out and stated once above the list. Sections start collapsed with their file count in view; folders holding a single file stay as plain rows rather than costing a click, and a long group shows its first few rows with the rest one click away. Hovering a row gives its full path, and a folder header its untruncated directory, and the list scrolls within its own bounds so the mode selector and the Pull and Push buttons stay put.
-
OKF provenance timestamps are now read as ISO 8601 datetimes carrying an explicit UTC offset, which is what OKF v0.2 §5 asks for. This changes the
okflint plugin in both directions, and one of the two is a tightening.- Documents that already follow OKF v0.2 stop warning.
stale_after,usage_window.from,usage_window.to, and eachsources[]entry'slast_modifiedplus its own window bounds previously accepted only a bareYYYY-MM-DDcalendar date, so a conformant value such as2026-09-23T00:00:00Zwas reported as afrontmatter-provenancewarning. It no longer is. - Documents still written with date-only values start warning. A value such as
stale_after: 2026-09-23now reports onefrontmatter-provenancewarning, because the format now asks for an explicit offset. The remedy is to write it:stale_after: 2026-09-23T00:00:00Z. A datetime carrying no offset (2026-09-23T00:00:00) is rejected for the same reason, and the warning now names the shape to write rather than only the schema keyword.
Why now. OKF revised §5 in place on 2026-08-21, adding "Every timestamp-valued key in OKF is an ISO 8601 datetime with an explicit UTC offset" and migrating every example in the spec, without bumping the version. Both revisions are labeled v0.2 and a document written to either declares
okf_version: "0.2", so the declared version does not tell you which reading a document was authored against. The plugin now records the upstream commit its reading is pinned to.Other v0.2 checkers have not caught up yet.
okf-conformancestill warns on astale_afterthat is not a bareYYYY-MM-DD, which is the pre-revision wording of §5.5, so the two tools currently disagree about the same document. OpenKnowledge follows the current spec text and the format's own reference bundles, which now writestale_after: 2026-12-31T00:00:00Z.Log files are unaffected. OKF §9 governs the date's form in a
log.mdentry heading, not these frontmatter keys, andlog-shapeis unchanged:## 2026-06-30and## 2026-06-30: Shipped v2both stay conformant.The
okfplugin ships disabled by default, so this reaches only projects that turned it on, and it emits advisory warnings rather than blocking anything. - Documents that already follow OKF v0.2 stop warning.
-
Documents and folders whose name contains
#,?or%are addressable again.
Opening one used to mint a New Tab, drop the tab on restart, and leave the
sidebar without a selection, because the route hash was built with the name
unescaped and the first#was then read as a section anchor. -
A bug report from a desktop freeze while opening a folder now names the step the open had reached.
Opening a folder runs a long admission funnel: working out what the picked folder actually is, confirming an ancestor project, the first-open consent dialog and its content probe, git and content scaffolding, the editor and AI-tool writes, and finally the window itself. Until now that whole stretch reported one line as it started and one line once the window existed, and nothing in between. Every diagnostic along the way was a
console.warn, which the packaged app discards. A session that stopped anywhere inside the funnel therefore produced a report indistinguishable from one that stopped anywhere else, which is why several reports of a freeze right after picking a folder could establish that the app had stopped and not where.The funnel now reports one line per decision it makes and per step that can run long, on both the first-open and existing-project paths: entering the admission resolution, the folder-size probe and the git-root lookup inside it, what the pick resolved to and whether it was promoted to an ancestor folder or a git root, each dialog being raised and the answer coming back, the waits for the Navigator to load and for git and content scaffolding, the artifact writes, and entering the window creation rather than only finishing it. A report now points at one step instead of the whole funnel. Creating a new project resolves the new folder's location through a separate admission pass before this funnel is reached, and that pass is not covered; the open that follows it runs this funnel and reports the steps that apply to it.
The size probe that decides whether an oversized ancestor needs confirmation also reports its own failure through the same log. That failsafe quietly changes which branch the open takes, and it previously said so only on a sink the shipped app throws away.
One line per step per open. The new lines carry folder names, enumerated states, counts and booleans rather than file contents. The probe failure is the exception, and deliberately so: it reports the error itself, whose message carries the path the probe could not read, because knowing which failure flipped the branch is the reason that line was promoted off the discarded sink in the first place.
-
Fixed dragging the divider of a right-docked Terminal on Linux, which closed the column instead of resizing it. The workaround of using the bottom dock is no longer needed.
The resize library treated any pointer event that left the window mid-drag as a full-width jump rather than as the distance the pointer had actually travelled, and a column that can be dragged shut reads a full-width jump as "shut". Electron 43 was the version that started emitting such an event on Linux, but the misreading was there all along, so the fix is to measure the drag from where it started no matter what interrupts it.
-
Fixed
openknowledge://deep links (used byok open,ok <file>, and shared links) sometimes opening a blank, unbranded Electron window instead of the OpenKnowledge desktop app.This happened when a development build of the desktop app had run on the machine at some point and registered itself as the handler for
openknowledge://links, then exited without cleanly unregistering — for example, if the process was killed rather than quit normally, or its checkout was later deleted. macOS kept routing links to that no-longer-valid registration instead of the installed app. The desktop app now re-claims its link handling every time it starts, the same way it already did on Windows and Linux, so a stale registration from an old development run gets corrected automatically the next time you open the app.On macOS,
ok openandok <file>no longer depend on that registration being correct in the first place: when a desktop install is found, they open it by its exact file-system location rather than asking macOS to figure out who ownsopenknowledge://links, so they keep working even if a stale registration exists and the app hasn't been opened yet to repair it. Windows and Linux still resolve the link through the OS's own registration and rely on the per-boot repair above; making them equally independent of that resolution is tracked as a follow-up.Also worth knowing if you're developing the desktop app itself: a development instance still claims
openknowledge://machine-wide on macOS while it's running (needed soopen openknowledge://...reaches the dev build during local testing), and now competes with the packaged app's own per-boot repair for the same registration — whichever one started most recently wins. A browser-clicked link between an unclean dev-mode exit and the next time you launch the installed app by hand may briefly reach the wrong place; opening the installed app once corrects it. -
Ephemeral single-file sessions (
ok <file>, or opening a loose file in the desktop app) are now resilient when their server stops.-
Single-file servers no longer idle-die under an open editor. A single-file window now holds its server alive for as long as the window is open, the same way a project window already did. Previously the single-file server inherited the 30-minute idle-shutdown default with nothing holding it up, so it could shut down while you were still editing.
-
"Restart server" now works for a single file. The restart action is routed to the correct server by the window that requested it, so restarting a stopped single-file session actually respawns it (before, it failed with "Couldn't restart the server"). Reopening a file whose server has stopped, or restarting it, converges to a single live window instead of leaving a dead one lingering.
-
The connection notice is honest, and the editor stops retrying a dead server. After a short grace with no reconnection the "keep this tab open, your edits will sync when reconnected" notice changes to a clear "the server stopped — restart it to reconnect," and the renderer stops re-authenticating against an unreachable server instead of looping until the tab is closed. A genuine transient blip still reconnects within the grace and shows "Reconnected." If the connection comes back but editing still doesn't resume, the notice says so ("Connected, but your edits aren't reaching the server yet") and keeps the Restart button, instead of leaving a stale claim on screen. Navigating during an outage — to another document, an image, a folder view — no longer silences the notice, and no longer restarts the grace behind it, so hopping between tabs can't win back the "will sync when reconnected" message from a server that has actually stopped. The notice updates the next time a document is in focus.
Behavior change for self-hosted deployments: a loopback-bound server that declares itself externally reachable (
server.allowExternal+server.externalUrl— the tunnel-to-loopback remote recipe) now defaultsserver.idleShutdowntooffinstead of30m. The idle timer only counts editor WebSocket connections and cannot see remote MCP agents, so such a server previously tore down under a remote agent mid-session unless you setidleShutdown: offby hand. A plain loopback server with no external URL is unchanged (30m). -
-
Markdown comments now work when their body contains formatting, and they read as annotation instead of as punctuation.
A comment written inline in a paragraph,
%%note%%or<!-- note -->, was only recognized when its body was plain text. Put anything formatted inside it, bold, code, a link, and the comment stopped being a comment: the%%or<!--characters showed up as literal prose and the body rendered at full weight alongside the rest of the sentence, so an annotation read as part of the document. The cause was that formatting splits the surrounding text, which left the opening and closing delimiters too far apart for the recognizer to pair them. It now pairs them across the split, in paragraphs, headings, list items, and table cells alike.One byte-level consequence, for the HTML form only: a comment written without inner padding re-saves in the conventional
<!-- body -->shape, the same way a plain-bodied one always has. The%%form keeps its body verbatim, spaces included.Recognition stays deliberately narrow. A paragraph, heading, or table cell carrying more than one candidate pair (its several lines share one budget), an escaped delimiter, a pair inside a code span, or a mid-sentence body that is nothing but a single formatted word is left as prose rather than guessed at, because claiming one of those would rewrite what you wrote the next time the file saved.
The editor no longer prints the delimiters. A comment used to carry a literal
%%or<!--on each side, and a standalone comment block carried a small marker naming it, so a paragraph with a few annotations in it was hard to read past the punctuation. Nothing else in the editor shows its own syntax: bold, code, and links all keep theirs out of the page. Comments now do the same. An inline comment is dimmed and italic under a dashed underline; a comment block is dimmed with a dashed left rail, which is what distinguishes it from a blockquote's solid one. The underline matters beyond decoration: without it a comment differed from ordinary emphasis by colour alone, and a reader who could not resolve that difference could publish text they meant to hide. The text itself is never hidden, because the same syntax can appear in prose you never meant as a comment. Source mode still shows the raw bytes, and that is where the delimiters are edited.On the choice to stop drawing them: Obsidian, whose
%%syntax this is, does show the markers in its Live Preview — comments are the one exception to that mode's hide-the-syntax rule, and its users routinely add CSS to hide them. Obsidian reveals syntax near the cursor, which OpenKnowledge's block-canonical editing surface cannot replicate; a cursor-proximity reveal was tried here and set aside as too fidgety, so it is a not-now rather than a never. Reading views in both tools hide comments entirely.A related fix rides along in the
==highlight==recognizer, which had the same defect: a highlight whose body contained formatting dropped backslash escapes from the prose around it, and an escaped\==pair following one was claimed anyway. Both now hold.Readers were never affected: wherever a document renders to HTML rather than to the editor, both forms come out as real HTML comments, which browsers do not display.
-
Fixed a macOS auto-update failure that could leave OpenKnowledge missing from your Applications folder, and a "Check for Updates" dialog that named a version it was not going to install.
The app arms an update at download time and installs it when you quit. Underneath, Squirrel arms it by launching ShipIt, which then waits — with no timeout of its own — for the app to exit. Downloading a newer build did not replace that pending request, it armed a second ShipIt beside the first; both then woke in the same instant at quit and raced the same bundle swap. The loser moved aside the bundle the winner had just installed, and when it could not put it back the app was left missing from
/Applicationsuntil a later restore.On macOS a build already staged in this session is now installed as-is: newer offers are declined until the next session, including the freshness check on the "Relaunch now" click, and a manual check for updates says the staged build is ready rather than advertising the one it declined. Windows and Linux keep taking newer builds mid-session, because neither leaves a second installer armed: Windows runs whichever installer was downloaded last, and Linux arms nothing until you click relaunch.
Bug reports also collect the numeric-suffixed ShipIt logs (
ShipIt_stderr.log.1,.2, …). Squirrel falls back to those when the base log is not writable, which is what happens once the log is owned by root — precisely the machines where a failing install is worth diagnosing.
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 |