Haematite keeps records in named collections. Every write adds a new version. Nothing is edited in place. A record can be read as it was while that version is retained.
History retention decides how long old versions stay readable. Reclaim returns space after no retained root reaches it. A branch is a line of versions you can fork, write on and merge back. A query is a short pipeline, checked word by word before anything is read.
Install and run
Install the command, create a store and start it.
Write your first records
Define a collection, write two records, read them back.
Connect an agent
MCP over stdio or HTTP, repository plugins and installed bundles.
Studio and the door
Sign in through Lys and use the browser areas.
The query language
Short pipelines in jq's shape, refused by name when wrong.
Sign-in and permissions
Passes, grants and the store's checks.
Relations and the graph
Declare relations, link records and walk directed edges.
History and time
Retained versions, release policy and offline history tools.
Configuration
Every accepted service, door and HTTP setting.
Refusals
Source-derived diagnostic names and command outcomes.
Backup and migration
Copy a stopped store, verify a restore and handle older chunking formats.
Reference
Every command and every tool, in the command's own words.
What you get
One command. The same haematite binary runs the store, serves the Studio for people, and serves MCP for agents.
Versions you can trust. A record’s history is kept. A reader can ask for any retained version a branch has seen.
Branches. Fork a branch, let a person or an agent work on it, review the difference, merge it. The merge checks the supplied source version and refuses a changed target.
Reclaim. The vacuum plans from every known pin and refuses policy blockers before deleting.
Checked queries. A wrong stage is refused with its name and the span of text that caused it. Nothing is guessed.
Search by meaning. Records can carry vectors. Two stages read them by cosine, Euclidean or dot distance.
One query, end to end
match (c:patients)-[:admitted_to]->(w:wards)<-[:staffed_by]-(n:nurses)
That reads patients, the wards they were admitted to, and the nurses staffing those wards. Two edge hops across three records, in one line.