Dmitry 3727419506 feat(api): аналитика инвестиций, события и карточка инструмента
/analytics/{scopes,summary,value-series,holdings,returns,allocation}, /events с
фильтрами и /instruments/{id}. На запрос ничего не считается — это чтение metric_*,
благодаря чему экраны читаются быстро и показывают одно и то же число.

scope (all | account:<id> | portfolio:<id>) резолвится через ту же функцию, что его
построила, valuation.account_scopes: scope, для которого метрик нет, отдаёт 404, а не
пустой график, который читался бы как пустой портфель.

asset_class уходит наружу строкой, а не енумом. Одно из его значений — index, а
Dart-енум не может назвать член index: он конфликтует с Enum.index, и сгенерированный
клиент перестаёт компилироваться. flutter analyze это пропускает, flutter test ловит.

Фильтр /events?external_flow=false сравнивает meta через is_not_distinct_from, а не
через равенство: у события без meta сравнение даёт NULL, NOT NULL это тоже NULL, и
равенство выбрасывало бы такие события из ОБЕИХ половин фильтра.
2026-09-18 14:20:50 +03:00

fin-tracker

Личная аналитика финансов и инвестиций: ZenMoney (повседневные деньги) + брокеры (T-Invest API, отчёты Сбера и ВТБ) в одной базе, с XIRR/TWR, календарём дивидендов и купонов, аллокацией и net worth. Замена Snowball Income.

  • backend/ — Python 3.12, FastAPI, PostgreSQL, worker с расписанием синков.
  • app/ — Flutter-клиент (web, Linux, Windows, Android) поверх REST/OpenAPI.
  • deploy/ — Caddy и сертификаты; docker-compose.yml — прод на VPS.

Для агентов: AGENTS.md. Команды: just --list.

S
Description
No description provided
Readme
2.1 MiB
Languages
Python 46.4%
Dart 40.9%
JavaScript 11%
C++ 0.7%
CMake 0.6%
Other 0.2%