type: project
name: Родинне дерево (Family Tree)
slug: family-tree
status: mvp
readiness_pct: 50
owner_agent: TODO
products: []
created: 2026-04-14
last_updated: 2026-05-02
Родинне дерево (Family Tree)
Особистий проект Сергія — оцифрувати родовід, який багато років копає його батько (60+) по метричних книгах. Кінцева аудиторія — родичі (європейська гілка роду).
Кодова назва (історично) у репозиторіях: lunar-hubble. У бесідах і документах — «Родинне дерево» або «Family Tree» (Сергій 2026-05-02: «зватимемо просто, щоб простіше було вказувати шлях»).
Meta
Чому це робимо (voice Сергія 2026-05-02)
- Батько Сергія (60+, не дружить з технологіями) копає історію роду по метричних книгах: де хто жив, чим займався, де похований
- Сергій хоче оцифрувати ці знання для родичів (європейська гілка)
- Кінцеві користувачі — дядьки, тітки, брати з європейського роду — щоб могли подивитись те, що знає батько
2 адміни з різними потребами
- Сергій — займається архітектурою + візуалізацією + бекенд-сервісами
- Батько (60+) — потребує:
- Максимально проста, інтуїтивна адмінка (редагування фактів, фото)
- Telegram-бот з voice-капабіліті (диктувати спогади голосом, друкувати — блокер)
- Тегування людей у спогаді (один спогад / фото може стосуватись кількох родичів)
KPIs
- К-сть персон у дереві (зараз 91)
- К-сть зв'язків (зараз 144)
- К-сть spогадів (зараз 1)
- К-сть фото (зараз 1)
- К-сть джерел/метричних книг (зараз 0 — потрібно імпортувати)
Цільова архітектура (з voice)
- Web-client — публічна частина для родичів (читання, 2D/3D-візуалізація)
- Web-admin — клієнт + редагування об'єктів (для Сергія)
- Telegram-бот для адміна — батько диктує voice → транскрипція → entity-tagging → approve → запис до конкретного персонажа
- БД 2-частинна:
- Текстові дані + зв'язки (хто чий батько/мати, біографії, факти, теги)
- Фото + посилання на метричні книги — на власному Google Drive Сергія
Поточна проблема (motivation для v2)
- v1 робився локально у Antigravity (Google's VS Code fork з Gemini)
- Складно підтримувати: кожна правка щось ламає
- Цільова задача MVP v2 — повторити що зараз є, але на правильній архітектурі
Design
v2 — пропозиція (повний звіт 2026-05-02)
Повний архітектурний аудит і план: lunar-hubble-v2-architecture-2026-05-02.md (~58KB, 21 знайдена проблема)
Стек v2:
- Next.js 15 (App Router) + Vercel замість Vite SPA + Cloud Run
- Supabase Postgres + нормалізована схема (прибрано JSON-в-
notes)
- aiogram 3 на VPS systemd (не Cloud Run)
- faster-whisper + Gemini 2.5 Flash + inline approve-кнопки
- Google Drive фото — приватний SA storage + Next.js
/api/photo/[id] proxy
Прибрати з deps:
d3, react-force-graph-2d/3d, tau-prolog (не використовуються) → bundle -700KB
3 спринти × 1 тиждень:
- Foundation (новий репо + CI/CD + імпорт даних + базовий tree-view)
- Telegram-bot (voice → whisper → Gemini → entity tagging → review flow → DB + Google Drive)
- Web Admin (CRUD UI persons/relationships/memories + спрощений «батько-mode»)
Інфраструктура (станом на 2026-05-02 пізнього вечора)
Зберігання даних
| Що |
Де |
Власник |
| БД (persons / relationships / memories / sources / photos metadata) |
SQLite на VPS: /srv/projects/family-tree-mvp/data/family.db |
Сергій |
| Фото (файли) |
Локально на VPS: /srv/projects/family-tree-mvp/data/photos/ |
Сергій |
| Метричні книги (jpg/pdf) |
Локально на VPS: /srv/projects/family-tree-mvp/data/sources/ |
Сергій |
| Стара prod-БД (Supabase) |
https://kgjhghdopikkjdotacof.supabase.co |
Сергій (заморожена, не пишемо) |
Бекап-стратегія
| Тип |
Розклад |
Куди |
Стан |
| Локальний (SQLite + media) |
щодня 04:00 UTC через family-tree-backup.timer |
/srv/projects/family-tree-mvp/data/backups/{daily,weekly}/ |
✅ live (2026-05-02) |
| Off-site (Google Drive Сергія) |
щотижня (нд) |
Google Drive Сергія, папка «Family Tree Backups» |
🔄 чекає Drive credentials (SA з шарованою папкою або OAuth з беклогу) |
Скрипт: /srv/projects/family-tree-mvp/scripts/backup_local.sh
- VACUUM INTO для consistent SQLite snapshot (без блокувань)
- tar.gz photos + sources
- Auto-prune: останні 30 daily, 12 weekly
Як додати Drive upload (наступний крок):
- Варіант 1: створити Google Cloud Service Account, поділитися папкою на Drive Сергія з SA-email, скрипт
upload_drive.py через google-api-python-client
- Варіант 2: дочекатися ручного OAuth setup (open-tasks.md у беклозі) і використати MCP Drive
Сервіс
- systemd:
family-tree-mvp.service (FastAPI + SQLite, port 8774)
- Caddy:
/family-tree-mvp/* → 127.0.0.1:8774, basic-auth family (пароль у /srv/passepartout/family-tree-mvp-password.txt)
- Логи:
/var/log/family-tree-mvp.log, /var/log/family-tree-backup.log
Резервна стратегія дисастера
- VPS падає → останній бекап (24 год) у
data/backups/daily/
- SSD VPS втрачено → останній weekly (тиждень) на Google Drive Сергія (після setup)
- Google Drive теж пропадає → старий prod Supabase-snapshot (заморожений) — як крайній fallback
Implementation
Поточний стан (v1, 2026-05-02)
- Live: https://lunar-hubble-105435845108.europe-west1.run.app/ (HTTP 200, GCP Cloud Run europe-west1)
- Code:
/srv/projects/lunar-hubble/ (Vite + React 18 + TS + Tailwind v4 + Supabase + reactflow + dagre + zustand)
- Storage: Supabase
kgjhghdopikkjdotacof (env: /srv/passepartout/supabase/lunar-hubble.env)
- Бот: tree-bot (token:
/srv/passepartout/telegram/tree-bot.token)
- Live БД: persons=91, relationships=144, stories=1, photos=1, sources=0
Critical issues v1
- 🔴 RLS =
USING (true) — anon-key з публічного коду має повний CRUD. Фактично адмін-доступ до всього родинного архіву
- 🔴 PIN-театр (1234/0000 у HTML), invite-token статичний у JS-bundle
- 🔴 anon-key захардкоджено у 9 debug-скриптах + 4 секрети закомічено в git (попередній аудит 18.04 не ротовано)
- 🔴 Google Drive фото
'type': 'anyone' — публічний інтернет
- 🟡 JSON-в-
notes замість колонок (3 місця коду парсять)
- 🟡 25+ debug-файлів у корені (Antigravity-MVP бруд)
Auth & deep-links — voice Сергія 2026-05-02
Поточний стан (v1, тимчасово)
- Одна адмінка з двома паролями (PIN 1234 / 0000) — це тестова версія, переробляти у v2 по чистовому
v2 — два окремі лінки
- Публічний лінк для всіх родичів — БЕЗ логіну, легко поширювати (наприклад через сімейні чати, QR-коди тощо)
- Адмін-лінк — логін + пароль (тільки для Сергія і батька)
🆕 Глибокі посилання (deep links) — ключова фіча
- URL на все родинне дерево (default) ✅
- URL на конкретну особу — окрема сторінка-картка з повним контекстом
- Use case: біля могилки невидимий QR-код з підписом «тут ви можете більше дізнатись про цю людину» → QR → картка особи (хто, де жив, що робив, фото, родичі) → звідти ланка на повне дерево
Це сильний engagement-механізм для родичів на похованнях / поминальних зборах. QR можна друкувати на гранітних табличках або таблицях у каплиці.
10 open questions (для Сергія, з звіту v2)
- Чи ротовано секрети з 18.04 (GitHub PAT, Gemini API key, Telegram bot token, Google SA key)?
- ✅ Auth для адмінів — voice 02.05: окремий публічний лінк (без auth) + окремий адмін-лінк (логін+пароль). Telegram Login обговорити окремо для батька (зручно, бо вже звик).
- Чи треба staging-таблиця для модерації спогадів батька (твій approval перед публікацією)?
- Чи переходимо на Next.js 15 (recommend) — чи Vite залишається?
- Один граф-бібліотека замість трьох — погоджуємось?
- Де хостимо: VPS systemd чи Vercel + Cloud Run hybrid?
- Auth для адмінів: magic link / Telegram Login / Google OAuth?
- Чи зберігаємо
f3data_dump.json як legacy export, чи відкидаємо?
- Чи додаємо spouse-relationship поля (start_date, end_date) для шлюбів-розлучень?
- Чи готовий ти потрапити з v2 на 1-week-sprint cycle (тобто щотижнева цільова поставка фічі)?
Notes & Backlog
TODO (post-OK)
- [ ] Сергій відповідає на 10 open questions
- [ ] Створити новий git-репо
family-tree-v2
- [ ] Sprint 1 kick-off
TODO міграція
- [ ] Перевірити дубль
/srv/projects/family-tree/ — кандидат на видалення (за inventory 2026-04-29)
- [ ] Видалити
f3data_dump.json 9KB / graph_dump.html 97KB / screenshot.cjs після затвердження
- [ ]
git filter-branch для видалення tree_bot/.env і credentials.json з історії
Зв'язки
- Memory: project_lunar_hubble.md (планується створити)
- Architecture report v2: lunar-hubble-v2-architecture-2026-05-02.md
- Live: https://lunar-hubble-105435845108.europe-west1.run.app/
- Audit (legacy):
/srv/research/2026-04-18/lunar-hubble-audit.md
- Legacy wiki-folder:
/srv/wiki/lunar-hubble/, /srv/wiki/family-tree/