Family Tree Visualization Libraries — Research 2026-05-02
Контекст: Lunar Hubble (особистий проект Сергія, рід Верещаків) — 91 person + 144 relationships. Поточний рендер самописний (HTML divs + SVG ліній з топ-сортуванням по поколіннях) — лінії заплутані, читабельність низька. Стек: FastAPI + чистий HTML/JS, без npm/Webpack pipeline. Шукаємо OSS бібліотеку з CDN-інтеграцією та підтримкою couple/parent_child зв'язків.
TL;DR
Для нашого MVP найбільше підходить donatso/family-chart (720⭐, MIT, D3 під капотом, єдина в топі canonical family-tree бібліотека з нативною моделлю couples + parents + children та CDN-доступом). Як бекапи для конкурсу side-by-side: bumbeishvili/d3-org-chart (1183⭐, найкращий «полірований» рендер з search/mini-map/HTML-template для нод — потребує адаптації couples як псевдо-нод) і CCGE-BOADICEA/pedigreejs (74⭐, GPL-3.0 — медичний pedigree, тому ліцензія обмежує, але рендер найбільш «правильний» генеалогічно). Якщо хочеться графовий підхід замість дерева — cytoscape.js (10957⭐) з custom layout.
ТОП-кандидати (sorted by relevance + stars)
- Тип: vanilla JS (TypeScript source) на D3, framework-agnostic (React/Vue/Angular/Svelte/vanilla — всі підтримуються)
- Family-specific?: Yes. Нативна модель
rels: { spouses: [...], parents: [...], children: [...] } — пара малюється горизонтально, діти спускаються вниз від couple-node. Сімейні специфічні фічі: main-person focus, expand/collapse гілок.
- Color by attribute: ✅ — повний контроль через card-renderer (SVG або HTML cards). Можна фарбувати по
data.last_name через кастомний template.
- Editing: ✅ — є EditTree API (форми додавання/редагування/видалення родичів)
- Bundle: UMD
family-chart.min.js ~104 KB (uncompressed з CDN), повний family-chart.js ~243 KB
- Стандартні фічі: zoom, pan, focus on person, expand/collapse, edit dialog. Search — немає вбудованого, треба робити поверх.
- Інтеграція в FastAPI/HTML: CDN-доступний —
https://cdn.jsdelivr.net/npm/family-chart@0.9.0/dist/family-chart.min.js. Зразу <script src=...> + <div id="FamilyChart"></div> + JSON.
- Pros: єдина в топ-class бібліотека, де couple/parents/children — first-class concept (не потрібно «обманювати» org-chart). MIT. Активна (last push 2026-04-08). Демо-builder існує.
- Cons: релізи нерегулярні (
v0.0.0 тег у GitHub releases), документація розкидана між README + docs/, search треба писати самому, 720⭐ — це менше ніж у generic alternative, але це найбільша family-specific бібліотека.
- Last release:
0.9.0 на npm + останній push 2026-04-08
- License: MIT
- Тип: vanilla JS на D3 v7, є wrappers для React/Vue/Angular
- Family-specific?: No — це org-chart, але має все потрібне для адаптації під family-tree. Couples доведеться моделювати як invisible "marriage" node (як у dTree-style), а потім всі діти лінкуються до цієї невидимої ноди. Є multi-root і drag&drop.
- Color by attribute: ✅ —
nodeContent callback повертає HTML-template з повним CSS-control (border colors, bg per last_name)
- Editing: часткове — drag-rearrange, add/remove children, але це org-style без spouse-логіки
- Bundle: ~42 KB minified (UMD з jsdelivr)
- Стандартні фічі: search, mini-map, zoom, pan, collapsible, multi-root, custom HTML templates, експорт у PNG/PDF, paging для великих дерев
- Інтеграція: CDN —
https://cdn.jsdelivr.net/npm/d3-org-chart (42 KB)
- Pros: найкраще «з коробки» по UX (mini-map + search + експорт). Найбільше зірок серед tree-візуалізаторів. Активний. Найменший bundle серед альтернатив.
- Cons: для couples треба conventions (invisible marriage-node), що додає preprocessing-крок до даних. Не визнає поняття «другий чоловік» (повторні шлюби — челендж).
- Last release:
3.1.1 на npm, активність 2025-04
- License: MIT
- Тип: vanilla JS на D3 (медичний pedigree-edytor — використовується в BOADICEA breast/ovarian cancer risk tool, опубліковано в Bioinformatics journal 2018)
- Family-specific?: Yes, найканонічніший pedigree-стиль. Підтримує: couples horizontal (з маркерами consanguinity), parent_child вертикально, sibling-bar (горизонтальна лінія між дітьми пари), twins. Stillbirth/deceased маркери.
- Color by attribute: ✅ — кожна node має
disease-атрибути з кольорами (чверті/половини). Можна перевизначити під last_name.
- Editing: ✅ — повний CRUD з контекстними меню, undo/redo через localStorage history, full-screen mode
- Bundle: ES build
pedigreejs.es.v3.0.0-rc8.js доступний, npm-пакет @ccge/pedigreejs існує. CDN-build треба self-hosted або через unpkg/jsdelivr з repo
- Стандартні фічі: zoom, pan, full-screen, undo/undo, PED/CanRisk import/export, print/SVG export
- Інтеграція: npm + ES module або self-host через jsdelivr
gh/CCGE-BOADICEA/pedigreejs. Залежить від jQuery + d3 (є нюанс — jQuery досі потрібен).
- Pros: найбільш генеалогічно-правильний рендер (специфікація pedigree nomenclature), активний (push 2026-03), наукова репутація
- Cons: GPL-3.0 — це copyleft, що означає якщо колись захочеш вийти комерційно з Lunar Hubble — доведеться розкривати код. Для особистого проекту OK. UI медичний (квадрати/кола замість аватарок) — треба customize.
- Last release: активний branch,
v3.0.0-rc8 на npm, push 2026-03-03
- License: GPL-3.0 (єдиний серед топ-3 не-MIT — flag для уваги)
- Тип: vanilla JS на D3 v4 + lodash 4
- Family-specific?: Yes — спеціально для multi-parent trees (family-trees). Marriage-node як з'єднувач, parent-child через нього. Підтримує множинні шлюби.
- Color by attribute: ✅ через CSS класи +
nodeRenderer callback
- Editing: ❌ read-only (не authoring tool)
- Bundle: ~19 KB (dTree.js dist)
- Стандартні фічі: zoom, fit-to-viewport, callbacks (nodeClick, marriageClick)
- Інтеграція: npm
d3-dtree + jsdelivr CDN. Залежить від D3 v4 (legacy) + lodash.
- Pros: найменший bundle серед family-specific, MIT, концепція marriage-node — точно та що нам треба
- Cons: остання активність 2024-05, реліз v2.4.1 у квітні 2020 — вже застарілий D3 v4 (зараз v7). Read-only. 47 open issues.
- Last release:
v2.4.1 (2020-04)
- License: MIT
- Тип: vanilla JS, графова бібліотека (network/graph theory)
- Family-specific?: No — це графовий рендеринг загального призначення, але саме family-tree як граф (з nodes + edges типу
parent_of/spouse_of) природно лягає. Layout dagre або klay дасть hierarchical, manual positioning теж можливий.
- Color by attribute: ✅ — selectors (
node[last_name = 'Верещак'] { background-color: #0ca789 }) — найпотужніша система стилізації серед усіх кандидатів
- Editing: ✅ через extensions (
cytoscape-edgehandles, cytoscape-context-menus)
- Bundle: ~424 KB minified (UMD з jsdelivr) — найбільший в шорт-лісті
- Стандартні фічі: zoom, pan, selection, layouts (cose, dagre, klay, breadthfirst), animations, extensions ecosystem (50+), export
- Інтеграція: CDN —
https://cdn.jsdelivr.net/npm/cytoscape/dist/cytoscape.min.js (424 KB)
- Pros: найбільш стабільна (10K+ зірок, наукове ком'юніті), MIT, неймовірно гнучка стилізація через CSS-селектори, активна, ідеальна якщо хочемо мати graph-mode з можливістю показувати не тільки дерево а й «мережу зв'язків»
- Cons: треба самому конструювати couple-логіку (як edge type, або через invisible marriage-nodes), bundle великий, layout під family-tree треба підбирати (dagre extension — ще +50 KB)
- Last release:
v3.33.3 (2026-04-29) — найсвіжіший
- License: MIT
- Тип: React (наявний
@xyflow/react) + Svelte (@xyflow/svelte). Vanilla — немає.
- Family-specific?: No, generic node-based UI. Family-tree можна побудувати manually.
- Color by attribute: ✅ через custom node components
- Editing: ✅ — drag, connect, delete edges, custom handles
- Bundle: ~225 KB ESM
- Pros: найвища якість UX серед усього списку, активна (2026-04-29), MIT, mini-map + controls + background з коробки
- Cons: React-only — конфліктує з нашим «без npm/Webpack» constraint. Якщо колись мігруємо на React/Vite — топ-кандидат, але зараз не підходить.
- License: MIT
- Тип: vanilla JS, комерційний продукт з free-tier
- Family-specific?: Yes
- Color by attribute: ✅ (templates)
- Editing: ✅ (повний editor)
- Bundle: через CDN
https://balkan.app/js/familytree.js
- Pros: найбільш «полірований» UI з демок, повний editor, експорт PDF
- Cons: license неясна / commercial — у репо немає LICENSE, basic-tier free але advanced features (pro templates, search, тощо) — paid. Для конкурсу (де ми хочемо OSS) не рекомендую.
- License: ❌ proprietary (free tier обмежений)
- React-only, останній реліз 2019-07, MIT. Скоріше архівний — пропускаємо.
- На d3-dag, GPL-3.0, активний (push 2026-04-19), TypeScript. Цікавий, але GPL і нішевий — як backup-experiment може бути.
Порівняльна таблиця
| Lib |
Stars |
License |
Family-spec |
CDN |
Bundle |
Edit |
Color |
Last activity |
| donatso/family-chart |
720 |
MIT |
✅ native |
✅ |
~104 KB |
✅ |
✅ |
2026-04 |
| bumbeishvili/d3-org-chart |
1183 |
MIT |
⚠️ adapt |
✅ |
~42 KB |
⚠️ |
✅ |
2025-04 |
| CCGE-BOADICEA/pedigreejs |
74 |
GPL-3.0 |
✅ canonical |
⚠️ self-host |
~? |
✅ |
✅ |
2026-03 |
| ErikGartner/dTree |
555 |
MIT |
✅ multi-parent |
✅ |
~19 KB |
❌ |
✅ |
2024-05 |
| cytoscape/cytoscape.js |
10957 |
MIT |
⚠️ adapt |
✅ |
~424 KB |
✅ ext |
✅ powerful |
2026-04 |
| xyflow/xyflow |
36402 |
MIT |
❌ generic |
npm only React |
~225 KB |
✅ |
✅ |
2026-04 |
| BALKANGraph/FamilyTreeJS |
87 |
proprietary |
✅ |
✅ |
? |
✅ |
✅ |
2025-11 |
| visjs/vis-network |
3560 |
Apache-2.0 |
❌ generic |
✅ |
~644 KB |
⚠️ |
✅ |
2026-05 |
| bkrem/react-d3-tree |
1195 |
MIT |
❌ tree only |
npm React |
~? |
❌ |
✅ |
2025-02 |
Рекомендація для конкурсу
Запропонувати агентам side-by-side порівняння на наших 91 person + 144 rels:
- donatso/family-chart — як baseline і найбільш family-native. Перевіряємо чи рендер автоматично дає чисті couple-bars + sibling-rows без додаткових танців.
- bumbeishvili/d3-org-chart — як «UX-полірований» варіант. Перевіряємо чи можемо адаптувати couples через invisible marriage-nodes і чи виходить читабельніше за самописне з search + mini-map.
- cytoscape.js + dagre layout — як «graph mode» альтернатива. Перевіряємо чи дозволяє тримати mode toggle: «дерево» (dagre layout) vs «мережа» (cose-bilkent), що додасть value над просто рендером.
Опційний 4-й: pedigreejs — якщо хочеться «найбільш академічно-правильний» рендер pedigree-стилю, але GPL-3.0 змушує бути обережними.
Виключити: xyflow (React-only — у нас vanilla), BALKAN (closed-source), dTree (D3 v4 застарів, read-only), SanichKotikov (2019 archive).
Готовий бриф для конкурсних агентів
Завдання
Зробити drop-in tree.html для проекту Lunar Hubble, який рендерить родинне дерево Верещаків з реальних даних /srv/projects/family-tree-mvp/data/persons.json + relationships.json (91 особа, 144 зв'язки) — використовуючи призначену OSS-бібліотеку.
Дані
persons.json — масив об'єктів:
{
"id": "uuid",
"first_name": "Іван",
"last_name": "Верещак",
"maiden_name": null,
"gender": "Male|Female|Unknown",
"life_status": "Living|Deceased",
"is_living": true,
"notes": "{\"generation\": 0, \"x_pos\": ..., \"y_pos\": ..., \"generation_color\": \"#0ca789\", \"miro_id\": \"...\"}"
}
relationships.json — масив об'єктів:
{
"id": "uuid",
"person_1_id": "uuid|null",
"person_2_id": "uuid|null",
"relationship_type": "parent_child|spouse|sibling"
}
Важливо: для parent_child person_1 = parent, person_2 = child. Для spouse порядок не важить. Дані містять "сміттєвий" relationship (type: "123" з null person_id) — фільтрувати на завантаженні.
Обов'язкові вимоги (acceptance criteria)
- Couples render horizontally: чоловік+дружина — поряд, з'єднані горизонтальною лінією (couple-bar).
- Parent-child vertically: діти спускаються вертикально нижче від couple-bar.
- Sibling row: всі діти однієї пари вирівняні по горизонталі, з'єднані зверху одною лінією (sibling-bar).
- Color by
last_name: палітра автоматично присвоюється унікальним прізвищам (наприклад: Верещак=#0ca789, Клименко=#f59e0b, ...). Maiden_name не змінює колір ноди.
- Node card показує: фото (якщо є в
/data/photos/<id>.jpg), first_name + last_name (maiden_name у дужках для жінок), роки життя.
- Deceased — пунктирний бордер або сірий тон.
- Performance: 91 нода + 144 ребра — рендер < 500ms, smooth zoom/pan на ноутбуці.
- Інтеграція: один
tree.html файл + CDN-link на бібліотеку, без npm/Webpack. Якщо бібліотека потребує build — додати pre-built JS в frontend/dist/.
- MIT/Apache-2.0/BSD ліцензія обов'язково (виключити GPL/proprietary).
Бажано (nice-to-have)
- Search by name (Ctrl+F)
- Mini-map для навігації
- Click-on-node → bottom-sheet з деталями (notes, sources)
- Mode toggle: tree-view vs graph-view
Deliverables
frontend/tree-<libname>.html — самодостатня сторінка з рендером.
frontend/data-adapter-<libname>.js — функція transform(persons, rels) → libFormat.
- Скріншот результату на full dataset.
- Короткий README: чому ця бібліотека, відомі обмеження, як додавати персон.
Бібліотеки для side-by-side агентів
- Агент 1: donatso/family-chart (https://github.com/donatso/family-chart) — CDN https://cdn.jsdelivr.net/npm/family-chart@0.9.0/dist/family-chart.min.js
- Агент 2: bumbeishvili/d3-org-chart (https://github.com/bumbeishvili/org-chart) — CDN https://cdn.jsdelivr.net/npm/d3-org-chart
- Агент 3: cytoscape.js + dagre layout (https://github.com/cytoscape/cytoscape.js) — CDN https://cdn.jsdelivr.net/npm/cytoscape/dist/cytoscape.min.js + https://cdn.jsdelivr.net/npm/cytoscape-dagre/cytoscape-dagre.min.js
Критерії перемоги
- Чи couple/sibling-bars видно з першого погляду (читабельність — головне).
- Чи легко додати нову персону (1-2 рядки в JSON → з'являється у дереві без ручного позиціювання).
- Чи search/mini-map працюють.
- Bundle + час до first paint на повних даних.
- Чи код майнтейнабельний (data-adapter простий, не 200 рядків костилів).
Sources