Stemma is a browser-based viewer and editor for GEDCOM files, the format every genealogy program exports. Load a .ged (or JSON/YAML) file, read the tree as a classical chart, a force graph or an orbitable 3D scene, edit people and families, and save it back out. It is a static page with no backend: the file is parsed in the tab and never uploaded.
Focus mode: one person plus relatives out to a chosen distance, with a badge counting the relatives folded away behind each link.
Motivation
Our family tree existed as a scanned chart and a PDF, and every desktop genealogy program I tried wanted a catalog, an install and a licence before it would show me anything. I wanted to open the file, see the shape of it, and fix the wrong birth year I had just spotted, without any of that. So the whole thing is one static page: open it, drop the file in, and everything happens in the tab.
The tree is also too big to read at once. About 160 people already make a chart nobody can follow, which is why most of the work went into the views: a focus mode that narrows to one person and their relatives, a 3D scene that stacks generations along time, and a map that plays the family moving across a century.
The 3D view stacks people along a time axis and lets you orbit the result. Large trees switch to instanced rendering and a distance cull.
Features
- Three views of the same data: a classical family tree chart, a force graph for when the chart's rows get in the way, and a 3D scene stacked by time or generation that you can orbit
- Focus mode: narrow the tree to one person and relatives out to a chosen distance, with counts of what is hidden behind each link so nothing disappears silently
- Map over time: every birth, death and marriage that names a place, plotted with a year range you can sweep to watch the family move. Missing coordinates are looked up one at a time and, once you tick them, written into the records as standard
PLAC/MAPsubtrees so the next load needs no lookup at all - Editing with a change log: click a person or family to edit, add parents, spouses and children. A field-level log lists everything changed since the file was opened, which is exactly what a save will write
- Import from awkward sources: merge another GEDCOM, JSON or YAML file with a review step, or parse plain text and scanned charts (OCR) into records
- Statistics: lifespans, ages at marriage, children per family, births per decade, data coverage, each one clickable down to the people behind the number
- Working file: in Chromium browsers the last file can be reopened and saved back over in place; everywhere else saving falls back to a download
The map: circles sized by event count, a year slider that plays through, and a places list that lets you correct a bad geocode.
Tech Stack
- Vanilla JavaScript as native ES modules, no framework and no build step.
python -m http.serveris the entire toolchain - D3 for the 2D chart and force simulation, three.js and 3d-force-graph for the 3D scene, both vendored so the page has no CDN dependency
- A hand-written GEDCOM parser and serializer that round-trips the lines it does not understand, so saving never silently drops what another program wrote
- OpenStreetMap tiles and Nominatim for the map, Tesseract.js for OCR imports, all opt-in and none of them touched on load
localStoragefor settings and an autosave slot, with every setting declared in one registry that validates stored values against their declared range- Plain Node test suites over jsdom, no framework
The one architectural decision worth naming is that the file is the state. There is no database and no session: the parsed tree lives in memory, the change log diffs it against what was loaded, and a save serializes it straight back to GEDCOM. Everything else is a view of that.
Statistics over the whole tree. Every figure drills down into the list of people it came from.
Links
Stemma runs at stemma.lucafluri.ch; open it and drop a .ged file in. The source code is available on GitHub.