Repository navigation
This release makes a Git-backed Vault's history say where each change came from, and fixes a memory leak that slowly filled the container until the system killed it. The rest is fixes: highlights and search matches on the note page, saved queries that got the date or a folder wrong, and two places where an agent or a reader hit a dead end.
Important
Read Before you upgrade if you run Hatchdoor outside Docker, or have a script that reads Hatchdoor's commit messages. Docker installs have nothing to do.
New
- Every commit Hatchdoor makes says where its changes came from. On a Vault with Git sync, a commit now ends with one
Hatchdoor-Origin:line per origin:webfor the web app,mcp/<name>for an agent, using the name its client gives (such asmcp/claude-code),mcpfor an agent that gives none, andunknownfor a file Hatchdoor has no record of writing, such as an edit made in Obsidian. An upload through an upload link counts as the agent that asked for the link. The name is a label the client picks, not proof of who wrote. Any Git host shows these lines, and the Git-backed Vault guide explains them under "Where each change came from". #570 create_upload_linktakes acommit_summary, like every other write tool, so the commit that records an upload says why the file was added. The server holds the summary; it never goes into the link. #598
Fixed
Memory
- Hatchdoor's memory no longer grows each time the search index updates. The vector library Hatchdoor uses never freed the memory behind a Vault's ID stored as text, so every index pass that changed something kept about 1.6 MB on a 5,000-chunk Vault. A long-running container grew by around 0.6 GB a day until the system killed it. Vectors are now filed under a number. Your existing index carries over: once the search model has loaded, Hatchdoor converts the index in place, checks the result, and re-indexes from your notes only if a check fails. #600
The note page and search
==highlighted text==shows as a highlight on the note page, in the editor's preview and in Help. The editor drew it, but the note page printed the equals signs, and a read-only or demo Vault always opens on that page. Equals signs in code, math and comparisons such asa == bstay as written. #572- Search matches are readable in the dark theme. The matched words were black on dark yellow, on the note page and in the search dialog. #605
- A match that is all the text of a heading, a bold or highlighted word, a link or a table cell is now marked when you arrive from a search. It was skipped, left out of the "Match N of M" count, and a note with only such matches opened with no match navigator. #609
- The mark lands on exactly the matched words when the text before it holds a letter that grows when lowercased, such as the Turkish
İ. Each one shifted the mark a letter to the left. #612 - Changed on disk and search no longer show a sentence with no Vault in it, such as " did not answer." or an empty red "Nothing Found", when a Vault was answering from its previous index. A note opened from a search for its own title now lands on the first match you can see. #585
Saved queries
today()andnow()follow the server'sTZsetting. The Docker image runs on UTC, so east of UTCtoday()named yesterday between your midnight and UTC's. SetTZ, such asTZ=Europe/Paris, in.env..env.exampleanddocker-compose.ymlnow show it. #584- A folder condition no longer picks up a note named after the folder.
file.inFolder("Subscriptions"), and apath_prefixofSubscriptionsinquery_notesandfind_text, also returnedSubscriptions.mdsitting beside the folder. #584
Getting unstuck
- An agent gets the manual's page for a Git sync failure or a Vault folder Hatchdoor cannot open. 2.8.0 promised a
docspointer on these, but an agent meets them as a Vault's status inlist_vaults, which carried none. Each status error the manual explains now carriesdocs. The HTTP Vault list is unchanged. #583 - The "Vaults Unavailable" screen explains itself. Its Help link loads the manual from the server, which is down for the same reason the screen appears, so it only said "The manual could not be loaded". The screen now says what went wrong and what to try without needing the server. #583
Before you upgrade
1. Outside Docker, today() and now() use UTC unless TZ is set. They used the host's own time zone. Docker installs already ran on UTC and see no change unless they set TZ. #584
Action: if you run the binary directly and your saved queries depend on the date, set
TZto your zone, such asTZ=Europe/Paris.
2. Commit messages gain Hatchdoor-Origin: lines at the end. The first line and the summary lines are unchanged, so anything that reads only those is unaffected. #570
Action: if a script compares Hatchdoor's whole commit message, allow for the new lines.
Smaller things you might notice: the first start after the upgrade converts the search index in place once the search model has loaded #600; list_vaults status errors can now carry a docs field #583.
Under the hood
No behaviour change in these.
Two changes, expand if you work on Hatchdoor itself
docker build --target verification .builds again: the stage was missing the shared note-comment cases the link-preview test reads. #596just proto-newandjust proto-servecapture a screen from the dev instance and serve prototypes for a design choice.
Full changelog: v2.8.2...v2.9.0