Для начала, картинки для привлечения внимания.
Расскажите о сути проекта?
Dawarich (читать как "даварихь") — self-hosted альтернатива Google Location History. На картах Гугл есть функция Timeline, которая, если у вас включено сохранение данных о ваших перемещениях, позволяет посмотреть на карте, где и когда вы побывали. Это выглядит примерно так:
Теперь вместо Гугла я трекаю и анализирую свои перемещения на свой сервер. Да, Гугл по-прежнему очень много чего обо мне знает, но по крайней мере галочку "Сохранять историю моих перемещений" в их интерфейсе я снял. Вы теперь тоже можете.
Как появилась идея? Что вдохновило?
С тех пор, как я проникся идеей селфхостинга (то есть, около года назад), у меня было желание как-то забрать свои геоданные у Гугла и хостить их у себя, чтобы визуализировать как мне нравится, анализировать как мне нравится, и вообще делать с ними всё, что заблагорассудится. Сполгода я пользовался OwnTracks, у которого есть и мобильное приложение для непосредственно сбора данных о перемещениях, и серверное приложение, которое хранит и позволяет просматривать данные. К сожалению, это очень простой комплект софта, и визуализация данных с сервера выглядит примерно вот так:
Визуализация есть, это хорошо. Никакой аналитики нет, это плохо. Однако, мобильное приложение OwnTracks позволяет отправлять данные на произвольно указанный адрес, и у них есть неплохая документация, позволяющая скрафтить эндпоинт, который будет спокойно принимать данные от их приложения. Так что в марте 2024 я взял свой давно приготовленный для таких случаев темплейт приложения на Rails, и для начала сделал как раз эндпоинт, чтобы просто принимать на него данные о геопозиции с моего телефона.
Что вошло в прототип и сколько времени на него было потрачено?
От базово юзабельной версии приложения, которую можно было бы считать MVP, мне требовалось три вещи:
- Получение новых данных от мобильного OwnTracks
- Импорт существующих исторических данных из Google Takeout и серверного OwnTracks
- Визуализация точек на карте.
Где-то за месяц нерегулярных вечерних сессий я набросал всё, что мне было нужно и переехал с OwnTracks на Dawarich. Примерно с этого момента можно было заявлять о своей поделке миру, что я и сделал на Реддите, но об этом чуть ниже.
Что умеет проект?
Самые важные функции:
- Приём в апи эндпоинт и отрисовка новых данных с мобильного приложения OwnTracks на карте
- Импорт существующих данных из архива Google Takeout и экспорта серверного OwnTracks
Не обязательное, но очень мною любимое — статистика.
Dawarich умеет в (отключаемый) reverse-geocoding, а значит способен показать вам, в каких городах и странах вы побывали и когда вы там побывали. Может показать, сколько километров вы проделали за конкретный день, месяц и год, сколько вы проделали километров за весь период наблюдения.
Какой технологический стек вы использовали? Почему?
- Ruby on Rails для бэкенда — потому что я работаю с ним много лет
- TailwindCSS для фронтенда — потому что я не люблю фронтенд
- LeafletJS для карт — потому что он, кажется, умеет всё, что мне нужно
- Docker — потому что Portainer суть самый удобный способ вертеть приложения на своём сервере
- Redis и PostgreSQL — потому что с ними я тоже работаю много лет
Как вы запускались и искали первых пользователей?
Так вот, про Реддит. Я достаточно давно подписан на r/selfhosted, так что логичным шагом было бы опубликовать свой проект именно в этом сабе. Что я и сделал с месяц назад: https://www.reddit.com/r/selfhosted/comments/1bvoe8a/dawarich_google_location_historygoogle_maps/. К моему приятному удивлению, он сразу собрал приличное количество апвотов и комментариев, в том числе с описанием багов, которые я достаточно оперативно починил.
Это позволило по-быстрому сгладить основные неровности и починить косяки, которые я просмотрел или не предусмотрел. Пользователей в формате селфхостед-приложения, разумеется, не получается, но зато можно порадоваться звёздочкам на гитхабе: на текущий момент их около 140. Первый пост принёс чуть больше сотни, но чуть больше недели назад Dawarich упомянули ещё в одном треде, что снова дало буст и увеличило визибилити моей поделки. В целом комментарии можно свести к чему-то вроде "наконец-то есть хоть какая-то альтернатива гугл таймлайну, я ждал такое джва года" :)
С какими самыми неожиданными трудностями пришлось столкнуться?
Ну, во-первых, я не фронтендер. Этот нюансик я принял в себе уже давным-давно, и стараюсь сгладить его доступными средствами. Такими, чтобы непосредственно во фронтенд погружаться приходилось ну прям по минимуму. Из-за этого я сколько-то времени пострадал при написании визуализации геоточек (а затем и линий между ними) на карте Leaflet, но в конечном итоге всё получилось.
Во-вторых, буквально вчера я вдруг понял один важный нюанс по поводу данных, которые можно получить, запросив архив с Google Takeout.
Long story short, когда пользователь запрашивает экспорт своих данных с Гугла, ему на почту приходит ссылка на один или несколько архивов с этими самыми данными. Нас интерсуют конкретно геоданные, так что после распаковки архива я с марта шёл по маршруту: папка Takeout -> История местоположений -> Semantic Location History
, а внутри Semantic Location History уже лежит пачка папок именованных по годам, а в каждой из них в формате 2013_APRIL.json
, 2013_DECEMBER.json
и так далее лежат джейсоны с геоданными. Именно под эти файлы я писал функциональность импорта геоданных от Гугла. И лишь вчера я понял, что в Github Issues репозитория, в тикете с названием "импорт не импортируется" меня спрашивают о совсем другом файлике. Он называется Records.json
и лежит в директории Takeout -> История местоположений
. И в моём частном случае весит около 180 мегабайт, а на гитхабе говорят о файле размеро аж в 4гб. Естественно, структура файла Records.json
отличается от структуры файлов типа 2013_APRIL.json
, так что под него пришлось быстренько набросать отдельный парсер. Несложно, но ошибка немного дурацкая.
А самое любопытное, что все джейсоны за все годы из Semantic History Location
после импорта создали чуть больше 16 тысяч точек на карте, а импорт файла Records.json
создал около 620 тысяч новых точек. История перемещений стала выглядеть на карте намного детальнее, браузер стал иногда ощутимо кряхтеть при загрузке страниц (над этим предстоит поработать), а мне стало вдруг как-то страшновато от того, насколько много о моих перемещениях знает Гугл. И не только Гугл. И ничего особо с этим не сделать, такой мир, такое время.
Сколько потратили и заработали? Есть идеи как это можно монетизировать?
Кроме времени я не потратил ничего, и не очень представляю, как можно монетизировать Dawarich. Это опенсорсный бесплатный инструмент для запуска на собственном железе, что как бы достаточно чётко отрезает возможности заработка на нём. Не то, чтобы меня это расстраивало.
Какие планы на будущее?
Есть некоторое количество идей и задач в бэклоге, но они в целом формируются на основе того, как я сам пользуюсь проектом. Новые идеи можно закинуть в Github Issues проекта или мне в личку (да даже в комменты к этому посту), если будет что-то интересное, попробую запланировать.
Ближайшие планы выглядят примерно так:
- Поработать над калькуляцией статистики и более удобным/логичным её отображением
- ✅ Обзавестись фавиконом
- Подеплоить куда-нибудь демку приложения
- ✅ Написать несколько инструкций по использованию и FAQ
- ✅ Довести до ума получение данных через Overland (он, кажется, недавно порелизил OwnTracks-совместимый режим отправки данных)
- Реализовать ежемесячный и ежегодный дайджест с информацией о перемещениях, расстоянии, посещённых городах и весях за отчётный период. Как у Гугл Таймлайна, в общем, только с блекджеком и моё.
- ✅ Реализовать режим "Тумана войны"
Ещё лениво думаю над введением достижений, чтобы пользоваться Даварихом было чуть интереснее, но это по настроению.
Нужны ли какие-то советы или помощь Клуба?
В целом, любой фидбек будет полезен и интересен. И от людей, которые пришли посмотреть, и от тех, кто готов развернуть проект и попользоваться им на своём сервере. Можно даже чего-то попробовать поконтрибьютить на Гитхабе, но опыт показывает, что до этого доходит нечасто :)
Если вы знаете о софте, аналогичном OwnTracks или Overland, бросайте на него ссылку, я посмотрю, можно ли и имеет ли смысл вкрутить его поддержку.
Если вы умеете в мобильную разработку и заинтересованы в написании отдельного клента — дайте мне знать, возможно у нас тут стартап вот-вот нарисуется :)
Какой совет вы бы сами могли дать идущим по вашим стопам?
В какой-то момент у меня был готов какой-то MVP, но я по-прежнему трекал геоданные в OwnTracks. Было какое-то противоречивое состояние: вроде как хочется делать свою тулзу, а вроде я по-прежнему данные собираю в другую. В тот момент я понял, что если не начну загружать данные в Dawarich, то он так и останется MVP и я постепенно на него забью. Так что я перенастроил мобильное приложение OwnTracks, чтобы оно слало данные в Dawarich, быстренько написал импортировалку данных из OwnTracks, чтобы не грустить с пустой картой, и дело завертелось.
Вывод: догфуддинг работает, а недогфуддинг не работает.
Ещё разик линк, чтобы вверх не скроллить: https://github.com/Freika/dawarich
Пост готовился под пластинку Hamilton Mixtape. Оригинал лучше.
Короче, за пару недель, прошедших с публикации оригинального поста, я наделал несколько изменений и выводов.
Первое и важное — для меня, пожалуй, Overland на iOS заменил OwnTracks. По батарейке, в принципе, всё высаживается так же, как в Овнтрекс, но зато не нужно дёргать режимы Move/Significant руками. С нормальными настройками (приложу скриншотик) всё работает без моего участия и напоминания, знай выгружай точки вечером на сервер.
Второе — по совету друга, который делает бизнес на похожей идее, только в РФ и B2B, решил попробовать разрывать маршруты, чтобы перемещения на карте перестали походить на адскую паутину. Внизу — сравнение было/стало.
Роуты рвутся, если между точками прошло более 500 метров расстояния или 60 минут времени. Чуть позднее вынесу это в пользовательскую настройку, чтобы кастомизация и всё такое. Карта стала выглядеть намного опрятнее.
Третье — при наведении на роут теперь видно, когда и где он начался и закончился, и сколько времени было проведено в пути. Расстояние наверное тоже можно добавить. Нраица!
Четвёртое — я пощупал формат .gpx и планирую реализовать его поддержку. А потом, видимо, и другие форматы пойдут, типа geojson и что там ещё распространено. В целом, есть ощущение, что это шаг уже в несколько иную сторону, чем простое логирование перемещений, потому что тот же .gpx, например, может не иметь таймстемпов у каждой точки на карте, а это потенциальная проблема. Но я буду над этим думать. Просто помните, что у этого приложения нет цели стать бэкендом для фитнес-трекеров.
Пятое — реализовать режим открытия "тумана войны" в целом несложно, и я его сделаю. Потому что это прикольно!
И last but not least — люди. @hakim, @djhrum и ещё пара человек написали мне в телеге и мы разобрали с ними изрядную пачку интересных нюансов и багов, спасибо вам за поддержку и тестирование :)
Мои настройки для Overland (iOS) выглядят так:
Выглядит круто!
А нет ощущения или даже ишьюс уже, что OwnTracks хуже трекает местоположения, чем родной гугловый софт, который возможно получает картбланш по работе в фоне? А сторонние приложения уж как повезет и зависит от вендора
https://dontkillmyapp.com/
А на Show HN не хочешь выложить?
По монетизации могу предложить донаты, реализация фич за денежку и saas (но например с упором на прайваси)
Прикольный проект.
Не понял смысл названия правда. Я прочитал его как "Даварищ". Постсовецкое сказалось наверно...
И ссылку на гит может вставить в начале и в конце?
И правильно я понял, что это сэлф-хостед визуализация статистики? А сами данные собираются через OwnTracks? Может так и монитизировать через своё приложение?
Это надо чтоб смартфон круглосуточно писал трек в фоне или как-то более бережливо для батарейки работает? Google, я так понимаю, постоянно GPS не дергает.
О, как раз сегодня пытался понять, что делать с Location History, когда меняю гугл аккаунт!
Мне не нравится, что OwnTracks не трекает позицию после перезагрузки устройства, и у разработчика какая-то странная позиция по этому поводу (типа "не хочу запрашивать background location access в плей сторе"): https://github.com/owntracks/android/discussions/1095. Не удобно, и, как я понимаю, их способ трекинга с активным приложением требует больше батарейки, чем гугловый трекинг.
Кайфуши!
Много лет назад выключил треки гугла, но прям грустно от того, что не так просто понять где я был в 2018, и почекать реально ли я тут уже был или глючит
@Frey, спасибо за хорошее описание!
Я заметил где-то посреди комментов, ты писал, что катался с OwnTracks/Overland на велике. Подскажи, пажалста, а Strava (например) ты не пользуешься?
У меня просто давно висит идея объединения треков из нескольких источников - тренировки + поездки на авто + походы пешком (которые я не трекаю через Strava), но я не то что не фронтендер, а совсем не разработчик
Есть любительский проект для Strava - statshunters.com - он собирает все тренировки оттуда и кладёт их на одну карту (и делает это лучше, чем Strava Heatmaps по платной подписке) - вот люблю ей пользоваться, потому что тоже интересно смотреть, где был, а где нет. Но и тренировочные данные вроде ЧСС мне тоже интересны, поэтому я бы не стал запускать сразу два приложения, чтобы отслеживать геопозицию
Как ты вовремя с этой тулой:)
А случаем нет в планах добавить возможность импорта .gpx файлов вачдогом?
Юзкейс: визуализировать треки покатушек. Сделать автосинк файлов в какую-то папку, а тулой их подтягивать в общую кучу по мере добавления в папку.
Вообще нравилась эта фича в гугл, но после смены айфона почему-то гугл больше не разрешает мне ее включать: Location History is not available for this device, че только не пробовал, но anyway, попробую развернуть selfhosted :)
С одной стороны здорово, а с другой стороны самую важную для меня проблему оно всё равно не решает - проблему сбора этих самых треков.
Гугл карты как-то супер коварно собирают локейшн, условно если у тебя другой апп врубил ГПС - они будут собирать точный и часто, если не врубил - редко и по сотовым вышкам + вайфаю + блютусу, плюс с датчиков гироскопа они делают примерные предположения "а не ехал ли ты на машине случайно" и притягивают к дорогам (насчёт автоматизма этого не уверен, но в полу-ручном режиме дотянуть точно можно).
Выливается это в то, что гуглкарты не жрут батарейку и имеют ебейшую точность, и все FOSS аналоги чтобы её достичь вынуждены висеть в форграунде и врубать ГПС переодически сами, что само по себе фиаско.
Крутой проект. Собираюсь захостить и попробовать. Кстати, требования к машине не увидел. Это я плохо читал или они не описаны?
По поводу пуллреквестов -- можно написать подробный contributing.md со ссылкой из readme и пометить ишью тегами good first issue -- это сильно снизит порог входа желающим помочь.
Спасибо за классный проект, так держать! Обязательно попробую, вот только допилю лабу!
Можно настроить возможность делиться местоположением. Как это делает плугин (Android only) для OSMand https://osmand.net/docs/user/plugins/osmand-tracker. Посмотри описание, там есть ещё интересных идей. Ценность решения ещё и в том, что самоотверженные параноики с дегугленными смартфонами (а я таких много знаю) не могут делиться местоположением: например, в Телеге оно использует Google maps без варианта поменять.
Имя проекта, как тут не раз отмечали, оставляет желать потыкать в АИ за идеями :)
Поддерживаются ли типы передвижений? Гуглокарты, видимо, берут среднюю скорость и прикидывают территорию (например рельсы - поезд, гора - лыжи). Таким образом можно: помечать разные типы передвижений разным цветом, считать разную статистику по этим типам, получать гиги за шаги.
Запилил туман войны, видосик по ссылке, а то тут только скриншот можно вкрутить:
https://github.com/Freika/dawarich/releases/tag/0.8.0
А есть ли какие-то известные gps-трекеры в виде, например, часов или просто браслетика, которые очень долго не требуют подзарядки и занимаются своей маленькой задачи записи gps-трека (без постоянного подключения в интернету)?
Это то, что я подознательно хотел давно начать использовать. Развернул в докере локально, порт наружу выставлять не буду — достаточно, чтобы был доступ из домашней локальой сети (данные будут заливаться по WiFi). Сегодня — первый день использования Overland для iOS в связке с dawarich (+1 к звезде на GitHub). Спасибо за проект!
@Frey Первый вопрос по Dawarich. Увидел импорт, решил залить свои треки с Apple Watch. Выгрузил данные Apple Health Export (1159 треков на 632 Мб за два последних года). Для теста, выбрал половину 2022 года (139 треков), нажал Create Import, ничего не произошло. Выбрал один трек c пробежкой на 9 км, появилось 9,892 точек, но уже 15 минут на MacMini M1 создаются «Reverse geocoded points» (пока создалось 1,771 штука). Боюсь представить, как буду импортировать остальные 1158 треков…
Вопросы:
P.s. Связка с Overland работает безупречно.
Сбацал на коленке демо: https://demo.dawarich.app/
Email: demo@demo.com
Password: demodemo
Приму в дар GPX-файлы треков, которые вам не жалко было бы засветить на демо-сайте :)