Несколько лет назад мне захотелось заняться составлением своего генеалогического древа. Я опробовал различные существующие инструменты для этого и не могу сказать, что остался в большом восторге. Во-первых, у подавляющего числа из них интерфейс, мягко говоря, оставлял желать лучшего, а во-вторых, большинство из них подразумевало хранение информации о всех своих близких где-то на серверах этих сервисов (причём ряд из них сейчас вовсе недоступен напрямую из России, что удобства не добавляет).

Разумеется, как у любого уважающего себя разработчика, у меня зачесались руки написать собственное решение. Благо в целом задача не выглядела сверхмасштабной, ведь хранилище семейной истории — это по сути небольшая БД с 6-8 типами сущностей и визуализатором связей между ними. Но, как это нередко бывает, идея застряла на стадии раннего прототипа, и только сейчас, благодаря помощи LLM её удалось довести до относительно законченного вида.

Ниже расскажу, что получилось и чем же именно мой сервис — я назвал его Arca — существенно отличается от других подобных решений. Кроме особенностей хранения проектов также затрону несколько других любопытных нюансов — выбранный мной подход к локализуемому представлению имён, а также исторических названий городов и регионов.

Отдельный повод для гордости — то, каким аккуратным получился внешний вид деревьев. Это то, что было спроектировано на самом раннем этапе, ещё вручную
Отдельный повод для гордости — то, каким аккуратным получился внешний вид деревьев. Это то, что было спроектировано на самом раннем этапе, ещё вручную

Так что там с хранением

Как я уже упомянул, многие генеалогические сервисы, не сильно напрягаясь, хранят информацию о людях у себя в онлайн-базах. Альтернатива для тех, кого беспокоит приватность и сохранность данных, — десктопные приложения и хранение «деревьев» локально, у себя на жёстком диске. Это тоже не идеально: так мы теряем удобство синхронизации и совместной работы над одним проектом. Что же делать, если хочется и сохранить удобство «облачного» хранения, и обеспечить надлежащую защиту личной информации?

Решение, на мой взгляд, очевидное и достаточно простое — хранить проекты в облаке, но только зашифрованными личным ключом пользователя (который никогда не становится известен серверу). Подобным подходом пользуются, к примеру, такие инструменты, как менеджеры паролей. Однако именно среди генеалогического софта я не встречал подобных реализаций.

Общая архитектура Arca. Подобные диаграммы-иллюстрации — единственное в данной статье, с генерацией чего мне помог Claude. Текст самой статьи написан без использования нейросетей.
Общая архитектура Arca. Подобные диаграммы-иллюстрации — единственное в данной статье, с генерацией чего мне помог Claude. Текст самой статьи написан без использования нейросетей.

Как это устроено на практике? В Arca пользователь может создать локальный проект (даже без авторизации) — и он будет существовать только в его браузере. А может выбрать облачное хранение — тогда будет создан секретный ключ пользователя, а также отдельные ключи на каждый облачный проект, которым они будут шифроваться перед загрузкой на сервер. Если захотелось авторизоваться на новом устройстве — создаем end-to-end зашифрованный канал со старым устройством (если оно под рукой), и передаем ключ так, либо вручную вводим код восстановления (который позволяет расшифровать мастер-ключ). В любом случае сервер ключи пользователя не видит.

Вход на новом устройстве требует не только обычной авторизации (через Google, Telegram или Github), но и переноса мастер-ключа с ранее авторизованного устройства.
Вход на новом устройстве требует не только обычной авторизации (через Google, Telegram или Github), но и переноса мастер-ключа с ранее авторизованного устройства.

При этом возможность выложить часть своего дерева в публичный доступ тоже остаётся — например, информацию о давно умерших людях. Но это, разумеется, опционально. Если же нужно редактировать один проект с другими членами семьи — достаточно добавить их в участники проекта (т.е. поделиться ключом проекта). При удалении доступа ключ проекта ротируется, и последующие версии прежним участникам становятся не видны. А ещё, кстати, можно связать два проекта друг с другом (т.е. одна семья редактирует своё дерево, другая — другое, и они могут ссылаться на персон из обоих деревьев). Такого функционала я тоже нигде больше не видел.

