# My family tree became a 404, so I built one that lives on my computer

> Source: <https://dev.to/devcarlat800/my-family-tree-became-a-404-so-i-built-one-that-lives-on-my-computer-1ad6>
> Published: 2026-10-31 19:12:04+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)*

I used to keep my family tree on a genealogy website: names, dates, photos. Then the site shut down, and everything I had put there turned into a 404.

That's my ghost in the machine: a family that still exists somewhere, in a database I can't reach anymore.

**Tell the Tree** is the tree I wish I'd had. You fill it in by telling it about your family, in plain sentences, in English or Italian:

Allegra è figlia di Claire e di Lord Byron.

*(Allegra is the daughter of Claire and Lord Byron.)*

A small open-weight model, **Gemma 4 E2B**, runs on my computer through Ollama and reads the sentence. My code checks it and shows the change in the tree as a dashed "new" preview. Nothing is saved until I confirm, and nothing ever leaves my computer.

It's for anyone who has family stories in their head and doesn't want to hand them to a website that might close one day.

The demo family has a ghost story of its own: the Godwins, the Shelleys and Lord Byron at Villa Diodati in 1816. That was the rainy summer when, stuck indoors, they held a ghost-story contest and Mary began writing *Frankenstein*. It's also a hard family to put in a tree. Mary's father, her half-brother and her son were all called William. Her husband and her son were both Percy. There are stepsisters and half-sisters everywhere.

Tell the Tree runs locally, so there's no live link. Here it is in action:

*I type "Elizabeth è la sorella di Percy" (Elizabeth is Percy's sister). The tree has two Percys, so it asks which one I mean, shows Elizabeth as "new", and saves her only when I click "Add to tree". This was the first sentence after starting the app, so Ollama was still loading the model: the 22.7 seconds on screen are real, but I shortened that wait in the GIF.*

Besides telling the tree in sentences, you can:

**A family tree you build by telling it, in plain sentences. It runs entirely on your own computer.**

You write sentences like *"Mary's father was William Godwin"* or *"Allegra è figlia di Claire e di Lord Byron"* (English or Italian). A small local model, **Gemma 4 E2B** running through Ollama, reads the sentence. The code checks it against the tree and shows you a **preview** of the change. Nothing is saved until you confirm, and your data never leaves your computer.

Built for DEV's "Ghost in the Machine" challenge, October 2026.

I used to keep my family tree on a genealogy website. The site shut down, and everything I had entered turned into a 404. I wanted a tree that lives on my own computer, in a file I own, that I can export to a standard format (GEDCOM), and that I can…

Family relationships are full of traps. In Italian, *nipote* can mean grandchild, or nephew or niece. A model asked to "work out the relationship" can get this wrong in a quiet, believable way, and a wrong link in a family tree is worse than a missing one.

So I split the work:

Then the code runs its checks:

Every fact keeps the sentence it came from. Finally the change appears in the tree as a dashed preview, and only my confirmation saves it.

`gemma4:e2b-it-qat`), running locally with Ollama
I tried both on my 15 test sentences:

| Model | Gemma alone | With my code | 
|---|---|---|
| Gemma 4 E2B | 14/15 | 15/15 | 
| Gemma 4 E4B | 12/15 (13/15 after one fix) |  | 

E4B was also 2.5 times slower. Fifteen sentences is a small test, so I don't read too much into it, but it was enough to stay with E2B.

I wrote those 15 sentences myself while I was building, so they're clean, and a score on them doesn't prove much.

So before writing the engine, I wrote 6 more sentences in everyday spoken Italian, about an invented family, and put them aside. When the code was finished, I froze it with a git tag ([`holdout-run`](https://github.com/carla800/tell-the-tree/tree/holdout-run)) and ran the 6 sentences exactly once.

|  | Result | 
|---|---|
| Gemma alone | **1/6** | 
| With my code | **5/6** | 

Here is what Gemma did with spoken Italian:

Sentence h06 went the other way. Gemma got it right and **my code got it wrong**: it merged two different Williams into one person. That was exactly the trap I had written into that sentence.

The 5/6 also needs a warning. It only measures whether the code made the right decision: save, ask, or refuse. In 3 of those 5 cases, it would have saved wrong names, like "Nonna Lucia". The only thing standing between those mistakes and the tree is the preview, where I see the dashed "new" people and can say no.

These are the real ghosts in my machine: a "papà" who isn't anyone, a wedding that never happened, two Williams who became one. The preview is how they stay out of the family.

I didn't fix anything before publishing. If I fixed the code until those 6 sentences passed, they would become test sentences like the others, and the number would stop meaning anything. So it stays 1/6 and 5/6.

What's next:

For this project, it's the whole point.

**It can't disappear on me.** My last tree lived inside someone else's service and died with it. Tell the Tree keeps each family in a single file on my computer, exports to GEDCOM, and uses a model whose weights are on my own disk. If I stopped working on this app tomorrow, the tree would still be mine.

**Family data is private data.** Names, birth dates and photos of people who are still alive, and who never agreed to be on anyone's server. Here, none of it leaves the computer.

**The model can't change under me.** I tested one specific model, and because it runs locally, that's the model the app keeps using. With a closed API, the model behind the endpoint can be updated or retired, and my test results would quietly stop being true. A secret test that runs once only means something if the model stays the same.

**Trying another model was easy.** Comparing E2B with E4B meant pulling another model with Ollama and running the same tests.

**It costs nothing to run.**

Día de los Muertos is about remembering the people who came before us. A family tree is a quiet version of the same thing: a place where people who are gone still have a name, a date, a face.

The part of Tell the Tree I care about most is a small one: every fact keeps the sentence it came from. Not just a date in a box, but the words someone used when they told it.

My old website lost everything at once. This time, the people, the photos and the words all stay in a file on my own computer.

**Best Use of Gemma.** Gemma 4 E2B runs locally through Ollama and reads every sentence. The app is designed around what a small local model is good at (copying words out of a sentence) and what I'd rather not trust it with (deciding what a relationship means), and I measured both, including where it fails.

The full story, mistakes included, is in my [DEVLOG](https://github.com/carla800/tell-the-tree/blob/main/DEVLOG.md).

Thanks for reading. And if your family history also lives on a website you don't control, maybe export it today.
