Get in touch

From the workshop

Granary

A family tree that remembers stories, not just dates.

Privacy-first genealogy, self-hosted. An interactive D3 tree that lights any lineage back ten generations, timelines and a map of birthplaces, and the family stories attached to the people they are about. Send one relative a link to their own branch and that is all they see.

In beta Web
Laravel Vue D3.js Leaflet GEDCOM import Scoped access
The build story

The build story

The dates are the least of it.

Somewhere in my family’s records is the story of a bomber pilot who flew a full tour of operations out of Lossiemouth, thirty-six runs over Berlin, the south of France and Italy, and came home with a DFC. In every genealogy tool I tried, that man is a name, two dates, and a line to his children. Granary started from the conviction that the story is the record, and the dates are just its index.

It’s a privacy-first family tree: Laravel and Vue, a D3 tree you can click through (pick a person and everyone outside their lineage fades back, ten generations of ancestors lit at once), two timelines, and a Leaflet map of birthplaces. It started as a 190-person GEDCOM export running from Suffolk farm labourers through Prussian and Bavarian emigrants to Wellington, New Zealand. Digitising one relative’s research added another 797.

Genealogy dates are feral

Real family records say things like ABT 1823, 4Q 1897, or “circa 1950–52”, and most software either rejects them or sorts them as garbage. Granary stores every date twice: the display column preserves exactly what the source said, while a parser that understands GEDCOM qualifiers and British civil-registration quarters derives a hidden sortable column. Uncertainty stays honest on screen; chronology still works underneath. The same respect-the-source instinct runs through the schema: partnerships are gender-neutral partner1/partner2, and children connect through a pivot that handles half-siblings and adoptions without contortions.

Stories as first-class records

The oral histories came in as Word documents, decades of a relative’s memoir writing and six ancestor charts, and a custom parser splits them into per-person narrative sections, exports structured JSON, and imports them as typed story notes attached to individuals and families. That run produced 797 people and 188 families, and the JSON is checked in, so the import is repeatable rather than a heuristic parse I have to trust twice. Notes and sources are polymorphic, so a settlement certificate from 1765 and a war memoir attach through the same mechanism. Open a person and you get their paragraphs, not just their plumbing.

Private by architecture, not by policy

Family data is the most personal dataset there is, and the big genealogy platforms monetise it. Granary’s answer is structural: self-hosted on my own server, photos on my own disk, no third-party trackers. The visitor numbers come from my own Umami instance, served from a path on the site’s own domain, so nobody outside the family sees a request either. Nobody’s great-grandmother is training someone else’s model.

The gate has three tiers now, not two. The shared family password opens the whole tree, an admin login sits behind it, and in between is a relative who has been sent a link to their own branch: revocable, expiring, and scoped to one precomputed set of people. Ask for anyone outside that set and you get a 404, never a 403, because a 403 confirms the record exists and lets you count the half of the family you were not given. Relationship lines are dropped unless both people on them are visible, for the same reason. A line pointing at nobody still announces that somebody is there.

One thing does leave the disk, and only when I ask it to. An admin can send a single damaged scan to Gemini to be colourised or repaired, and the restored copy comes back as a new photo beside the original rather than over it. It is per photo, it is a deliberate act, and the original is never the thing that gets overwritten.

Honestly: still one family’s

Granary is the youngest project in the workshop, and it is an archive for one family rather than something you can sign up to. Its own front door says so. What has changed since the first version is the floor under it: 107 tests in the suite, and ten browser scripts that drive the real admin screens, because the thing most likely to lose a record here is me editing one. The capture of spoken history (record an elderly relative, let the machine do the structuring) is still designed and not built. The family tree it holds is real, though, and growing, which is the only metric this one was ever built for.

Got a precious dataset that deserves software built around it, not the other way around? Here’s how we could work together.

Visit Granary