247 людей у vault: GEDCOM, Python і трохи ISI

У мене був родовід на 247 людей у MyHeritage — і AI-агент який щодня читає мої нотатки, але не знав хто такий «брат». Один вечір, один Python-скрипт і 247 markdown-файлів — тепер Сюзанна знає всіх.

Share
Стара пожовкла сімейна фотографія на дерев'яному столі, з якої піднімається світлове золотисте дерево зв'язків, поруч відкритий ноутбук з рядками Python-коду.

← Серія статей: Генеалогія


19 червня 2026 я написав Python-скрипт. Увечері того ж дня у vault з'явилось 247 файлів.

У мене був родовід на 247 людей зібраний між 2009 і 2011 роком. Він жив у MyHeritage — платформі для сімейних дерев. Я зрідка заходив туди, але як інструмент щоденного використання він не існував.

Тим часом я почав вести щоденні нотатки і помітив проблему: щоразу, коли я згадував когось із роду — агент не знав, хто ця людина. «Брат» — а через кого? «Тітка» — а з якого боку? Без контексту нотатка слабша. А ще — Inverse Summary Inference, про що нижче.

Так родовід, що пролежав п'ятнадцять років мертвим вантажем на чужій платформі, за один вечір перетворився на живу частину vault.

Що таке GEDCOM і чому він лежав без діла

GEDCOM (Genealogical Data Communication) — стандартний формат для сімейних дерев. Звичайний текстовий файл з теґованою структурою. MyHeritage, Ancestry та більшість інших платформ підтримують експорт у .ged.

Виглядає це так:

0 @I1@ INDI
1 NAME Микола /Лавринович/
2 GIVN Микола
2 SURN Лавринович
1 SEX M
1 BIRT
2 DATE 1906
1 DEAT
2 DATE MAR 1997
1 FAMC @F1@

Один блок на особу. Зв'язки через ID сімей (@F1@ тощо). Читається просто — парсити теж не складно.

