Lacunari

Use case · Historical research

An archive spread across twelve hard drives

Forty years of scans, photographs, unit records and correspondence, held by a dozen members who each name files their own way. Three of them have the same document under three names. Nobody knows what the group collectively holds, and nobody can say what it is missing.

Pooling without losing attribution

$ lac doc add scans/*.pdf --source alice --subject "Operation Market Garden" $ lac doc extract

Documents are keyed by the SHA-256 of their contents. When Alice, Bob and Priya each upload the same scan under different filenames, the result is one document with three contributions. Nobody's credit is lost, and the duplication stops being a filing problem and becomes evidence: three people independently held this, which is corroboration.

Near-duplicates — a rescan, a worse OCR pass, a cropped version — are caught by text similarity rather than filename. Where two members recorded contradictory metadata, both readings are kept and the disagreement is recorded. Nothing is silently overwritten, because an archive that quietly resolves a contradiction has destroyed the evidence that there was one.

arnhem_final.pdfalice Scan_0043.pdfbob bridge (copy).pdfpriya SHA-256 → One document 4f2a1c8e9b03… Three contributions alice · bob · priya — all credited
Deduplication is not cleanup, it is evidence. Three people independently holding identical bytes is corroboration, and content addressing detects it without anyone agreeing on a filename.

The question nobody could ask before

$ lac web gaps year | documents | bar ------+-----------+------------ 1941 | 1 | 1942 | 1 | 1943 | 0 | ◻ MISSING 1944 | 1 |

Nobody typed that year in. Lacunari read the dates out of the documents, noticed the span was otherwise covered, and reported the hole. This is the thing full-text search structurally cannot do: ask a search engine for 1943 and it correctly returns nothing, which is indistinguishable from a question with no answer.

It requires three data points, not two, before it will call something a gap — two years establish no pattern, and one stray date would otherwise manufacture decades of false leads.

Turning holes into assignments

$ lac web suggest --dispatch → Find Operation Market Garden material for 1943 → Corroborate the Arnhem bridge photograph from a second source → Decide whether these two spellings are one person

Each becomes a task a member can claim, so two people do not spend a weekend in the same archive. Note the third one: similar names are proposed for merging and never merged automatically. A machine that decides two spellings are one person has made an unrecorded editorial judgement, which in a research context is a fabrication.

Two societies, one catalogue, no surrender

$ lac peer add kew https://kew.example/catalogue.json $ lac peer pull kew 2 they hold that we do not · 1 overlap · 1 titled differently

Because documents are content-addressed, combining two catalogues is a union rather than a negotiation — the same document has the same hash on both servers, whatever either group called it. You can search their catalogue without holding a byte of it, then fetch only what is worth having, hash-verified on arrival.

A peer's catalogue is treated as evidence, not authority: pulling never overwrites your metadata, and where two groups read the same document differently, both readings survive.

It runs offline. No model, no API key, no network. A group that can only reason about its own archive while somebody's subscription is current does not really own that archive.