11-08-2026
Phase one: the core
Pager, copy-on-write B+tree, free list, transactions, secondary indexes and per-page encryption.
Pager
The layer every other piece sits on: fixed-size pages read and written by number, with the header and the two alternating meta slots on top of it. Nothing above the pager knows how a page reaches disk.
Copy-on-write B+tree and free list
A modified page is written into a free slot, never over live data, and a commit is a single
meta-page write. The free list that makes this affordable is written too: pages a
transaction frees go to a pending list tagged with the freeing txn_id, and move
to the reusable head once the oldest active reader has moved past that id.
Transactions
One writer held by an in-process mutex, readers that never block and are never blocked. A reader pins a meta page and reads the immutable tree hanging from it — there is no recovery procedure to run, only three reads at open: the header and both meta slots.
Catalogue and secondary indexes
Indexes are maintained inside the same transaction as the data they index, through an extractor function registered in a one-page catalogue. That's what buys the guarantee an index cannot drift from the data it was built from.
delete_range
Range deletion over a contiguous key range unhooks whole subtrees without reading their leaves: internal nodes are walked, their child pointers are dumped to the free list in bulk, and the cost stays proportional to the number of internal pages, not the number of deleted entries.
Per-page encryption
Optional, authenticated, fixed at file creation. The nonce is derived rather than stored,
and it is built from a monotonic page-write counter kept apart from the transaction id —
not from txn_id itself — so a transaction's own lifecycle, however long it
runs, cannot make a nonce repeat.
This is what phase 1 has written so far, not a public API and not a shipping date. inro is still in phase 1.