Skip to content

v2.9.0 - Where each change came from

Latest

Choose a tag to compare

@BattermanZ BattermanZ released this 27 Oct 14:18
c63e756

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: web for the web app, mcp/<name> for an agent, using the name its client gives (such as mcp/claude-code), mcp for an agent that gives none, and unknown for 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_link takes a commit_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 as a == b stay 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() and now() follow the server's TZ setting. The Docker image runs on UTC, so east of UTC today() named yesterday between your midnight and UTC's. Set TZ, such as TZ=Europe/Paris, in .env. .env.example and docker-compose.yml now show it. #584
  • A folder condition no longer picks up a note named after the folder. file.inFolder("Subscriptions"), and a path_prefix of Subscriptions in query_notes and find_text, also returned Subscriptions.md sitting 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 docs pointer on these, but an agent meets them as a Vault's status in list_vaults, which carried none. Each status error the manual explains now carries docs. 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 TZ to your zone, such as TZ=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. #596
  • just proto-new and just proto-serve capture a screen from the dev instance and serve prototypes for a design choice.

Full changelog: v2.8.2...v2.9.0