С 2022 по 2025 год работал над FamilyCounts (familycounts.online) — сервисом учёта семейных расходов: бэкенд, веб-интерфейс, devops.
О проекте
FamilyCounts — приложение для учёта семейных расходов в формате чата: каждый член семьи записывает свои траты и помечает их тегами, владелец аккаунта задаёт бюджеты, и при превышении вся семья получает уведомление. Есть быстрая сводка расходов и выгрузка в Excel за любой период. Приложения для iOS и Android; работает с 2016 года, активных пользователей — примерно 2 000.
Моя задача была развивать продукт и параллельно разгребать накопившийся техдолг: тесты, пуши, производительность базы, отсутствие веб-версии.
Моя роль
Разработка бэкенда и веба была на мне. Изменения бэкенда и API обсуждал с разработчиками мобильных приложений (iOS и Android), работал в паре с QA-тестировщиком. Каждую неделю созванивались всей командой: заказчик, разработчики мобильных приложений, тестировщик и я.
Что я сделал
- Веб-интерфейс — веб-версии не было. Сделал с нуля на React и Vite: лента расходов с бесконечной прокруткой, фильтры по тегам и периодам, управление тегами, вложения, экспорт в Excel. Админка: поиск по пользователям, серверная пагинация, email-рассылка, удаление аккаунтов.
- Тесты — не запускались несколько лет. Починил (около 60 коммитов); по ходу нашлись реальные баги в продакшене: из цепочки условий в запросе применялось только последнее, часть колбэков всегда возвращала ошибку, пакетные вставки не работали. После этого новые фичи выходили уже с тестами.
- ORM и производительность — у Waterline, штатной ORM в Sails.js, проблемы с производительностью заложены в архитектуре, а сам фреймворк заброшен. Предложил заказчику перейти на Knex.js: переписал тяжёлые запросы, добавил миграции базы и индексы.
- Пуш-уведомления — периодически переставали работать. Обновил сертификаты APNs, перевёл android-пуши с устаревшего FCM API на FCM HTTP v1.
- Вход через Apple — сделал бэкенд-часть Sign in with Apple: проверка токенов, регистрация и привязка аккаунтов.
- Тарифные планы — подписки с лимитами: пакеты, ограничения на записи, участников группы и вложения, проверка статуса подписки, аудит действий, письма про оплату. Покупки в мобильных приложениях шли через RevenueCat — делал бэкенд-часть и API; когда я уходил, интеграция была ещё в тестировании.
- Стек — обновил Node.js до актуальной версии, подключил Sentry к логгеру приложения.
- DevOps — релизы, деплой и бэкапы продакшн-сервера; поднял и поддерживал QA-сервер, которым пользовались как staging-окружением. Linux, Docker, docker-compose, ssh, cron.
Результаты
- Появилась веб-версия: сервисом теперь можно пользоваться и с компьютера, не только с телефона.
- Сервис получил основу для монетизации: тарифные планы с лимитами и обработку покупок.
- Сервис стал стабильнее и быстрее: переписанные запросы и индексы убрали многолетние тормоза базы.
- Кодовая база снова в поддерживаемом состоянии — с рабочими тестами, миграциями БД и мониторингом ошибок в Sentry.
Стек
Node.js · Sails.js · MySQL · Knex.js · RabbitMQ · React · Vite · Bootstrap · Mocha · Sentry · FCM / APNs · Google Cloud Storage · Docker · Linux



