Привет, клуб! Вы заметили, как много различных решений для учета финансов? Да все какие-то не такие... Время написать еще одно и исправить это! (Правда же?)
TL;DR: попробовать тут, гитхаб тут
Суть проекта
FinWave - это полностью open-source веб-приложение (но второе - необязательно, ниже подробно объясню) для учета финансов. Да, аналогов такого уже достаточно, от Firefly III до Cointry. Но, как я написал во вступлении, все какие-то не такие: первый, например, с интерфейсом... который лично меня пугает так, что уж проще с таблицами работать вручную. Второй - с закрытыми исходниками и платной подпиской для полного функционала.
В целом закрытый код - фу и нафиг, смотри потом финансовые рекомендации в контекстной рекламе...
Как появилась идея?
Думаю, банальней некуда: затосковал, глядя на существующие решения. Вот, взять, например, Мобса - достаточно неплохое решение с точки зрения парсинга сообщений. Но бекенда толком нет: все идет в гугл таблицу, которая содержит кучу технической информации. Неприятно. Ну и закрытый код, как я понимаю: на сайте нет ссылки на гитхаб.
Так что там с твоим... как его... FinWave?
Ну... тут у меня полный фарш, как говорится: поддержка нескольких счетов, кастомные валюты, древовидные категории, автоматизация транзакций, экспорт/импорт csv таблиц, полная синхронизация клиентов, автонакопления, поддержка нескольких языков... В общем список неплохой, и все это с приличным интерфейсом, открытым кодом и на своем сервере. Причем сервер тут может быть хоть raspberry pi, хоть самая дешевая VPSка с 0.5 гигами оперативки.
Но начнем с клиентов. Да, во множественном числе, сейчас объясню: бекенд и фронтенд у меня разделены полностью. Говоря человеческим языком, это значит, что только сайтом мы можем не ограничиваться. На данный момент, конечно, это основной клиент, который реализует весь функционал (и даже с темной темой, все как у взрослых!)
Но заходить каждый раз в браузер, открывать страницу, тыкать кнопки... бывает неудобно. Особенно с телефона, даже несмотря на то, что я весьма неплохо адаптировал его под мобильные устройства...
Что ж, для этого написан Telegram бот:
Важно понимать, что и бот, и сайт - это как бы одно целое с точки зрения данных. Дома мы сидим и вдумчиво добавляем транзакции, а на улице, например, сразу после магазина, пишем в бот "2300 продукты" - сервер общий для всего этого, данные тоже.
Стоп, а это тянет на "полную синхронизацию"? Если бы я на этом остановился, то конечно нет.
Тут вступают еще и веб-сокеты под капотом...
Давайте сразу по-человечески: допустим, мы открыли пару вкладок приложения на компьютере, одну на телефоне и подключили еще и телеграмм бота. Добавляем, например, транзакцию на телефоне, и... Магическим чудом, без перезагрузки страниц и прочего, у нас обновляется аналитика на двух вкладках, открытых на компьютере, а телеграмм бот изменяет свое прошлое сообщение с новой суммой на счету и списком последних транзакций. А мы сидим и восхищаемся. Вот это я называю полной синхронизацией!
А что дают древовидные категории?
У разных пользователей разные требования по учету: один хочет просто записывать, что в какой-то день сходил в магазин на какую-то сумму. Другой хочет детально описывать на какие вещи ушли деньги: продукты, товары для дома, и так далее.
Что с этим делать? Правильно, добавлять категории, которые наследуют родительские!
Таким образом, во-первых, во вкладке аналитики можно будет "протыкивать" куски диаграмм, чтобы перейти на уровень ниже. А во-вторых, если у нас установлен бюджет на "Питание" в условные 20 тысяч рублей, тогда при транзакции с категорией "Фастфуд" бюджет тоже будет учитываться. Весьма удобно получается.
На самом деле интересных решений еще немало, и описывать все их тут, кажется, лишним, тем более есть публичный демо-режим вместе с тг ботом (но если нужно - могу отдельную статейку написать и рассказать обо всем!), но "One More Thing" у меня таки есть...
Интеграция с искусственным интеллектом
Скажу сразу, и с грустного: в основном это OpenAI с его ChatGPT, поэтому, к сожалению, в публичной демке можете не искать, а по дефолту интеграция выключена. Есть поддержка ollama, но... оно работает плохо: та же Llama 3.1 просто пихает в контекст доступные инструменты ИИ (tools), и на выходе получается какая-то дичь. В общем-то, кажется, разработчики и не заявляли поддержки тулзов, поэтому так.
Но если у вас таки есть доступ к API, то... ИИ здесь может сделать очень много чего: посмотрит вашу аналитику, добавит/изменит/удалит транзакции, с бюджетом по категориям тоже подскажет. Короче говоря, у него есть возможность взаимодействовать с приложением почти на таком же уровне, как и у пользователя!
Кстати, если он настроен в бекенде, то и в тг боте тоже будет использоваться — в случае, если первичный парсинг провалится.
И, кстати, pdf файлы оно тоже поддерживает: работает, конечно, не всегда, и токенов жрет как не в себя. Я не так давно тестил, как оно понимает текст с картинки... итог - плохо, передаем еще и текст из pdf файла, чтобы меньше галлюцинировало.
Но выписку из сбера на 8 страниц оно, в общем, осиливает, хотя я бы рекомендовал просить у ИИ перевести в CSV (еще лучше - просить первую страницу, затем вторую, и так далее), сохранить все это дело в файлик и потом через массовый режим добавлять, заодно и отредактировать можно будет до применения транзакций.
В целом ИИ здесь - штука удобная, но если вы очень трепетно относитесь к своим данным - скорее всего это не для вас, по крайней мере на данный момент
Возможно, таки есть какая-то llm'ка с поддержкой tools как у OpenAI, но я таких не знаю и тестил только Llama. Может, знающие люди подскажут в комментариях!
О технологическом стеке
Тут тоже есть что обсудить:
Фронтенд - Nuxt 3 & Tailwind CSS & DaisyUI. Я бы назвал это "набор бекендера" - не очень люблю всю эту веб движуху, но вот конкретно эти инструменты весьма симпатичные и мне даже понравилось работать с этим стеком. Почему именно Nuxt 3 и прочее - так исторически сложилось, что начал писать нормальные сайты с их помощью : )
Бекенд - Java с... нет, не со Spring. Все-таки это пет-проект, а не энтерпрайз, так что на мой глаз попали эти сорванцы: Jooq для строго-типизированного описания SQL запросов, Flyway для миграций, для http сервера, внезапно, Spark - мне эта штука понравилась тем, что она чем-то напоминает akka http.
Почему именно Java? Опять же исторически так сложилось, что я давненько так пишу на ней и мне этот язык нравится.
Конечно, я понимаю, что оверхед в лице JVM тут совсем не нужен, но бекенд в итоге кушает относительно немного: для одного пользователя хватит и 32 мегабайта кучи. Но, конечно, выделять лучше больше : )
Совсем чуть-чуть о трудностях реализации
Веселее всего было с написанием страницы аналитики во фронтенде. Я использовал ApexCharts для рендера графиков, но все равно анал-карнавал получился, и код там... отвратительный, прямо скажем. Думается мне, когда-то это нужно будет рефакторить как минимум
В целом, на сколько я знаю, нормальных библиотек до сих пор нет для графиков - все в чем-то проседают. Буду рад совету по этому поводу!
Есть идеи как это можно монетизировать?
Идеи - есть, конкретного плана - нет.
Можно попробовать платно раскатывать инстансы людям, которые совсем далеки от IT. Но тут есть подводные камни: я бы не хотел, чтобы все они работали на арендованных дедиках в моем владении, данные в бд не шифруются и не представляется возможным (всякие аналитики на стороне бекенда считают по-месячно/по годам транзакции, клиентам по типу смартфонов будет тяжеловато такое делать).
Но в целом - пока не сильно задумывался, если есть люди, которые могут помочь - буду рад пообщаться в лс!
Какие планы на будущее?
В ближайших планах - допиливание и полировка. Наверняка найдется несколько ошибок/неудобств. Так же слегка поработать над интеграцией ИИ: надо бы сделать поддержку OCR для изображений, чтобы сканировать чеки, например. Хотя просто изображение оно умеет видеть
Чуть дальше - нативное приложение на андроид. И нет, оно не будет дублировать функционал сайта. Зачем тогда? Объясняю: до этого момента я не упоминал про интеграцию с банками - да, её нет, и нормальных способов я не вижу здесь. Зато есть полу-костыльный: пусть нативное приложение считывает пуш-уведомления, и если оно подходит под какой-нибудь фильтр, определенный пользователем, тогда передавать текст в ИИ - пусть оно само разбирается в какую категорию заносить.
Архитектурно проблем с этим не должно возникнуть, тем более, под Java враппер API уже написан!
В отдаленных - запилить режим... инвестора? Специфичная штука, но лично мне бы пригодилось тречить движение активов и всякий подсчет доходности самостоятельно. Хотя как это должно выглядеть с точки зрения UI/UX - тот еще вопрос
Нужны ли какие-то советы или помощь Клуба?
Да! Я был бы очень благодарен за звездочки на проектах (Backend, Frontend), issues, пул-реквесты, советы, в общем любую активность!
Кстати, выражаю благодарность Юлии Сапсане, Дмитрию Скрыльникову и Анатолию Власову за советы и взгляд со стороны : 3
Имхо все подобные платформы страдают одним единственным недостатком - отсутствием интеграции с банками или/и при наличии этих интеграции отсутствие понятного способа обновления токенов на стороне банков. Особенно такая проблема актуальна когда у тебя сотни транзакций за день и каждый раз добавлять их и тратить на это время бывает просто некогда. В РФ пользовался койнкипером, после переезда банковским приложением которое само все бьёт по категориям, но все равно не до конца понятен финансовый флоу. Если захотите делать интеграции в будущем, то можете глянуть в сторону plaid (https://plaid.com/) или MX (https://github.com/mxenabled) Но там тоже все далеко от идеала - авторизации слетают, да и стоит денег.
В наксте кстати из коробки поддерживается typescript и миддлвары можно сделать глобальные, чтобы не прописывать их каждой странице отдельно. В nuxt.config не обязательно прописывать process.env.NUXT_PUBLIC_ENV_VAR и просто опередить его в окружении или положить в енв в корне: https://nuxt.com/docs/guide/going-further/runtime-config#exposing
Дашборд круто смотрится!
В целом, на сколько я знаю, нормальных библиотек до сих пор нет для графиков - все в чем-то проседают. Буду рад совету по этому поводу!
Вот это знакомо. Я с миниаппе Cointry тоже помучился с ApexCharts. В итоге, во второй версии перешел на православный ChartJS. Нет ничего лучше старого надежного друга)
Пробовал пользоваться приложениями в которые нужно было ручками заносить транзакции и каждый раз забрасывал через несколько недель/месяцев. Потому что рутина, а рутина - это лишняя головная боль каждый день.
Лет 5 назад установил приложение Finanzguru и с тех пор пользуюсь им на регулярной основе.
Из плюсов:
Из минусов:
В общем для меня оказался простой и удобный способ увидеть все свои средства и траты в одном месте. Если бы узнал про такое для российских банков пока я жил в России, то тоже обязательно бы попробовал ибо удобно.