Три вида внешних связей между проектами (деревьями): через персону в чьём-то чужом публичном дереве; путём связывания нескольких ваших проектов; через поиск в глобальной базе
Три вида внешних связей между проектами (деревьями): через персону в чьём-то чужом публичном дереве; путём связывания нескольких ваших проектов; через поиск в глобальной базе

Несколько слов про визуализацию

Кроме уникального подхода к хранению данных, мне хотелось добиться эстетичного внешнего вида самого дерева. Здесь я, например, обратил внимание, что в подобных деревьях нередко карточки отображаются горизонтально — слева фото, справа имя и годы жизни. А сами фото, куда ни ткни, либо круглые, либо квадратные.

Малая часть древа королевы Виктории. В высоту — всего 20 поколений; в ширину — сотни, если не тысячи персон
Малая часть древа королевы Виктории. В высоту — всего 20 поколений; в ширину — сотни, если не тысячи персон

В то же время, если посмотреть на то, как «растут» реальные родовые деревья, видно, что места-то им нужно больше вширь, нежели ввысь. Именно поэтому свои карточки я сразу рисовал вытянутыми вертикально (да и фото у меня, «как в паспорте» — тоже портретные). Сверху имя, посередине фото, внизу годы жизни — ничего лишнего.

Ещё один пример древа. Браки показаны фигурными скобками под супругами, а не линиями между ними, как в других программах — я считаю, так выглядит лучше; особенно когда кто-то вступал в брак несколько раз за жизнь. В нижнем левом углу — миникарта, справа — карточка выбранной персоны.
Ещё один пример древа. Браки показаны фигурными скобками под супругами, а не линиями между ними, как в других программах — я считаю, так выглядит лучше; особенно когда кто-то вступал в брак несколько раз за жизнь. В нижнем левом углу — миникарта, справа — карточка выбранной персоны.

Построенные деревья можно как экспортировать в различные форматы (PNG, SVG, PDF, HTML), так и напечатать.

Раскладываем имена по полочкам

Ещё одна интересная задача, которую мне хотелось решить грамотно, — как одновременно предоставить возможность вводить разнообразную информацию о персонах и не перегрузить интерфейс миллионом полей.

Особенно этот вопрос был актуален для имён, которые в разных культурах и исторических периодах состояли из разного набора частей, и мне уж очень хотелось как-то покрыть это разнообразие (даже если это никому не понадобится), да ещё и адекватно реализовать их отображение на разных языках.

Оверинжиниринг? Да, возможно. Но внутреннему перфекционисту во мне это нравится больше, чем когда иностранное поле «middle name» в русском интерфейсе отчего-то вдруг становится «отчеством».
Оверинжиниринг? Да, возможно. Но внутреннему перфекционисту во мне это нравится больше, чем когда иностранное поле «middle name» в русском интерфейсе отчего-то вдруг становится «отчеством».

Решением стало хранить имена как произвольные последовательности компонентов — например, для русского это обычно «фамилия, имя, отчество», в ряде стран у людей могут присутствовать вторые имена (или даже вторые фамилии), но в интерфейсе можно создать любую цепочку компонентов и указать, чем каждый является. А чтобы при переключении интерфейса на другой язык имена тоже переключались правильно, для каждого компонента можно вручную задать его перевод.