Але між «є .ged файл» і «247 markdown-файлів у vault з wikilinks» (внутрішні посилання Obsidian, що зв'язують нотатки одна з одною і будують граф) — Python-скрипт.

Архітектура: два шари

Перш ніж писати код — треба було вирішити де ці люди живуть у vault і як співвідносяться з активним шаром.

У мене вже є People/ — профілі живих людей з якими я реально взаємодію: колеги, друзі, родина. Там є Vika L., Serhiy K. та інші. Це активний шар — він оновлюється, там є нотатки, тікети, last_contact.

Родовід — інший за природою. Більшість із 247 людей я ніколи не зустрічав. Деякі померли до мого народження. Це архів, не активний шар.

Тому рішення: два окремих домени.

Genealogy/People/ — архів

Всі 247 осіб з GEDCOM живуть тут. Тільки генеалогічні дані: дати, місця, зв'язки, фото якщо є. Я не редагую ці файли вручну — скрипт перезаписує їх при кожному повторному імпорті.

Структура файлу особи:

type: genealogy_person
gedcom_id: "@I49@"
full_name_uk: "Микола Вікторович Лавринович"
birth_date: 1906
birth_place: "[[Genealogy/Places/Rossyya]]"
death_date: MAR 1997
gender: M
father: "[[Genealogy/People/Lavrynovych Vyktor]]"
spouses: ["[[Genealogy/People/Aleksandra (1910)]]"]
children: ["[[Genealogy/People/Lavrynovych Vytalyy (1935)]]"]
people_ref:

gedcom_id — оригінальний ID з .ged файлу (@I49@ з прикладу вище), потрібен щоб при повторному імпорті скрипт впізнавав ту саму людину і не плодив дублікати. spouses і children — списки wikilinks на файли інших осіб у тій самій Genealogy/People/, так граф зв'язків будується сам через стандартні посилання Obsidian. death_date тут навмисно рядком (MAR 1997), а не датою — GEDCOM часто містить лише місяць і рік, без дня.

Поле people_ref — лінк на профіль у People/ якщо для цієї людини він існує. Це міст між двома шарами.

People/ — активний шар

Тут — тільки ті хто є в моєму реальному житті. Для них є окремий профіль з повним контекстом. Вони можуть мати genealogy_ref — посилання назад у Genealogy/People/.

Так граф зв'язків між шарами є, але вони не змішуються.

Genealogy/Places/

Окрема папка для місць — Сагунівка, Кожани, Бобринецький район. Кожне місце — окремий файл з координатами і типом. Це дозволяє робити dataview-запити по географії — Dataview це плагін Obsidian, який дає шукати і фільтрувати нотатки за їхніми полями, як маленька база даних всередині vault.

Скрипт: GEDCOM → Obsidian

Mermaid family tree diagram in Obsidian showing five generations connected by parent-child links, dark theme.
Родинне дерево — 5 поколінь навколо автора, Mermaid-діаграма в Genealogy.md, згенерована з імпортованих даних.

Скрипт — Python, ~940 рядків, весь код на GitHub. Читає .ged файл, парсить кожну особу (INDI), кожну сім'ю (FAM), кожне місце (PLAC), і генерує markdown-файли. Якщо у вас теж є експорт з MyHeritage чи Ancestry — можете взяти цей скрипт як основу і адаптувати під свою структуру vault.

Основні кроки:

1. Парсинг GEDCOM

def parse_gedcom(filepath):
    individuals = {}
    families = {}
    # читаємо теги рівнями 0, 1, 2
    # збираємо INDI блоки → словник {id: {name, birth, death, ...}}
    # збираємо FAM блоки → пари HUSB/WIFE + CHIL

2. Побудова зв'язків

Після парсингу знаємо ID кожної особи і ID сімей. З сімей — хто чий батько/мати/дитина/подружжя. Формуємо для кожної особи списки father, mother, spouses, children, siblings.

3. Транслітерація та файлові імена

GEDCOM зберігає імена так, як були введені — у нашому випадку переважно кирилицею. Ім'я файлу має бути читабельним і унікальним. Скрипт транслітерує прізвище і ім'я латиницею і додає рік народження для унікальності:

Лавринович Микола 1906 → Lavrynovych Nykolay (1906).md

4. Генерація markdown

Для кожної особи — YAML frontmatter + таблиця основних даних + секції Батьки / Подружжя / Діти / Брати-сестри / Нотатки. Всі зв'язки як wikilinks на файли в Genealogy/People/.

Другий скрипт: українізація імен

Окремий файл, ~360 рядків — заповнює поле full_name_uk вже після імпорту. GEDCOM містив імена у різних форматах: російськомовні, скорочені, іноді латиницею. Скрипт проходить по всіх файлах у Genealogy/People/ і намагається:

  • транслітерувати з латиниці
  • конвертувати з російської форми в українську (Николай → Микола, Виктор → Віктор)
  • зберегти оригінал у full_name_ru

Результат — кожна особа має і оригінальне ім'я і українську версію.

ISI і чому зв'язки важливіші за дати

ISI — Inverse Summary Inference. Це коли агент читає нотатки за певний період і будує зв'язний контекст: хто є хто, що відбувалось, як події пов'язані між собою.

До імпорту: я пишу «брат приїхав». Агент бачить слово «брат» — але не знає хто саме, через кого пов'язані, яке прізвище. При ISI ця нотатка матиме нижчу якість — агент не може зв'язати її з контекстом роду.

Після імпорту: у People/ є профіль з genealogy_ref. У Genealogy/People/ є його файл з батьком, матір'ю, ланцюжком до спільного предка. Агент при ISI може відновити повний контекст зв'язку.

Це і є «золотий час моїх трудів» — дані зібрані у 2009–2011, але реально почали працювати тільки зараз.

Obsidian graph view showing a dense Genealogy/People/ cluster interconnected through parent-child wikilinks, separated from the People/ layer.
Кластер Genealogy/ у графі vault — 247 файлів з'єднані через wikilinks батьків і дітей, ізольовані від активного шару People/.

Результат

247 файлів. 21 місце. Mermaid-діаграма п'яти поколінь у Genealogy.md.

Що змінилось для агента: тепер при будь-якій згадці людини з роду — є файл з повним контекстом зв'язків. Не треба пояснювати ланцюжок. Нотатка про зустріч з братом автоматично несе в собі весь генеалогічний контекст.

Що змінилось для мене: родовід перестав бути архівом на платформі куди я заходжу раз на рік. Він тепер частина системи, де я думаю щодня.

Read more

Автор за кермом Mazda CX-5 розмовляє з голосовим AI-агентом Сюзанною через CarPlay

Голосовий AI-асистент на Vapi, Zadarma та Hermes Agent

Я хотів диктувати нотатки за кермом без рук на телефоні — і зрештою навчив свого AI-агента телефонувати мені самому. Історія про Vapi, український номер Zadarma, дорогі помилки на старті і покроковий рецепт, як зібрати те саме собі.

By Volodymyr Lavrynovych
Рука тримає під кутом планшет зі списком активних AI-інтерв'ю на екрані — світле фотореалістичне фото

Від ідеї до сайту за вечір: як я прибрав себе з інтерв'ю

Я провів інтерв'ю вручну — копіював повідомлення між AI-агентом і учасником, як живий посередник. Після цього написав нотатку з ідеєю прибрати себе з ланцюжка. За один вечір нотатка стала живою платформою.

By Volodymyr Lavrynovych, Susanna
Обкладинка «Сонце для тебе» — фото Тенеріфе (океан, скелі, готелі) з накладеною типографікою назви треку

Перший реліз SHUM & RUTA: як я сам ловив і виправляв власні помилки

Перший реліз дуету SHUM & RUTA — і перший урок незалежного артиста: без менеджера й страховки сам ловиш власні помилки і сам їх виправляєш. Історія одного релізу, несподіваної проблеми з Apple Music і того, що з цього виніс.

By Volodymyr Lavrynovych, Susanna
Руки тримають стару чорно-білу сімейну фотографію при свічці. На дерев'яному столі — розкладені старі фото і рукописні листи.

Хранитель сімейного дерева

З 2009 по 2011 рік я зібрав родове дерево — 247 людей, п'ять поколінь, більше двадцяти прізвищ. Записав дати, зібрав фотографії, ходив на кладовище, з'їздив з батьком до Брянської області. Потім дані лежали роками без діла. Ця стаття про те, навіщо це взагалі і що дала ця праця.

By Volodymyr Lavrynovych, Susanna