Слева — простой интерфейс для самых распространённых случаев; справа — тот же UI, но в развернутом виде: добавлена «полная форма», а также скорректирована транслитерация имени на английский. Также присутствует возможность добавлять дополнительные имена: прозвища, церковные, в браке — в том числе с указанием даты, с которой человек стал известен под этим именем.
Слева — простой интерфейс для самых распространённых случаев; справа — тот же UI, но в развернутом виде: добавлена «полная форма», а также скорректирована транслитерация имени на английский. Также присутствует возможность добавлять дополнительные имена: прозвища, церковные, в браке — в том числе с указанием даты, с которой человек стал известен под этим именем.

Другие мелочи

На этом мои личные хотелки не закончились. Например, далеко не в каждой генеалогической софтине удобно загружать семейные фотографии и отмечать на них людей. Я же решил, что это будет классно автоматизировать — по нажатию на «Отметить человека» прямо в браузере запускается небольшая модель через библиотечку face-api, которая довольно точно сама находит лица на фото. Приятный бонус: в дереве лица людей получаются расположенными чётко по центру, ровнее, чем если размечать вручную.

КПЗ «семейное фото»
КПЗ «семейное фото»

Или вот, скажем, города. Казалось бы, возьми любую стандартную базу городов и всего делов. Но если стоит задача работать с историческими данными, этого недостаточно. Поэтому из Wikidata подгружаются не только текущие названия мест, но и то, как они назывались раньше — а также то, каким территориям раньше принадлежали. Поэтому не удивляйтесь, если, указывая Петербург в качестве места рождения бабушек и дедушек, вы в результате увидите «Петроград» с красным флажком РСФСР.

В зависимости от того, какая дата указана у события, название одного и того же места (а также его административное подчинение) может отображаться по-разному.
В зависимости от того, какая дата указана у события, название одного и того же места (а также его административное подчинение) может отображаться по-разному.

Ещё добавленные к событиям и фото места можно увидеть на карте — а заодно увидеть, как члены вашей семьи переселялись в течение жизни.

Нарисовать кластеры событий и фотографий на карте — дело нехитрое. Но мне дополнительно захотелось наглядно показать жизненные пути различных людей из открытого проекта.
Нарисовать кластеры событий и фотографий на карте — дело нехитрое. Но мне дополнительно захотелось наглядно показать жизненные пути различных людей из открытого проекта.

Это не всё, что умеет Arca: я добавил и поддержку произвольных меток, источников информации и их хранилищ, и удобный календарь событий (где легко увидеть ближайшие юбилеи), и проверку проекта на ошибки, и даже трекер задач (что вероятно будет полезно тем, кто серьёзно занимается генеалогией). А ещё, кстати, все изменения проекта логируются в истории проекта — с возможностью откатывать ошибочные изменения или добавлять пояснения, почему было внесено то или иное исправление.

Что дальше?

Сейчас Arca существует в виде веб-сервиса (в т.ч. адаптированного под просмотр с мобильных устройств), десктопного клиента для Windows и macOS, а также мини-приложения в Telegram. Возможно, соберу билд и для Linux.

В плане же функциональности мне кажется, что сервис близок к feature-complete продукту. В нём уже есть больше, чем я собирался добавить изначально. Пока что у меня есть идея лишь одного направления, куда можно было бы развиваться дальше — поскольку уже реализована возможность связывания нескольких независимых проектов воедино, то несложно представить поддержку self-hosted инстансов Arca, федерирующихся между собой. Это, с одной стороны, звучит слишком безумно для нишевого генеалогического приложения, а с другой — достаточно безумно, чтобы это действительно заслуживало реализации :)

Комментарии (1)


  1. predpremi
    07.11.2026 17:10

    Прекрасно понимаю это жгучее желание написать свой софт, когда существующие решения не устраивают ни по интерфейсу, ни по подходу к хранению данных. Я сам много раз так начинал проекты, когда хотелось сделать «как надо». Вопрос приватности генеалогических данных, которые уходят на чужие серверы, действительно критичен - это боль многих пользователей. Применение LLM для ускорения разработки прототипа до рабочего состояния - это отличный пример того, как AI меняет подходы, я тоже активно использую их в своих проектах.