buhgalter
Тип проекта: личный проект
Бухгалтер: Self-hosted личная бухгалтерия
Релиз: v1.5.3 (14.09.2026)
[v1.5.3] — 2026-09-14
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/. Новых миграций БД нет.
Android
Исправлено
- OEM-клон (Xiaomi Dual Apps / «клонировать приложение») больше не поднимает WebView: нативный экран «не поддерживается», основная копия не зависает на чёрном экране
- После удаления приложения сессия и кеш не возвращаются из бэкапа ОС (
allowBackup=false, исключение cloud/device-transfer, маркер вno_backup) - Холодный старт на HyperOS: системный сплэш сразу отпускается (в т.ч. night, не #000); WebView непрозрачный и не уходит в background; HTML без блокирующих Google Fonts (~30 с чёрного после сброса WebView); Keystore виджетов не на UI-потоке; тема Capacitor без
@nullфона
Server
Исправлено
- Автопополнение: перевод позже триггерной операции (
transaction_date+1 с, если не в будущем;created_atпосле триггера). В лентеdate_desc(новые сверху) автопополнение выше расхода
Техническое
- OpenAPI
1.5.3(версия спецификации; новых эндпоинтов нет) - docs/release-notes-v1.5.3.md
- Версия
1.5.3
Коммиты
Changelog
- e42cd413a412018fa99944bbb04ef24ae37c6afc документация
- 9af50cebfe1aca36801dd3eeeeab69212520fff4 БАГ. Автопополнение в
date_descоказывалось ниже триггера (выглядело старше операции); должно быть позже триггера и выше в ленте - 08829673f10440f30f53538adc89333808b362af Баги с клонированием приложения и чёрным экраном при старте
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.3. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.3
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.5.3
Android
Вложения buhgalter-android-1.5.3.apk (universal) и buhgalter-android-1.5.3-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.5.2 (08.09.2026)
[v1.5.2] — 2026-09-08
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/. Новые миграции:052.
Android
Добавлено
Лента изменений операций
- При sync Android запрашивает
GET /sync/transaction-changesи патчит кеш списков по id: добавление, правка и удаление доходов и расходов (в т.ч. долги и кредиты), включая старые операции, которые полный прогрев страницы 1 не перечитывает - Документация: android-client-platform.md, ui-api-cache.md
Исправлено
- После правки операции на web (разбиение) на главной оставалась одна операция, пока несколько sync/перезапусков — список всех операций и счёта уже показывали две
- После оплаты кредита в списке оставался только один (синхронизация не чинила, помогал перелогин) —
onCreditUpdatedбольше не засевает одноэлементный список; ручной sync обходит SWR-кеш - Офлайн нельзя открыть должника (и другие карточки разделов) — снимки GET больше не стираются после write; прогрев тянет списки и карточки;
getDebtorсобирает деталь из локальных долгов
Web
Исправлено
- Календарь в подписках (и везде с выбранной датой) не перелистывал месяцы:
$effectвDateTimePickerсбрасывалviewMonthпри навигации
Server
Добавлено
GET /sync/transaction-changes— курсорная лента create/update/delete поtransactions(таблицаuser_change_events, миграция052)
Техническое
- CI/act: тесты SQLite — шаблон мигрированной БД +
synchronous=OFF;go test -timeout 30m - OpenAPI
1.5.2(GET /sync/transaction-changes) - docs/release-notes-v1.5.2.md
- Версия
1.5.2
Коммиты
Changelog
- 4edba521b418aa523794623872e3db5d3cdc9cdd документация
- af7e864b2f82d4d978ec209e329b5e8902d0f382 Доработка синхронизации
- d31e53b48db814b99165388cf93476aacd4a1ea1 Исправления в разделе "Долги" при оффлайн-работе
- b1cfff0a86dfd3deae022c76873bc8356737b98c Баг в кредитах после оплаты
- 5bf91b525d6472be686da37a07a3c38258b3d243 - БАГ. Android: после правки операции на web (разбиение) на главной оставалась одна операция, пока несколько sync/перезапусков — список всех операций и счёта уже показывали две - CI/act: тесты SQLite — шаблон мигрированной БД +
synchronous=OFF;go test -timeout 30m(иначе act упирался в 10m на goose/fsync) - 4b678394f4a28a694cc02a2abe7d372309f18048 БАГ. Web: календарь в подписках (и везде с выбранной датой) — не перелистывал месяцы:
$effectвDateTimePickerсбрасывалviewMonthпри навигации - 39ea9cf23944869010ba7cef6731080250f57b9c версия 1.5.2
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.2. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.2
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.5.2
Android
Вложения buhgalter-android-1.5.2.apk (universal) и buhgalter-android-1.5.2-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.5.1 (03.09.2026)
[v1.5.1] — 2026-09-03
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/. Новых миграций БД нет.
Android
Добавлено
SMS-перехват покупок банка
- Тот же пайплайн черновиков, что у push: opt-in
RECEIVE_SMS, отправители из каталога (smsSenders), каналsms; сырые SMS только на устройстве; дедуп с push в окне 2 ч - Настройки: Настройки → Банковские уведомления — блок разрешения SMS
- Документация: roadmap/notification-intercept.md, android-client-platform.md
Виджеты
- Опция «Показывать виджеты при блокировке» в Настройки → Безопасность (по умолчанию выкл.)
- «Скоро»: кредит, долг, плановые, подписки, периодические — до 5 ближайших
Изменено
- Привязка банк→счёт — many-to-one: один банк можно выбрать у нескольких счетов; без last4 расход идёт на первый привязанный счёт банка
- Суммы в виджетах скрыты только пока нужен экран PIN; после разблокировки снова видны
- Виджет «Мои средства»: три строки — наличные, банковские карты, кредитные средства; тап →
/accounts - Форматирование сумм во всех виджетах как в UI (
1 500.00 ₽) - Шаблоны операций — отдельная страница
/transaction-templates(как подписки), не вкладка настроек
Исправлено
- Клонирование приложения (OEM dual-app): отдельные ключи Secure Storage и сессии — клон не сбрасывает вход основного приложения
- Тормоза UI: виджеты не зацикливают WorkManager
- Офлайн: категории и счета не ломаются после записи; списки
/accountsсохраняются; пустые — seed изui/meta - После онлайн-write форма операции снова со счётом и категорией
- Подкатегории: после создания в кеше сразу имя, не UUID; повторное добавление не ругается «имя занято»
- SMS банка через системное «Сообщения» (заголовок вроде «Ваш Т-Банк») попадают в черновики
- Перевод: «Вся сумма» активна после смены исходящего счёта
- Экран выбора счёта для виджета «Счёт»: тема DayNight и отступ под status bar
- Единый источник балансов:
GET /dashboardобогащаетlistAccounts/getAccount
Web
Изменено
- Шаблоны операций вынесены из настроек на
/transaction-templates; старый URL — редирект308 - В меню «Прочее» — пункт «Шаблоны операций»
Исправлено
- Справочники (категории и др.): после записи список обновляется сразу, не ждёт фоновой revalidate
Server
Исправлено
- Плановый остаток (
forecast_balance): еженедельные подписки — учёт всех списаний текущего месяца после очередиupcoming_run_ats, а не только ближайшей даты
Техническое
- OpenAPI
1.5.1(версия спецификации; новых эндпоинтов нет) - Строки UI: SMS-перехват, виджеты при блокировке (
server/ui_locales) - docs/release-notes-v1.5.1.md
- Версия
1.5.1
Коммиты
Changelog
- a13531fe8344d0cf5682224de2f3b6ebfd4fc90a исправление еженедельных подписок
- de185d2bd781d022ab9686f95c2015ac5d4ef2f3 docs
- 81fb47b5d97c862c1c2aba30a51208404747bef1 README
- 6fd619536775c0902b9de4472e0a42f8b0141348 Merge branch 'master' of github.com:kai-zer-ru/buhgalter
- 60f042423d7e7330fe9dcc30617268931b5f0e53 тонкие правки оффлайн-режима, тесты
- 586d9c9995ee2d5971f1a9d8c1f88de327a60c2a UI левого меню
- c663f14e8df9aa7b7024e1ed281b77ec7d2f3978 починил сломанные офлайн категории и счета
- 644cf8c2e3bbc96472190dff7761b55c1782598e Android: SMS-перехват покупок банка
- 78847614b6a9e42d2117ba83df2309a4e47223e8 Android виджеты
- 4461ba1bf5befd409810739f3b79e5bdcafc2cac БАГ. Перехват уведомлений: привязка банк→счёт — один банк нельзя выбрать у нескольких счетов (сбрасывает предыдущий). Нужно many-to-one: несколько счетов одного банка (напр. 3 в Т-Банке, 2 в Сбере)
- 98da384b2da41a25ed901dd21efff26113550645 Исправление работы при клонировании Android-приложения;
- fe18e06e256e8b43b7ab156cafe83f0c671cb67b Update README.md
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.1
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.5.1
Android
Вложения buhgalter-android-1.5.1.apk (universal) и buhgalter-android-1.5.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.5.0 (26.08.2026)
[v1.5.0] — 2026-08-26
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/. Новые миграции:043–051.
Добавлено
Подписки (web + Android)
- Отдельная сущность и экран поверх периодических: сводка «в месяц» / «в год», ближайшие списания, системная категория «Подписки», поиск и привязка операций, «Сделать подпиской» из журнала
- Редактируемая очередь из трёх ближайших дат списания (
upcoming_run_ats); после списания очередь сдвигается,next_run_at= новая первая дата;POST /subscriptions/preview-upcoming; в форме — правка дат и сброс по периоду - Уведомления
subscription_charge/subscription_days_before - Плановый остаток (
forecast_balance) учитывает активные подписки и периодические операции текущего месяца (TZ пользователя); подпись в UI различает плановые / подписки / оба (has_planned_this_month,has_subscriptions_this_month) - Документация: subscriptions.md
Магазины и теги (web + Android)
- Справочник магазинов (
merchants) и тегов (tags); на форме операции — выбор / создание по имени; фильтры спискаmerchant_id,tag_id - Описание операции по-прежнему в
description(отдельное поле комментария не вводилось) - Feature flag
merchants_tags
Шаблоны операций (web + Android)
- Именованные пресеты расхода / дохода / перевода; CRUD в настройках; «Сохранить как шаблон» из журнала; блок на главной (спойлер) и применение с экрана настроек
- Feature flag
transaction_templates - Документация: roadmap/transaction-templates.md
Перехват уведомлений банка (только Android)
- Opt-in:
NotificationListenerService→ локальные черновики расхода или дохода (покупки / входящие); OTP и баланс — игнор; отмена покупки снимает черновик - Маппинг last4→счёт и банк→счёт; магазин из справочника или предложение имени; категория/подкатегория по истории merchant при открытии черновика
- Настройки
/settings/bank-notifications; очередь черновиков; rebind / автозапуск на MIUI - Документация: roadmap/notification-intercept.md, android-client-platform.md
Модули в админке (feature toggles)
GET/PUT /api/v1/admin/features,GET /api/v1/features; страница Админка → Модули (только web)- Выключенный модуль скрыт в nav (web + Android), API →
404 FEATURE_DISABLED - Документация: feature-toggles.md
Изменено
Регистрация (breaking для admin API)
- Поле
registration_enabledубрано изGET/PUT /admin/settings; управление — флагregistrationв/admin/features - Публично по-прежнему
registration_enabledвGET /setup/status; значение переносится миграцией050_feature_flags.sql
Форма операции / главная
- Спойлер «Время, комментарий, магазин, теги»; единый Combobox для подкатегории и магазина с созданием по имени
- На главной шаблоны и бюджет — в сворачиваемых секциях
Техническое
- Миграции
043–051: subscriptions (+upcoming_run_ats), merchants/tags, transaction_templates, feature_flags - OpenAPI
1.5.0: subscriptions (preview-upcoming,upcoming_run_ats), merchants, tags, templates, features, уточненияforecast_balance - Unit/e2e: подписки (в т.ч. очередь дат), магазины/теги, шаблоны, feature toggles, Android notification intercept
- Документация: subscriptions.md, feature-toggles.md, transactions-display.md, ui-budget.md, android-client-*.md, README.md
- docs/release-notes-v1.5.0.md
- Версия
1.5.0
Коммиты
Changelog
- 00bb31ef56c7516ecab1c997721ed4fe640ff142 Доработка подписок (даты)
- 4e050ac5f03a86561eb01b143be4c8a488318a2b Шаблоны операций, UI, мелкие фиксы
- d5eda095f3c5f2ff2a128d3803b78c90fed872f8 Включение/отключение функционала в админке
- 8eb42fc899bb0befa5a3c29a9f7281d79ee92223 Перехват уведомлений банка (доходы)
- 0aa4ef4fab96660ebcbba0a070d3a8040b36c761 Шаблоны операций
- 3be88423aa1b50289442785b61f7a23e68b88f7d Учёт подписок и периодических операций текущего месяца в плановом остатке
- b045666034e88501541fe48c29322ee31a1d86e9 Перехват уведомлений банка
- 3df1cc35a6db07c6d291baee1dab330d7180315b Магазины, теги. UI-правки формы добавления операций
- 7f2f482b96a9e9cc824c32e5816fa7e933e82158 UI-правки подписок
- 83a16b000374b9b7dde76dbf55d21c10964e7b53 документация
- aa507a203fd68c2e1188d10e51048e07575d6289 Правки меню
- d1c88f829163221761d7cc8726d2e8eacedfddcc Подписки
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.0. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.5.0
Android
Вложения buhgalter-android-1.5.0.apk (universal) и buhgalter-android-1.5.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.4.1 (03.08.2026)
[v1.4.1] — 2026-08-03
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Кредитные карты
- Отдельное действие «Изменить лимит» (меню «⋯» и страница карты):
PUT /api/v1/accounts/{id}/credit-limit. В форме редактирования счёта лимит только для просмотра (ERR_ACCOUNT_CREDIT_LIMIT_IMMUTABLE). Увеличение — дельта кcredit_limitиinitial_balance; уменьшение — только при полном погашении (ui-credit-cards.md)
Категории
- Редактирование подкатегорий (имя и иконка) в Настройках → Категории —
SubcategoryFormDialog,PUT /subcategories/{id}(categories-and-icons.md) - Недостающие иконки категорий в каталоге (в т.ч. транспорт, продукты, услуги, досуг)
Ввод суммы (web + Android)
- В полях суммы можно вводить выражения со сложением/вычитанием (
7899+500,100+200-50); при blur / сохранении подставляется результат (transactions-display.md) - Android: своя цифровая клавиатура
MoneyKeypadс+/−(системная decimal часто без «+»); раскладка1 2 3 +/4 5 6 −/7 8 9 ⌫/. 0 ✓(android-client-ui.md)
Android
- Офлайн outbox: settle долга, CRUD периодических операций, мелочи по кредитам (pay / complete / update / schedule / delete payment / delete; без create); кеш карточки кредита
GET /credits/{id}(android-client-platform.md) - Кнопка биометрии на экране PIN — в нижнем левом углу клавиатуры (иконка отпечатка)
Изменено
Автопополнение
- Перевод автопополнения создаётся с датой/временем триггерной операции, а не «сейчас» (если дата неизвестна — текущий момент) (balance-maintenance.md)
Комиссия
- Любая комиссия (перевод и списание с кредитной карты) привязана к операции: отдельно удалить/отредактировать нельзя (
ERR_COMMISSION_LINKED); менять комиссию перевода — черезPUT /transfers/{group_id}, удалять — вместе с переводом (transactions-display.md)
Счета в выпадающих списках
- Порядок как на главной и
/accounts:cash→bank(основной первым), затем кредитные карты (sortAccountsForSelect)
Исправлено
Android
- DELETE через native HTTPS (
SslTrust): ответ 204 без тела больше не считается ошибкой (удаление переводов/операций) - После
adb install -rсессия больше не слетает:warmRefCacheне уходит без Bearer доinitAuthToken(раньше 401 вызывалclearAuthTokenи удалял токен из Secure Storage) - После онлайн delete/update балансы и списки обновляются сразу (
afterOnlineWrite→dataRefreshTickво всех offline wrappers)
Web
- После удаления/редактирования операции балансы (и вторая нога перевода) обновляются — silent
load/loadAll, не только перефильтровка списка
Техническое
- Docker CI: кросс-компиляция на
BUILDPLATFORM(без QEMU для npm/Go), кэш слоёв (type=gha+ghcr.io/...:buildcache),.dockerignore(install/docker.md) - OpenAPI
1.4.1:PUT /accounts/{id}/credit-limit, уточнения по комиссии и лимиту кредитной карты - Unit/e2e:
money(+/−), credit-limit, комиссия, AndroidMoneyKeypad/ session warm - Документация: ui-credit-cards.md, transactions-display.md, android-client-*.md, categories-and-icons.md, balance-maintenance.md, README.md
- docs/release-notes-v1.4.1.md
- Версия
1.4.1
Коммиты
Changelog
- d8185a70dac5f57d5ec6fb40e3ca35f13654f99f тесты и makefile (release локально)
- 62b97241699a5e2a204e92f7ef1adcc3bd53daf7 Раскладка клавиш собственной клавиатуры
- 5f236af08e786878e58e6f403f3a660adee871e3 Документация
- 99434ffccd6b510e95c1a0076ce8320f337aab1f правки тестов
- 62775e0a51fa9156463afbd13d343d8c68ec294f UI-фикс списка операций
- 3c4fb86dc3b7cc5c338d08a0d680a4cd843985b4 Android: своя клавиатура суммы (
MoneyKeypad) с+/−— системная decimal часто без «+» - 5b881e882bdf4fb78e63603fcb30f1753cda2693 БАГ. Web/Android: после удаления/редактирования операции не обновлялись балансы (Android — и список до sync) — web: silent
load/loadAll; Android:afterOnlineWrite→dataRefreshTickво всех offline wrappers - 89b5e48c73ba4f2c6d231372bed1d306c0da0720 Android: своя клавиатура суммы
- 813b32042b1cb9dd0113b5861397128c704a3c9c Исправлен баг с отвалом сессии после переустановки чеез adb
- 9e9b5aff55240a395a00717c6b20fcd2785fb049 Android: кнопка биометрии на экране PIN — в нижнем левом углу клавиатуры (иконка отпечатка)
- 8d03989a89a27d01efd189947aae2c89bdc5e2d2 Любая комиссия привязывается к операции, и удалить/отредактировать её нельзя
- 9625644c78be6ac9a749c7071719e1bbcfb1d150 Обработка 204 кода ответа
- 1e3fbbc203432c16f3ef0f041ee150f70ddbe601 Автопополнение в момент выставленого времени операции
- cdfab26bd660906430789ec8c6d6e1339aff94be В поля ввода суммы добавить возможность складыва/вычитать
- 5933fa2a8b0d3b0edfe0e16e840dfb5d9844d1b6 Увеличить кредитный лимит
- 8f61177dbefa1e920c69ca35bd3a480a26eaa8cf Редактирование подкатегорий
- 2a6611f2c726a388d0861be3ac5a8eb4da23925e Правки по оффлайн-режиму Android
- 784583cd5e451688e7f16412f505917ee8692f5a Недостающие иконки категорий
- 68e9cac6fb1fb1e0a0932a00649b6c9d1d74a188 Расширение оффлайн функционала для Android
- 9b6a5f27b1a267976d01a788a08f58b3661fd1bb Исправлен долгий CI (сборка docker)
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.4.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.4.1
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.4.1
Android
Вложения buhgalter-android-1.4.1.apk (universal) и buhgalter-android-1.4.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.4.0 (23.07.2026)
[v1.4.0] — 2026-07-23
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Android-клиент (android/ — отдельный UI, Capacitor, APK в GitHub Releases)
- Мобильное приложение к self-hosted инстансу. Вход: логин/пароль (
POST /auth/login→ session Bearer) или API-токен; выбор на/login - Первый запуск:
/server-setup— LAN discovery (mDNS_buhgalter._tcp+ скан /24 на :8765) + ручной LAN URL; затем/login - Настройки сервера: LAN / внешний URL, до 5 домашних Wi‑Fi (SSID), LAN fallback, HTTPS TOFU (self-signed), смена и отключение сервера
- Экраны: главная, счета, операции, переводы, долги, создание кредита (мастер
/credits/new/{basics,options,schedule}), действия по кредиту, бюджет, статистика, хабы настроек и админки (без/admin/users) - Drawer-оболочка (~70% ширины; «Главная» первым пунктом), полноэкранные формы (
FormPageShell), кнопка «Назад» (drawer → модалки → history → выход) - Офлайн outbox (create/update/delete, coalescing): операции, переводы, категории, долги, счета (в т.ч. archive/unarchive), бюджет; ref-cache SWR в
localStorage, прогрев при старте и sync, полоска «Нет соединения» - Блокировка приложения: PIN 4 цифры + опциональная биометрия (
/settings/security); токен и PIN-hash в secure storage - Сброс блокировки при выходе, отключении сервера и истечении сессии (
clearAppLock) - Сравнение версии APK с сервером (
GET /version/check); блокировка UI при отставании мажор/минор; приapp < server— подтягивание UI-строк сGET /api/v1/ui/i18n/{lang}(кеш по версии сервера + язык; soft-fail офлайн) - PageLoadGate — ошибка начальной загрузки экрана с «Повторить» (не пустой экран)
- Отладочное логирование (Настройки → Сервер) + экспорт
buhgalter-debug-*.logв Загрузки (DebugExport) - Static shortcuts: «+ Расход» / «+ Доход» / «Перевод»; sync outbox при возврате в приложение; экспорт очереди outbox в буфер
- Share-intent (
ACTION_SENDtext/image) → форма расхода с префиллом описания (ShareTargetPlugin) - Home-screen виджеты: быстрые действия, баланс, бюджет, «Скоро», один счёт (
WidgetBridge+ WorkManager) - SystemBars: стиль status/navigation bar следует resolved теме SPA (
SystemBars.setStyle) - Themed icon: adaptive слой
<monochrome>(силуэт) для Material You / тематических иконок ОС (icon-monochrome-512.png→make android-icons) - Навигация после сохранения: в настройках/админке — toast, остаётесь на экране; формы «Добавить» (операция, перевод, долг, счёт, кредит) —
leaveForm/from; мастер кредита —gotoReplaceмежду шагами; inline-редактирование — без перехода - Форма редактирования счёта: «Начальный баланс» из
initial_balance, не изbalance_display - Release APK: universal + per-ABI (
arm64-v8a,armeabi-v7a,x86_64); CI + goreleaserextra_files
Сервер
- mDNS — публикация
_buhgalter._tcpпри старте (BUHGALTER_MDNS_ENABLED,BUHGALTER_MDNS_NAME) GET /api/v1/health— опциональное полеexternal_url(изsystem_settings) для подписи домена в Android discoveryGET /api/v1/ui/i18n/{lang}— каталог UI-строк изserver/ui_locales/(make copy-ui-i18n/ui-i18n-check)- Тема профиля: значение
system(«Как на устройстве») вusers.theme; default у новых пользователей (schema.sql,InsertUser) GET /api/v1/budgets/spent-preview— факт расходов по scope без строки бюджета (подсказка «Уже потрачено» в форме) (budget.md)
Веб
- ref-cache SWR в
localStorageдля всехGET /api/v1/*— мгновенный экран, фоновое обновление (ui-api-cache.md) warmRefCache()после входа;assignIfChanged, path-awarerefCacheUpdate/ref-cache-watch- PageLoadGate на экранах с начальной загрузкой данных при сбое первой загрузки
- Тема
system(«Как на устройстве») — web + Android; резолв черезprefers-color-scheme; default до логина и у новых пользователей - Пункт «Главная» снова первым в верхнем меню (desktop и mobile) (ui-navigation.md)
Статистика (web + Android)
- Подкатегории под спойлером у каждой категории в блоке «По категориям»; данные —
GET /stats/by-subcategory(ui-stats.md)
Бюджет (web + Android)
- В форме создания/редактирования — подсказка «Уже потрачено» для текущего и прошлого месяца (
GET /budgets/spent-previewпо scope / категории / подкатегории / счёту); на будущий месяц не показывается; на Android при офлайне скрыто (ui-budget.md)
Изменено
Счета
- Форма редактирования (веб): поле «Начальный баланс» из
initial_balance, не изbalance_display(data-model.md) - Сортировка блока «Мои средства» на главной и
/accounts(web + Android): сначалаcash, затемbank; внутри типа основной счёт (is_primary) первым (ui-credit-cards.md) - Кредитную карту нельзя сделать основным счётом: UI скрывает действие;
POST /accounts/{id}/primary→ERR_ACCOUNT_PRIMARY_CREDIT_CARD; миграция042_primary_not_credit_card.sqlснимает ошибочный primary и назначает oldest eligiblecash/bank
Веб
- Главная, список счетов, операции — фоновый refresh без лишней перерисовки при неизменившемся JSON
- Новый счёт (
/accounts/new): после сохранения — возврат на экран-источник (?from=), не переход на карточку счёта - Периодические операции (
/settings/recurring-operations, web + Android): кнопка «Добавить» в шапке рядом с заголовком; форма создания под шапкой (как бюджет / счета / кредиты) (ui-navigation.md, ui-stable-layout.md)
Кредиты
- Переключатель «Уже платил по графику» (веб; то же правило в Android-мастере) показывается только если в preview графика есть платёж с датой в прошлом (ui-credits.md)
Импорт / тесты
- Sample CSV и e2e coverage-gaps: суммы как в экспорте (
100.00), без суффикса_-₽(парсер по-прежнему принимает legacy Cubux) - Web e2e Playwright: расширено покрытие (
budgetalready-spent, навигация «Главная», recurring «Добавить», flows/auth helpers)
Исправлено
UI — Select / Combobox / DateTimePicker
- Выпадающий список без
usePortalбольше не «отрывается» от поля:.relativeтолько вокруг контрола, label и hint снаружи (заметно на Android в профиле — тема, часовой пояс) (ui-dialogs.md)
Уведомления — долги
- Напоминание в день срока для долга «мне должны» больше не звучит как «вернуть долг»: плейсхолдер
{action}— «получить долг от» /collect debt from(для «я должен» — по-прежнему «вернуть долг») - Вместо «через 0 дн.» — «сегодня» (плейсхолдер
{when}); дефолтный шаблонdebt_due_soonобновлён (notifications.md)
Техническое
- Миграция
042_primary_not_credit_card.sql— снятие primary с кредитных карт и назначение основного средиcash/bank - Release-сборка APK: базовый цвет
splash_backgroundвvalues/colors.xml(lintMissingDefaultResource) make android-sync,android-apk,android-apk-release,android-install,android-install-release;scripts/setup-android-dev.sh,android-icons.py(цвет + monochrome)- CI release: job
android-apk→ проверка всех APK (scripts/verify-android-release-apks.sh) → артефакт каталогаrelease/→ goreleaserextra_files(universal + 3 ABI);make copy-ui-i18n/ui-i18n-check - Native plugins:
LanDiscovery,DebugExport,WifiSubnet,SslTrust,ShareTarget,WidgetBridge; CapacitorSystemBars - Подпись release APK:
keystore.properties/ GitHub Secrets;*.jksв.gitignore(не коммитить) - OpenAPI 1.4.0:
external_urlв health;GET /ui/i18n/{lang};GET /budgets/spent-preview;User.themeenumlight|dark|system; password-reset иGET /ui/meta - Unit (android/ui vitest): theme, debug-log, lan-discovery, app-lock, ref-cache, state-utils, виджеты, form-nav; приёмка UI на устройстве вручную (Playwright e2e Android не используется)
- Документация: android-client.md, android-client-ui.md, android-client-platform.md, ui-api-cache.md, ui-budget.md, ui-credit-cards.md, ui-navigation.md, ui-dialogs.md, README.md
- docs/release-notes-v1.4.0.md
- Версия
1.4.0
Коммиты
Changelog
- 587699ebfbe857d04ee9478684a58eedf05ffff2 Android release fix
- fd0ae9471d87d2a0a50ff9c9d3f1ce7dc660a29f Release fix
- cafd9ffb5b41898ca1343ce801e04dc0c1eb6acc release fix
- 13168cfe4d9d013f29b53b3a46929b29e3acccc4 release
- 53a13b4dad50301f39739d9d27d479437a2a92f0 release
- 04718fb732237faef0234d2a6e0459d6074e7f38 Android client; v1.4.0
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.4.0. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.4.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.4.0
Android
Вложения buhgalter-android-1.4.0.apk (universal) и buhgalter-android-1.4.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).
Релиз: v1.3.2 (08.07.2026)
[v1.3.2] — 2026-07-08
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Кредиты
- Переключатель «Первый платёж сегодня» для потребительского кредита и рассрочки (
first_payment_todayвPOST /api/v1/creditsи preview; не для ипотеки) — первый платёж в дату выдачи, далее поpayment_interval(ui-credits.md) - Ответ
POST /api/v1/credits/schedule/preview:effective_monthly_payment,effective_monthly_payment_display,user_set_monthly_payment— отдельно от автоматическогоcalculated_monthly_payment
Изменено
Кредиты
- Ручной ежемесячный платёж: при явном сохранении введённая сумма всегда применяется; без override — только точное совпадение с расчётом (или целые рубли, совпадающие с усечённым расчётом). Убран допуск ±1 ₽, из‑за которого ручной ввод мог сбрасываться
UI/UX
TransactionForm: порядок полей при создании дохода/расхода — счёт → категория → подкатегория → сумма → описание → дата → время (transactions-display.md)/budget: компактная шапка на мобильных — кнопки ←/→ 44×44, фиксированная ширина блока месяца, «Скопировать» / «Добавить» / переключатель месяца в одной строке с заголовком (ui-budget.md)
Техническое
- API/OpenAPI:
first_payment_today, расширенныйCreditSchedulePreviewResponse - Unit:
schedule_test.go—first_payment_today, разрешение ручного платежа - docs/release-notes-v1.3.2.md
- Версия
1.3.2
Коммиты
Changelog
- 6ddb8dd81d0e3b7a127759ce29e9e27a127bd0a3 release 1.3.2
- b879f229cb77ef418a291e97175e77360f76b956 Вёрстка в бюджете (мобюилка)
- 6a5fc9eb3f67aa87bb25b79e228f444262f81ce7 Окно "Расход"/"Доход" - порядок ввода
- 67ad7e1dcfc16a2c44cfc41cde9627595f2c544b Фикс добавления кредитов
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.2. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.2
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.3.2
Релиз: v1.3.1 (03.07.2026)
[v1.3.1] — 2026-07-03
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Категории
- Иконка «Караоке» (микрофон) в каталоге расходов (categories-and-icons.md)
- Системная категория «Перевод» (
is_system, иконкаtransfer, без подкатегорий) — только переводы между своими счетами; legacy-данные в пользовательской «Перевод» мигрируются в «Переводы» при старте (categoryseed.EnsureTransferCategory)
UI/UX
- Пункт «Операции» в верхнем меню →
/transactions(ui-navigation.md) - Иконки в
Select/Combobox: счета (AccountIcon), категории и подкатегории (CategoryIcon) —$lib/select-options.ts,SelectOptionIcon.svelte - Универсальный
TransactionList+TransactionCategoryCell: колонка «Категория» —иконка Категория → иконка Подкатегория; единая вёрстка на главной,/transactions, странице счёта,/stats,/debtors/[id](transactions-display.md)
Изменено
UI/UX
/transactions: плановые и прошлые операции — в отдельных спойлерах (как на главной); пагинация только у прошлых- Главная и
/accounts: блоки «Мои средства» и «Кредитные средства» — наличные и банки в одной сетке, кредитные карты отдельно; на главной — спойлеры, на/accounts— заголовки без спойлеров (ui-credit-cards.md) - Автопополнение: индикатор на карточке счёта —
Автопополнение: {имя счёта списания}; при выключенном автопополнении строка скрыта (ui-balance-maintenance.md) - Бюджет: адаптивная вёрстка формы создания/редактирования по области (
all_expense/category/subcategory) — ui-budget.md - Страница должника: блок «Последние операции» (бывш. «Связанные операции») на общем
TransactionListбез колонки «Категория» - Форма дохода/расхода: поле «Новая подкатегория» скрыто, если в селекте уже выбрана подкатегория
Исправлено
UI/UX
- Редактирование операции: календарь
DateTimePickerсusePortalоткрывается вверх, если снизу не хватает места (ui-dialogs.md)
Техническое
- API:
subcategory_icon,category_is_systemв обогащенииTransaction - Unit:
select-options.test.ts,categoryseed/transfer_test.go,dropdown-position.test.ts - e2e:
z-navigation.spec.ts(пункт «Операции»),transaction-actions.spec.ts(спойлеры плановых/прошлых),dashboard-accounts.spec.ts,accounts-management.spec.ts,budget.spec.ts(вёрстка формы) - docs/release-notes-v1.3.1.md
- Версия
1.3.1
Коммиты
Changelog
- 9aaa80e785983a9c67e1b516edca734f5714c4a0 v1.3.1
- 9946a4df34875dbed4072cb47ba81ff9a6414270 UI главной и счетов
- dfbb0e9ca055b0a39c6c8a908c88b1b158156672 UI-правки бюджета
- 48629b4f03f9e9a58397d34dcdb7e4616eacc260 Список операций: UI
- 28709e9951315a15cd822c9079be8934d37ab063 UI-окно добавления операции: Подкатегории
- 77f92d472ebc34b83c7fb0167f5b13d19c3e0317 Вёрстка списка счетов
- dd1440af7d663be4d714039928662dcbc2df6e1d Переводы
- e87fb62e1999ce9dd1029ce15f325bfcbd48c5b6 Иконки в выпадающих списках
- 85db9b3e676e4ca62490489c4dd1bb74e8ed3ca8 Автопополнение UI
- 6f6a684994fc16a60e22e767e23fef49dfa04fc0 UI-правки страницы операций. Добавил её в верхнее меню.
- cb655a7ef474ef36ecf00b6318ec782f746dd224 Исправление положения календаря в окне "Редактировать операцию"
- c28a9a68c6da62c03964a7055dd0131272a4f89f Иконка "Караоке"
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.1
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.3.1
Релиз: v1.3.0 (02.07.2026)
[v1.3.0] — 2026-07-02
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Пользователи и админка
- Статус пользователя:
active/pending/banned; саморегистрация →pendingбез сессии;PUT /api/v1/admin/users/{id}/status; меню «⋯» в/admin/users; плашка и попап?moderate=; уведомление админамuser_registration(api/user-status.md, миграция029_user_status.sql)
Счета
- Кредитная карта (
type=credit_card): лимит, счёт погашения, блокcredit_cards_summaryна главной, «Оплатить» / «Списать комиссию», импорт Cubux (ui-credit-cards.md,033_credit_card_accounts.sql) - Архивация и мягкое удаление:
archived/deleted, автоперевод остатка дляcash/bank, правила дляcredit_card, вкладки «Архивные» / «Удалённые» (accounts-archive-delete.md,040_account_deleted_status.sql) - Автопополнение (
bank): порог, цель, счёт списания; hook после операций; уведомлениеauto_topup_disabled(balance-maintenance.md,041_account_auto_topup.sql)
Кредиты
- Учёт суммы займа в балансе при создании потребительского кредита:
principal_affects_balance, операция дохода наdebit_account_id; блокировка при платеже в графике с датой в прошлом (031_credit_principal_income.sql)
Бюджет
- Помесячные лимиты (
scope: category / subcategory / all_expense),copy_forward, CRUD иGET /budgets/summary; страница/budget; виджет на главной; колонки в/stats; триггерbudget_threshold(budget.md, ui-budget.md, миграции034–039,036,037)
Уведомления
- Недостаток средств:
trigger_negative_balance, шаблонbalance_shortfall, суффикс кcredit_payment/planned_operation/debt_*(notifications.md,032_notification_balance_shortfall.sql) - Ссылки в шаблонах:
{debt_url},{credit_url},{transaction_url},{budget_url},{moderation_url}и др. —urls.go
UI/UX
MoneyDisplay— единый компонент read-only сумм;formatMoneyForDisplayдля i18n (transactions-display.md)
Изменено
UI/UX
- Верхнее меню: пункт «Бюджет»; на мобильных — drill-down подменю «Настройки» / «Админка» вместо длинного accordion (ui-navigation.md)
- Главная: счета под спойлером на
< sm; индикатор автопополнения уbank-счетов /stats: блоки «По категориям» и «По периодам» — full-width строками (категории выше периодов); сводка без колонки «Разница» (ui-stats.md)- Ширина контента на десктопе:
max-w-5xl(80rem,--container-5xlвlayout.css) - Категория дохода «Кредиты» при
principal_affects_balance— суффикс «(Доход)» в фильтрах и статистике
Backend
- Доменный SQL — через sqlc (
server/queries/); CImake inline-sql-check(sql-access.md)
Исправлено
Уведомления
{settings_url}в шаблонеtest— канонический путь/settings/notifications(не устаревший?tab=)
Долги
- Удаление операции «Взял/Дал в долг»: единственная начальная операция удаляет долг; погашение — пересчёт остатка; начальную операцию нельзя удалить при наличии погашений (
debt/transaction_delete.go)
Техническое
- Миграции
029–041 - Unit:
money-display.test.ts,credit-card.test.ts,account_delete_test.go, notify/balance tests - e2e:
budget.spec.ts,budget-home.spec.ts,budget-stats.spec.ts,credit-card.spec.ts,credits-principal-income.spec.ts,accounts-management.spec.ts,dashboard-accounts.spec.ts,admin-advanced.spec.ts(модерация) - docs/release-notes-v1.3.0.md
- Версия
1.3.0
Коммиты
Changelog
- 0e3eb8d7f07b2b84ff89074a002744e8447c7e3c v1.3.0
- 9a39c9f192afb4de2490e57ef08775f4b321a512 Merge branch '1.3.0' into master
- e5fe1eaab17ef8e75d419bfd60289f5be9d58f1a Автопополнение одного счёта с другого
- afeaa437af219b05071a3b2aa430c0264db58f26 Сделал основной размер страницы шире для десктоа
- 88790d6ab21c719af1ec12012a00c1eb14b77648 Удаление/архивация счетов. Переработка логики.
- eb1e1b22215bdea11d6f12820591544e3eda78f9 Меню в мобильной версии
- c52b2b4d563db943a96db34b9672d39db5d8ae97 Перевёрстка /stat
- 4405a006fa82567530c7cb8ac93dd4b93bc70097 На главной (в мобильной версии) счета скрыты под спойлер
- 459248df60abf5c20d7be1519097ca757fd67c5a Единый компонент отображения сумм
- 6646f4973ea0be631237702581e6146cb16059bf fix after merge
- 5de25df691d5e9be91fd509d4618cc769b958eee Merge branch 'master' into 1.3.0
- f5a36d987c8e1ddb28943ee8ede8b5564ef369c3 Бюджет. Доделки
- 9f820636602fe4f0257f69156b18948f2217cb1c Бюджет
- eebd477321b345606ce0adad1c29afb1d9d06472 1. Добавлен тип счёта "Кредитная карта" 2. Восстановлена страница "Архивных" счетов
- cdacf71f0168fc2a4f274cf9a3cdee94b880395c Исправлен баг при удалении операции долга. Операция удалялась, долг оставался
- b3572e1188fef39fad075e2686e75b0bbc4a2a9c Уведомления: Сообщение об отрицательном балансе, настройки, UI-доработки, URL в уведомлениях
- f92ac36362ac92bebe98521ddffa210d4295ba56 Merge branch 'v1.3.0' into master
- 42eee9818bc575877a20dc4c41eb65f23be5db2e Учёт денег кредита в балансе (типа кредит наличными)
- 3f548f1591c241d64fca96dea518e9c70afe1744 SQL-спецификации, вынос SQL из основного кода Go
- ed47c59ced04e67f8c5ffd380983a7197292bfe8 Статус пользователя — модерация регистрации, блокировка, меню «⋯» в админке, уведомления админам и плашка
- 3fa9436c8911476f861f44ecf9352d64c8e0e456 Фильтр запросов, уменьшение нагрузки на логи
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.0. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.3.0
Релиз: v1.2.5 (01.07.2026)
[v1.2.5] — 2026-07-01
Добавлено
UI/UX
- In-app toast: единая кратковременная обратная связь внизу справа — успех, ошибка, предупреждение, информация; API
toast.success/toast.error/toast.fromError(ui-toast.md) - Многоуровневое меню: выпадающие «Настройки» и «Админка» в шапке (
NavDropdown); настройки и периодические операции — отдельные маршруты/settings/*(ui-navigation.md) - DateTimePicker: параметр
blockPastIncludingToday— в календаре недоступны сегодня и прошлые дни; константаfutureDateOnlyPickerдля форм с датой только в будущем (date-time-display.md)
Изменено
UI/UX
- Настройки разбиты на отдельные страницы (
/settings,/settings/password, …) с layout и крошками; вкладки вынесены вProfileTab,PasswordTab,TokensTab,NotificationsTab; админка — только/admin/*; старые URL с?tab=и/import,/recurring-operationsне поддерживаются - Верхнее меню: пункт «Главная» убран (переход на дашборд — по клику на название приложения); в хлебных крошках «Главная» сохранена; крошки админки — «Главная / Админка / …» (без «Настройки»)
- Главная: плановые операции в спойлере «Плановые» — сортировка по дате убыванию (от новых к старым), как у прошлых
- Ошибки и успехи действий (сохранение, удаление, валидация при submit) выводятся через toast вместо inline-текста под формами; подсказки у полей и постоянные баннеры без изменений
- Удалён компонент
FormFeedback
Исправлено
UI/UX
- API-токены: при создании с явной датой истечения нельзя выбрать сегодня и прошлые дни в календаре — минимум завтра в TZ пользователя (
futureDateOnlyPickerна/settings/tokens)
Техническое
- Unit:
web/src/lib/toast.test.ts,web/src/lib/api/errors.test.ts,web/src/lib/datetime-picker.test.ts - e2e:
toast.spec.ts— toast success/error;z-navigation.spec.ts— выпадающее меню настроек, крошки;transaction-actions.spec.ts— сортировка плановых на главной;settings-extended.spec.ts— API-токены - docs/release-notes-v1.2.5.md, ui-toast.md, ui-navigation.md, date-time-display.md, transactions-display.md
- Версия
1.2.5
Коммиты
Changelog
- bb6a9f2fdbbad68756953ed92a400154ee54cae6 документация
- 248ebcffcfd72c0d01312f375026b02f29a27a23 Перестройка верхнего меню. Добавлены выпадающие меню
- 03abca04825d35e7a6d9a4b311a538f62f18643e 1. Поправлен баг с добавлением токена: Срок действия заканчивался в прошлом 2. Сортировка в плановых операциях на главной, от новых к старым.
- 780ca23f26c4173297bafcbfb32d01b30f111782 Переработка системных уведомлений на фронтенде (не путать с уведомлениями в мессенджеры)
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.5. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.5
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.5
Релиз: v1.2.4 (01.07.2026)
[v1.2.4] — 2026-07-01
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
API
- API-токены: поля
never_expiresиexpires_at(RFC3339) вPOST /api/v1/user/tokens; по умолчанию срок действия — 30 дней; бессрочный токен (never_expires: true) — в UI предупреждение о риске; отозвать можно только свой токен (чужой —404 NOT_FOUND). См. docs/api/authentication.md
UI/UX
- DateTimePicker: кнопка «Сегодня» в календаре — быстрый выбор текущей даты
- Пагинация: компонент
TransactionPagination— единые кнопки «В начало / Назад / Вперёд / В конец» на/transactions, странице счёта, графике кредита и превью графика (ui-pagination.md)
Изменено
UI/UX
- Форматы даты и времени: единые правила отображения по всему UI — дата
31.12.2026, дата-время31.12.2026 12:00:00; в списках операций, долгах, кредитах, периодических операциях и плейсхолдерах уведомлений{date}/{requested_at}— без секунд (31.12.2026 12:00). Константы: web$lib/dates.ts(DISPLAY_*_FORMAT), Gotimeutil/display.go(Display*Layout); гайд docs/date-time-display.md - DateTimePicker: кнопка пикера и стандарты
operationDatetimePickerCreate/Edit,dateOnlyPicker— подписи в форматедд.мм.гггг/дд.мм.гггг чч:мм - Главная: блоки «Общий баланс» и «Долги» — в одной строке на десктопе (
sm:grid-cols-2); на мобильных — два отдельных блока - Главная — последние операции: плановые (
kind=future) и прошлые (kind=manual) — в спойлерах<details>по 10 записей; плановые сверху, свёрнуты по умолчанию; прошлые — открыты; внизу карточки — кнопка «Все операции» (transactions-display.md) - Настройки → уведомления: каждый шаблон — отдельная карточка с кнопкой Сохранить (без общей формы на все шаблоны сразу); предпросмотр и сброс — в карточке шаблона
- Админка — диагностика и бекапы:
build_timeиcreated_atчерезformatAPIDateTimeForDisplay(с секундами), а не сырой RFC3339 - Админка: компонент
AdminSupportLinks— ссылки «Поддержать проект» и «Репозиторий» на/admin/*и в Настройки → Администрирование → Система - Хлебные крошки: на всех разделах и вложенных экранах — цепочка от «Главная» через раздел (счета, настройки, админка и т.д.); в настройках и админке учитываются вкладки (ui-navigation.md)
- Уведомления — сброс пароля (Telegram/MAX): в сообщении о запросе сброса пароля — ссылка для перехода к сбросу (
/admin/users?reset=…); если внешний URL не настроен — текст «настройте внешний URL в админке». В редакторе шаблонов доступен плейсхолдер{reset_url}
Backend
- Уведомления: форматирование плейсхолдеров даты/времени через
timeutil.FormatDisplay*в часовом поясе пользователя;{date}и{requested_at}— без секунд - Уведомления — сброс пароля: плейсхолдер
{reset_url}в шаблонеpassword_reset— ссылка на/admin/users?reset={user_id}при настроенномexternal_url, иначе подсказка настроить внешний URL в админке - Экспорт Cubux (CSV): суммы в колонках «Сумма списания» / «Сумма пополнения» — десятичное число (
237.97), без суффикса_-₽; импорт по-прежнему принимает оба формата (import/cubux.md)
Сборка и релиз
- Docker (GHCR):
provenance: falseвrelease.yml— образы снова корректно отображают платформыlinux/amd64иlinux/arm64(раньше из-за attestation manifests в GHCR показывалосьunknown/unknown)
Исправлено
UI/UX
- Админка — сброс пароля: модальное окно при переходе по
?reset=из уведомления закрывается по «Отмена»; параметрresetснимается с URL, повторное открытие блокируется (dismissedResetQueryв/admin/users)
Техническое
- Unit/integration:
internal/user(handler, tokens),auth_integration_test— создание/отзыв API-токенов,never_expires,expires_at, отзыв чужого токена;internal/auth/session_test.go - Unit:
server/internal/timeutil/display_test.go,web/src/lib/dates.test.ts,web/src/lib/datetime-picker.test.ts,server/internal/notify/formatter_test.go,server/internal/importexport/cubux_test.go - e2e:
date-time-display.spec.ts— формат даты в списке операций иbuild_timeв диагностике;admin-advanced.spec.ts— закрытие сброса пароля по «Отмена», ссылки поддержки;settings-extended.spec.ts— API-токены;transaction-filters.spec.ts,transaction-actions.spec.ts— главная и пагинация - docs/release-notes-v1.2.4.md, date-time-display.md, transactions-display.md, ui-pagination.md, api/authentication.md, import/cubux.md
- Версия
1.2.4
Коммиты
Changelog
- ff7c8c9d68929198d9f45d28cbd7191c4bc8b8de API-документация
- a459c04d726c119c9a737487d47ff5d6aa49d3b0 Документация
- abc2bad9c84e6cf3933a038f44647cbacad11730 UI страницы настроек уведомлений
- c9904ad5755f1e3b53fd3a2cddcfb2f66b8121dc Пагинация - вынесена в отдельный компонент
- eeff5e3ef45c85b6c7585fd5cb25f6005a4724e7 Правки экспорта; UI главной страницы и списка операций
- c50f133d9467418bdf6bf6874b4028886ee2a7b9 Ссылка на страницу сброса пароля в уведомлениях
- fa88325ac10455dd6949d1c267d8afbc650d6905 API-токены: дата истечения, бессрочные токены. Тесты
- 369857d9aedee7284b17d0247a5fdc288ef7a92f Пересборка документации
- 12d5910f60867148b04a48df7c297d5287abf29d docker-release fix
- 443a6cee13cb02ec02fa7f7bab6654cae5b0641d Кнопка "Сегодня" в календаре. Мелкие UI исправления
- f8ffef21aa2754076caf783945dbccdf8503e10b Хлебные крошки
- b4cefca86c9e0249676ca99087c10ce1461bd271 Окно сброса пароля - закрытие по кнопке "Отмена"
- 7a3fced4e1cfddf8b31bad8bd41e2f142dbf14f5 Привёл в порядок отображение даты и времени
- f3411c83876d56dff7f7bbfd23edb612f071cd94 UI админки: мелкие правки. Стандартизированный формат вывода даты-времени
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.4. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.4
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.4
Релиз: v1.2.3 (30.06.2026)
[v1.2.3] — 2026-06-30
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
UI/UX
- Список операций (главная,
/transactions, страница счёта): пункт меню «⋯» Повторить — форма новой операции с полями из выбранной строки (счёт, категория, сумма, описание; для перевода — счета, сумма, комиссия) и текущей датой; работает для дохода, расхода и перевода; недоступно для системных категорий и платежей по кредиту (TransactionForm/TransferForm, proprepeatFrom)
Изменено
UI/UX
- Периодические операции (
/recurring-operations): время выполнения по умолчанию — 08:00 в часовом поясе пользователя (раньше 00:00; UI и API при пустомtime_local) - Поля суммы (
MoneyInput): пустое и нулевое значение не отображается как0.00— показывается placeholder0.00; при blur нулевой ввод очищается (formatMoneyForInput,formatMoneyInput); единообразно в формах счетов, операций, переводов, кредитов, долгов и периодических операций - Форма перевода: на странице счёта в «Откуда» подставляется текущий счёт; на главной и в «Все операции» — основной
- Форма перевода: выбранный в одном поле счёт не показывается в противоположном селекте («Откуда» / «Куда»); при совпадении значений автоматически подбирается другой счёт (
transferAccountOptions,pickOtherAccountIdв$lib/transfer-accounts.ts)
Исправлено
Backend
- Периодические операции: после автоматического создания операции планировщиком вызывается
accountbalance.Refresh— пересчитываетсяcurrent_balanceсчёта. Раньше транзакция появлялась в списке, но баланс не менялся (с v1.2.2 баланс денормализован и требует явного refresh) - Автосписание кредита: операция сохраняется с датой/временем из
debit_time_localв часовом поясе пользователя (paymentTransactionDate; раньше в БД попадало 00:00)
UI/UX
- Кредиты: в графике платежей и списке кредитов дата следующего платежа показывается с временем автосписания (
formatCreditPaymentDateForDisplay,debit_time_local), а не полуночью
Техническое
- e2e: повтор операции, селекты перевода, автосписание кредита с
debit_time_local, баланс после периодической операции;money-input.spec.ts— placeholder суммы - docs/release-notes-v1.2.3.md, transactions-display.md, ui-row-actions.md
- Версия
1.2.3
Коммиты
Changelog
- 7d9eec79b3fc743bca72acda46fe5fe66ad92b78 UI правки: placeholder в суммах, текущий счёт "Откуда" на странице счёта при добавлении перевода
- 6d313979fc6a7ebbd40c6eb3ebdcaf87efc8ee49 Исправлено время в разделе "Кредиты"
- c99b3ae039c215ef84a0b31ab3890a908e8e140d Исправлен баг: периодическая операция появляется в списке операций, но баланс не изменяется
- 2a185b2cf24b345773a9c2d6ff47786b30c9975f Время в "Периодических операциях" по умолчанию 8:00
- 643aaa0823891f6dd826dbf3f28b8677768afac0 Правки UI: Окно перевода, список счетов
- 2144e26ecefb3ee0d46164470643b17b5f3b4f9a "Повторить" в операциях
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.3. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.3
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.3
Релиз: v1.2.2 (29.06.2026)
[v1.2.2] — 2026-06-28
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
Добавлено
Обновления
GET /api/v1/version/check— сравнение текущей версии с последним релизом на GitHub (кеш на сервере 24 ч)- Веб-клиент: раз в сутки проверка обновления; модальное предупреждение о бэкапе и release notes — только для администраторов; ссылка «скачайте бекап» → Настройки → Админка → Бекапы
Производительность и API
- Миграция
028: колонкаaccounts.current_balance— денормализованный баланс счёта; индексidx_tx_user_account_balanceнаtransactions accountbalance— пересчёт и хранениеcurrent_balanceпри изменении операций;BackfillAllпри миграции- Пакетные SQL-запросы для дашборда и прогноза (
ForecastsByUser, агрегаты future-операций по всем счетам за один проход) - In-memory кеш GET-ответов на сервере (
apicache): TTL 5 мин для справочников, 1 мин для остальных; инвалидация при любой мутации пользователя (docs/ui-api-cache.md) GET /api/v1/ui/meta— агрегированные справочники для старта веб-клиента (счета, банки, категории, должники, кредиты); банки из ответа попадают в клиентский кеш на 24 ч
Фоновые задачи
- Активация future-операций в фоне:
FutureRunnerвscheduler— раз в минуту и при старте сервера; допустимый лаг актуальности — до ~1 мин
UI/UX
- Главная (
/), Все операции (/transactions), страница счёта (/accounts/[id]): три кнопки-иконки Доход / Расход / Перевод (NewTransactionButtons, Font Awesome Solid:f067,f068,f0ec); подписи только вtitle/aria-label - На странице Все операции добавлена кнопка Перевод (раньше был только доход/расход через общую «Операция»)
- Форма новой операции (
TransactionForm): переключатель типа убран — тип задаётся кнопкой; заголовок модалки «Доход» или «Расход»; при редактировании тип по-прежнему только текстом - На странице счёта кнопки операций вынесены из меню «⋯» в шапку карточки (десктоп); на мобильных — в меню «⋯»; в меню — редактирование, основной, архив, удаление
/stats→ «По категориям»: отдельные секции доходы и расходы; процент считается внутри каждого типа
Изменено
Производительность
- Баланс счёта читается из
current_balance, а не пересчитывается на каждый запрос ActivateDueFutureTransactionsубран из hot-pathList,DashboardForUser,stats.Summary— активация только в фоне
UI/UX
- Блок контекстной статистики операций и
/stats: поле «Разница» убрано (дублировало баланс) - Баннер запросов сброса пароля у администратора: загрузка
GET /admin/password-reset-requestsодин раз при монтировании, без повторных запросов на каждую навигацию
Документация и контракты
- OpenAPI: уточнено описание
percentageвStatsCategoryItem; схемаUIMetaResponseдляGET /ui/meta - docs/ui-api-cache.md — серверный in-memory кеш GET; клиент кеширует только статические банки
Исправлено
UI/UX
- Страница счёта: клик по счёту-контрагенту в строке перевода корректно открывает страницу другого счёта (в обе стороны — и «с», и «на»)
Техническое
- Расширено покрытие e2e-тестами (счета, операции, фильтры, импорт, кредиты, долги, админка, perf-сценарии)
make prepare— автофикс Go (golangci-lint fmt,golangci-lint run --fix), web (npm run lint:fix) и генерация (sqlc, OpenAPI, иконки категорий)- Версия
1.2.2
Коммиты
Changelog
- 96c34cf13d0f59ba1ae3593fa4de993d6826e5e2 docs
- 823f59e25d69d5dfe273008b2e81d65e6c1632f4 Активация future-операций в фоне
- 6a4f1623540b2d57e20b135818b5eb01480659c6 Страница счёта - клик на другой счёт в переводах
- bbf751c8738b35c05986c4e732f33659b573816e Убрать поле "Разница", дублирует баланс
- eb3349af0827e1e8aaea0bb493303f0951711bd3 отключить постоянные запросы api/v1/admin/password-reset-requests
- 69961b2371b18798a230b833fd0e6811b6f9bf9d - линтеры для go и web - команда make prepare
- a8afbaf36775510961ccee94302703cd3c9f99f3 - оптимизирована работа с базой данных - добавлен серверный кеш - более полное покрытие проекта e2e тестами
- 323e7641bf8b47501a2489f1f6bda79a2b3dae48 - добавлена проверка обновлений (раз в сутки) - Кнопки создания операций разделены (доход, расход, перевод) на страницах: Главная, Счёт, Список операций - На страницу счёта кнопки создания операций вынесены из меню на смтраницу - На странице списка операций добавлена кнопка "Перевод" - В мобильной версии на странице счёта кнопки добавления операций убраны в меню - Окно создания операции - убран тип операции - Обновлены e2e-тесты - Переработан ROADMAP
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.2. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.2
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.2
Релиз: v1.2.1 (27.06.2026)
[v1.2.1] — 2026-06-27
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
При деплое через Docker и переходе на каталоги./data,./backups,./logsна хосте — инструкция по миграции.
Добавлено
Инфраструктура и API
BUHGALTER_LOG_MODE(prod/dev): вprodредактируются чувствительные заголовки, вdev— полные request-логи и расширенная диагностика ошибок- Docker Compose по умолчанию монтирует
./data,./backups,./logsс хоста (настраивается черезBUHGALTER_HOST_*_DIRв.env) - Docker-образ: entrypoint при старте создаёт каталоги volume и выставляет владельца uid 1000 (
buhgalter) — ручнойchownна хосте не нужен - В JSON-ошибках API опциональное поле
error.field— подсказка, какое поле запроса некорректно
Кредиты и ипотека
- График ипотеки с ежедневным начислением процентов: отдельный расчёт аннуитетного платежа и генерация (N−1 равных платежей + закрывающий)
- Ручной ввод ежемесячного платежа ипотеки из договора банка (
monthly_paymentв API и поле в форме создания) POST /api/v1/credits/schedule/preview— предпросмотр графика сcalculated_monthly_paymentбез сохранения
UI/UX
- Периодические операции: список на мобильных — карточки вместо горизонтальной прокрутки таблицы; форма вынесена в
{#snippet} - Редактирование операций дохода/расхода: меню «⋯» → Изменить на главной,
/transactions, странице счёта; формаTransactionForm— счёт, категория, подкатегория, сумма, описание, дата; тип (доход/расход) не меняется; дата в будущем →kind=future - Оплата кредита: в модалке можно выбрать счёт списания только для данного платежа (
account_idв API); основной счёт кредита (debit_account_id) не меняется - Действия в строках — компонент
RowActionsMenu: меню «⋯» с иконкой и подписью у каждого пункта (операции, периодические, категории, долги, график платежей) - Список счетов
/accounts: меню «⋯» на каждой карточке — редактировать (inline на карточке с подписями полей), сделать основным, архивировать, удалить - Страница счёта: действия (новая операция, перевод, редактирование, основной, архив, удаление) — в меню «⋯» в шапке карточки
- Настройки → Категории: «Сделать главной» — в меню «⋯»; раскрытие подкатегорий — клик по названию с ▶/▼ после текста
- Страница кредита: «Оплатить» — отдельная кнопка слева от меню «⋯» в шапке; в строках графика оплата остаётся в меню
- Страница должника: вкладки «Активные / Закрытые» через
PageTabs(как в настройках и списке долгов) - Фильтры (
FilterPanel): на мобильных свёрнуты под спойлер «Фильтры» с chevron; на десктопе всегда развёрнуты (/transactions,/stats, страница счёта) - In-memory кеш справочников в веб-клиенте:
GET /banks,GET /categories,GET /debtors— TTL 5 мин, дедупликация параллельных запросов, инвалидация при изменениях и logout
Изменено
UI/UX
/stats: в блоке «По категориям» только таблица категорий (отдельный список по подкатегориям убран)/stats: блок «По периодам» — человекочитаемые подписи (месяц «Июнь 2026», неделя «1–7 июня 2026», день —YYYY-MM-DD); порядок от новых к старым- Настройки → Категории: иконка категории/подкатегории — декоративная (без клика); главная категория отмечена галочкой у названия
- Редактирование счёта (список
/accountsи страница/accounts/[id]): у полей формы подписи «Название», «Банк», «Начальный баланс» - Погашение долга (
SettleDebtForm): переключатель «Не учитывать в балансе» (по умолчанию выключен) — затем счёт списания; при включённом переключателе поле счёта скрыто; счёт по умолчанию — из долга (account_id) или основной счёт;affects_balanceпри погашении задаётся в форме, а не наследуется от создания долга - Модалка оплаты кредита: убрана кнопка «Сегодня» у поля даты (дата задаётся календарём или берётся из графика)
Кредиты
- Пагинация графиков: кнопки «В начало» и «В конец» (форма создания и страница кредита)
- Для потребительских кредитов ручной платёж проверяется на минимум (покрытие процентов) и максимум (укладывание в срок); для ипотеки принимается любая положительная сумма из договора
- В графике кредита: оплатить — только ближайший неоплаченный платёж; удалить — только последний оплаченный; при удалении платёж восстанавливается как неоплаченный
scheduled
Документация и контракты
- OpenAPI: описание
POST /credits/schedule/preview, ипотечного графика,error.field, кодыERR_CREDIT_*; схемаPreviewScheduleResponse; UI-действия над счетами (PUT,POST .../archive,POST .../primary,DELETE) на/accounts - OpenAPI: уточнено поведение
GET /dashboard(forecast_balance,has_future_this_month) и lifecycle оплаты/удаления платежейPOST/DELETE /credits/{id}/payments* - OpenAPI: endpoints
/stats/*(сводка, категории, периоды, поиск, контекст;GET /stats/by-subcategory— только API, в UI не используется) - OpenAPI:
GET /stats/by-period— формат ключейperiod, сортировкаitemsпо убыванию даты - OpenAPI: поведение in-memory кеша веб-клиента для справочников (
/banks,/categories,/debtors) - OpenAPI:
POST /debts/{id}/settle— телоSettleDebtRequest(affects_balance,account_idнезависимы от флага долга при создании) - OpenAPI:
PUT /transactions/{id}— тип операции должен совпадать с существующим (ERR_TX_TYPE_CHANGE); дата в будущем переводит вkind=future; операции сcredit_payment_linkedредактируются через кредит, не через transactions - OpenAPI:
POST /credits/{id}/payments— опциональныйaccount_idдля счёта данной оплаты - Справочники UI: docs/ui-row-actions.md —
RowActionsMenu(счета, категории, операции на главной),FilterPanel; docs/ui-stats.md — страница/stats; docs/ui-api-cache.md — кеш справочников; docs/ui-dialogs.md — погашение долга; docs/ui-credits.md — оплата кредита, счёт платежа; docs/transactions-display.md — редактирование операций; docs/categories-and-icons.md — раскрытие категорий, главная в меню
Исправлено
Кредиты
- Создание ипотеки и предпросмотр графика: ошибки валидации возвращают 400 вместо 500
- Отрицательный последний платёж в длинном графике ипотеки
- Предпросмотр графика в форме создания: при ошибке предыдущие строки не сбрасываются
- Ручной платёж, совпадающий с расчётным в пределах 1 ₽, трактуется как автоматический (без лишнего override)
- Пустой график при корректном расчёте платежа (гонка запросов / ложный
UserSetPaymentдля ипотеки) - Исправлен регресс: платёж по кредиту с будущей датой снова корректно влияет на прогноз баланса текущего месяца (главная и страница счёта)
- Устранён преждевременный перевод
future-операций кредита вmanualдо наступления даты операции
Инфраструктура
- Docker: исправлен
permission deniedпри записи в/app/logs/auditна bind mounts, созданных Docker от root
UI/UX
- Веб-интерфейс по HTTP (не localhost, например
http://192.168.x.x): страницы не зависали на «Загрузка…» —RowActionsMenuи импорт больше не требуютcrypto.randomUUID(недоступен вне secure context); используется$lib/random-id - Дополнительно стабилизирован
DateTimePicker: высота календаря и поле даты больше не «скачут» между месяцами и состояниями - Исправлены вкладки на странице должника: единый стиль
PageTabsвместо кнопокbtn-primary/btn-ghost - Исправлены фильтры на десктопе: после спойлера на мобильных панель на широких экранах снова всегда видна (
FilterPanel+matchMedia) - В меню кредита пункт «Изменить банк» отображался с иконкой галочки (
save) вместо иконки банка
Техническое
- Тесты backend/frontend и OpenAPI-проверки синхронизированы с контрактами
v1.2.1 $lib/stats-period.ts— форматирование подписей периодов на странице/stats- Версия
1.2.1
Коммиты
Changelog
- d3150019807a4a7b8f639e576c7dbdd6c6e7ffe6 - Исправлена сборка docker (права на лиректории) - Исправлена незагрузка некоторых страниц
- 705d96206692b440d2184f28ba11c3b39eb00ea8 Release v1.2.1
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.1
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.1
Релиз: v1.2.0 (26.06.2026)
[v1.2.0] — 2026-06-26
Добавлено
Кредиты и ипотека
- Локальное время автосписания
debit_time_local(HH:MM) в API/UI; автосписание включается переключателем, при включении по умолчанию подставляется00:00(для отключения передаётсяnull) - Автосписание через scheduler по дате платежа и
debit_time_local; при создании кредита больше не предсоздаются массово будущие транзакции - Модалка управления автосписанием на странице кредита (переключатель + время)
- Переключатель автоплатежа в форме создания кредита (с дефолтом
00:00) - Поля банка кредита
bank_id,bank_nameв API/UI - Тип кредита
mortgage(MVP):property_price,down_payment, опция «не списывать взнос с баланса», расчётproperty_price - down_payment - Отдельный счёт взноса
down_payment_account_id(если не указан, используетсяdebit_account_id) - Для ипотеки в UI фиксирована ежемесячная периодичность (
month)
Периодические операции
- Новая сущность и страница
/recurring-operations; периоды: неделя / 2 недели / месяц / год; создание из существующей операции - В списке операций для системных категорий скрыто действие «Сделать периодической»
- Перестроен layout формы: сначала список, затем кнопка «Добавить» с раскрытием; редактирование inline (одна открытая форма)
- Из селектора исключены системные категории
- Поле подкатегории всегда отображается (если список пуст, контрол disabled с
—) - Для периода
monthдень берётся изstart_date, полеday_of_monthв UI скрыто
Setup и счета
- Восстановление БД из
.db-бэкапа на странице первичной настройки (POST /api/v1/setup/restore) - Действие «сделать основным» добавлено на список счетов (индикатор — синяя галочка у имени)
Уведомления
- Admin-only триггер
password_reset: новый тип шаблонов и настройка только для администраторов
Изменено
Кредиты
- Иконки банков в списке и карточке кредита
- Пагинация для длинных графиков платежей (вместо «показать ещё»), включая форму создания кредита
- Оптимистичный UX оплаты: после «Оплатить» интерфейс сразу отражает изменения и блокирует редактирование графика до ответа сервера
- Сортировка кредитов приведена к «новые → старые»
- Страница деталей кредита: бейджи типа, редактирование имени, блок данных в 3 колонки, иконки действий вместо текстовых кнопок
- Унифицирован денежный формат в кредитах (разделители тысяч + валюта)
UI/UX
- Стабилизирована высота календаря
- Внедрены хлебные крошки
- Обновлены стили кнопок и вкладок
- Триггеры уведомлений отображаются компактным вертикальным списком
- На главной и странице счёта: текущий баланс + баланс с учётом
futureв текущем месяце (прогноз скрывается, если равен текущему) - Админ-раздел перенесён в «Настройки → Админка»
Документация и контракты
- Описания
BUHGALTER_STATIC_EMBEDиBUHGALTER_CORS_ORIGINSприведены к фактическому runtime-поведению - Синхронизированы спецификации OpenAPI 1.2.0; добавлено поле
transaction.category_is_systemи описание ограничения для плановых операций системных категорий ru/enлокали снова встроены в серверный бинарник; типовой запуск больше не требуетBUHGALTER_LOCALES_DIR
Исправлено
Кредиты и прогноз
- Исправлен регресс: будущий платёж по кредиту (оплата датой в будущем) снова корректно учитывается в прогнозе баланса на главной и на странице счёта в рамках текущего месяца
- В активации
future-операций кредита устранён преждевременный перевод вmanualдо наступления даты операции
Навигация и счета
- Исправлен переход на страницу счёта и загрузка страницы при прямом открытии URL
- Восстановлено действие «сделать основным» на странице счёта
Операции
- Для системных категорий (кредиты, долги и другие служебные категории) запрещено создавать и обновлять операции с
kind=future— backend возвращает ошибку валидации (ERR_SYSTEM_CATEGORY_PLANNED)
UI/UX
- Дополнительно стабилизирован
DateTimePicker: высота календаря и поле даты больше не «скачут» между месяцами/состояниями
Техническое
Миграции
024_credit_bank_and_debit_time025_notification_password_reset_trigger026_recurring_operations027_credit_mortgage_fields
Качество и релиз
- Тесты backend/frontend и OpenAPI-проверки синхронизированы с контрактами
v1.2.0 - Версия
1.2.0
Коммиты
Changelog
- f945f4c8a6af67ef1f8f4961aae4157392f2f657 Ещё несколько багов попутных, с календарём, регрес небольшой был, исправлен
- 7b6d2c7bafa108abd91094e09c6e640aab6881eb Доработки по кредитам. e2e тесты
- 59b7b934ada1ac4227d900b6f44e860a50c5aabb v1.2.0: добавлена ипотека и периодические операции, доработаны кредиты, добавлено восстановление базы в setup, локали встроены в бинарник
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.0. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.0
Релиз: v1.1.1 (25.06.2026)
[v1.1.1] — 2026-06-25
Добавлено
- Поддержка
.envфайла — переменные окружения читаются из.envрядом с бинарником илиdocker-compose.yml;BUHGALTER_ALLOWED_HOSTSдля доступа с удалённого сервера без reverse proxy (localhost/127.0.0.1 доступны всегда) - Документация OpenAPI без авторизации — страница
/docs(Redoc) и/docs/openapi.yamlдоступны без входа; в README добавлены ссылки на демо-стенд
Изменено
- Счета — пункт «Счета» перенесён из вкладок Настроек в верхнее меню навигации; страница
/accountsтеперь показывает список счетов (раньше редиректила в Настройки) - Курсор — при наведении на все кнопки и кликабельные элементы теперь отображается указатель (рука) вместо стрелки
- Высота кнопки «Новый счёт» на главной — приведена к единой высоте с иконкой-кнопкой «+»
- Расстояние между «Админка» и именем пользователя в шапке увеличено на 5px
Исправлено
- Подсветка активного раздела в верхнем меню
Техническое
- Версия
1.1.1
Коммиты
Changelog
- fe7076612b5b39176fc57ecfa417e1ed1ab9999a docker-compose.yaml (.env)
- ba73722afadf040d1b0a7e9f709b13dc41bfb230 UI: - Счета переехали из Настроек в верхнее меню - Высота кнопки "Новый счёт" на главной выровнена с остальными - Верхнее меню: Кнопка раздела, в котором находишься - подсвечивается - Курсор при наведении на кнопки - рука
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.1.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.1.1
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.1.1
Релиз: v1.1.0 (25.06.2026)
[v1.1.0] — 2026-06-25
Добавлено
Сброс пароля (через администратора)
- Страница входа: «Запросить сброс пароля» →
POST /api/v1/auth/request-password-reset(при неизвестном логине — тот же успешный ответ, без перечисления учёток) - Баннер и список ожидающих запросов у администратора; подтверждение →
POST /api/v1/admin/password-reset-requests/{id}/ack - Сброс пароля в админке →
PUT /api/v1/admin/users/{id}/passwordс инвалидацией сессий пользователя - Таблица
password_reset_requests(миграция023); rate limit 5 запросов/мин с IP на endpoint сброса
Кредиты
- Редактирование сумм неоплаченных платежей →
PATCH /api/v1/credits/{id}/schedule(толькоkind=scheduled,is_applied=false; обновляются связанныеfuture-операции) - При создании кредита задним числом: списание со счёта для хвоста ретро-платежей → поле
retroactive_debit_countвPOST /api/v1/credits(расход наdebit_account_id, учёт в статистике) - Автодополнение укороченных графиков активных кредитов при старте (
RepairShortSchedules; миграция-маркер020)
Переводы и категории
- Поле комиссии при переводе; расход в системной категории «Комиссия» (иконка
percent) - Системная категория «Комиссия» для новых и существующих пользователей (backfill при старте)
- При drag-order категорий системные остаются в конце; системную категорию нельзя назначить главной
Интерфейс
- Мобильная адаптация: touch-targets 44px, карточки графика/операций, bottom sheet модалок, скролл вкладок, меню в шапке с пунктом «Счета»
- Сброс формы при повторном открытии «Новый кредит»
- В админке — блок доната и ссылка на репозиторий GitHub
- Переключатели (
ToggleSwitch) вместо чекбоксов: кредиты, долги, уведомления, импорт, фильтры, админка - Редактирование перевода из списка операций (страница счёта)
- Фильтр категорий по типу операции (доход/расход) на
/transactions,/stats, странице счёта - Суффиксы «(Доход)» / «(Расход)» у категорий с одинаковым именем (например «Долги»)
- Иконка «Архивировать» на странице счёта (как у остальных действий)
- Предупреждение при удалении оплаченного платежа по кредиту; подсказка в группе «Оплаченные» графика
Статистика и фильтры
- Фильтры по дате без времени; границы суток в часовом поясе пользователя (
/stats,/transactions, страница счёта) /stats: автоприменение фильтров, поиск по описанию операций в блоке drill-down- Сводка на странице счёта: входящие переводы в «Доходе», исходящие в «Расходе» (согласовано с балансом)
Документация и демо
- Демо-стенд: buhgalter-demo.kai-zer.ru (логин
demo, парольdemo_1_demo) - docs/release-notes-v1.1.md и обновление справочников в
docs/ - Roadmap: roadmap/receipt-scanner.md — сканер чеков (черновик)
Изменено
- Генератор графика с процентами: ровно
term_monthsплатежей; аннуитет 1…N−1, последний — остаток + проценты за период - Сортировка категорий в API: пользовательские, затем системные (
sort_order,name) - OpenAPI 1.1.0: комиссия переводов, редактирование графика,
retroactive_debit_count, password reset - Операции с флагом
credit_payment_linkedнельзя менять черезPATCH /transactions/{id}— только на странице кредита - Поле суммы (
MoneyInput): курсор не прыгает в конец при правке в середине числа
Исправлено
- Укороченный график кредита (например 22 платежа вместо 36) — расчёт и восстановление при старте
- Мобильное меню: перекрывалось контентом (z-index); не закрывалось при навигации
- Форма создания кредита сохраняла данные предыдущего кредита без перезагрузки страницы
- Статистика и список операций расходились по платежам кредита: прошедшие
future-операции активируются при чтении; в SQL учитываются оплаченные платежи сexclude_from_stats=0 - Сводка на странице счёта не учитывала входящие переводы в блоке «Доход»
- Первоначальная настройка (
POST /setup): повтор после частичного сбоя не давал 500 — восстановление маркера.configured, ответ 409 если БД уже настроена - Календарь (
DateTimePicker): в конце месяца отображались дни 31–34 вместо дней следующего месяца; дни соседних месяцев в сетке теперь кликабельны - Тёмная тема: календарь, выпадающие списки и мобильное меню сливались с фоном (
popover-panel) - Долги: дата операции и плановый возврат — только дата (без времени в форме и списках)
npm run check/vite buildне обращались к API заallowedHosts(загрузка только приvite dev)
Техническое
- Миграции:
020_repair_credit_schedules,023_password_reset_requests - SQL:
UpdateScheduledCreditPaymentAmount,UpdateFutureTransactionAmount,UpdateSystemCategoryIcon StatsSummaryAccount— сводка по счёту с учётом переводов;ActivateDueFutureTransactionsпри списке операций и статистике- В ответах
Transaction:credit_payment_linked;GuardTransactionUpdateдля операций кредита mapMoneyInputCursor— стабильный курсор в полях суммыsetup.Handler:syncConfiguredMarker, маркер.configuredсразу после commit транзакцииDateTimePicker:calendarCellsс годом/месяцем для padding-дней; плагинallowedHostsPlugin(configureServer)- CSS:
--bg-popover, класс.popover-panelдля overlay-панелей - Версия по умолчанию:
1.1.0(VERSION,Makefile,Dockerfile, OpenAPI)
Коммиты
Changelog
- b83c4ce5cc66ef772381ead529c35972e2ecec99 Подготовка релиза
- cd163d51e49aefb813721cc49617c5919196a5a5 Исправлен календарь Мелкие фиксы
- cf73c6016b48fef7c4232d98da817616dd32ae41 Исправлены статистика и фильтры Доработаны кредиты Обновлён UI и переводы
- 5dfa93b9fe50528c485cdaece75ce8ce118716ff v1.1.0 - Сброс и восстановление пароля - Адаптация под мобильные браузеры - Комиссия за переводы и категория «Комиссия» - График кредита: ровно term_months платежей и repair при старте - Редактирование сумм неоплаченных платежей графика - Списание ретро-платежей при создании кредита - Переключатели в форме кредита (ретро-списание) - Сброс формы при повторном «Новый кредит» - Кнопка доната в админке - Демо-стенд и release notes v1.1.0 - OpenAPI 1.1.0
Docker
Вложения docker-compose.yaml и .env — тот же compose из репозитория; .env задаёт BUHGALTER_IMAGE_TAG=1.1.0.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.1.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.1.0
Релиз: v1.0.0 (24.06.2026)
[v1.0.0]
Первый стабильный релиз self-hosted приложения для личного учёта финансов.
Добавлено
Установка и инфраструктура
- Три способа установки: сборка из исходников (
make build), Docker (GHCR), бинарники GitHub Releases (Linux, Windows, macOS; amd64 и arm64) - Первый запуск через
/setup: администратор, пароль с подтверждением, опциональная регистрация - Автоматические миграции SQLite (goose) при старте; схема
001…019(одна таблица — один файл) - Синхронизация версии приложения в БД (
app_version/previous_app_version) при обновлении бинарника - Переменные окружения (
BUHGALTER_ADDR,BUHGALTER_DATA_DIR,BUHGALTER_LOCALES_DIR, …) - Пример nginx reverse proxy + HTTPS; поле внешний URL в админке для работы за прокси
- CI/CD: тесты, линтеры, сборка Docker-образа при git tag; GoReleaser для релизов
Пользователи и безопасность
- Регистрация (если разрешена), сессии в cookie (10 дней неактивности)
- API-токены (Bearer),
GET /auth/verify - Правила сложности пароля при setup, смене пароля и создании пользователя
- Изоляция данных по
user_id; админ-панель: пользователи, системные настройки, бэкапы, восстановление, диагностика - Секретный ключ шифрования токенов уведомлений (set-only в админке)
- Audit log в
logs/audit/YYYY-MM-DD.jsonl
Финансовый учёт
- Счета: банковские (справочник банков РФ) и наличные, архивация, основной счёт (★)
- Категории и подкатегории доходов/расходов с иконками, drag-order, главная категория на тип
- Операции: расход, доход, переводы; плановые операции (
future) с активацией по дате - Двойной баланс на главной: текущий и прогноз с учётом будущих операций за месяц
- Долги: единый список должников, погашение, виджет на главной, уведомления по срокам
- Кредиты: график платежей, автосписание в полночь по timezone пользователя, досрочные платежи, закрытие и удаление
Импорт, экспорт, аналитика
- Импорт CSV/XLSX с маппингом колонок (preset Cubux)
- Экспорт операций в CSV
- Статистика по типам, категориям и периодам; поиск по операциям и комментариям
- Контекстная сводка на страницах со списками операций
Уведомления
- Telegram и MAX (official API
platform-api2.max.ru); настраиваемые шаблоны и время отправки - Уведомления по долгам («я должен» / «мне должны») с учётом timezone
Интерфейс
- SvelteKit UI: светлая и тёмная тема, русский и английский (svelte-i18n)
- Настройки: профиль, пароль, счета, категории, импорт, уведомления, API-токены
- Адаптивная вёрстка, PWA (manifest, service worker, иконки)
- Toast-уведомления, пустые состояния, единые диалоги (без
window.confirm)
API и документация
- REST API
/api/v1/…с полным OpenAPI (описания на русском) - Интерактивная документация: Redoc на
/docs - Документация в
docs/: установка, модель данных, UI-гайды, импорт Cubux
База данных
- Все изменения в базе данных - через миграции
Локализация
- Локали сервера вынесены из бинарника (
server/locales/, volume в Docker)
Техническое
- Стек: Go 1.26+, SQLite, SvelteKit, встроенный статический фронтенд (
embedstatic) - Команда
make version vX.Y.Z— единая простановка semver во всех артефактах (VERSION, OpenAPI, Dockerfile, …)
Коммиты
Changelog
- 0bc2ef8a21714eb6996b3b515495675ca00f0a84 Release v1.0.0: первый стабильный релиз.
Docker
Вложения docker-compose.yaml и .env — тот же compose из репозитория; .env задаёт BUHGALTER_IMAGE_TAG=1.0.0.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.0.0
docker compose -f docker-compose.yaml up -d
Или без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.0.0
Коммит: e42cd41 (14.09.2026)
документация
Коммит: 9af50ce (14.09.2026)
БАГ. Автопополнение в `date_desc` оказывалось ниже триггера (выглядело старше операции); должно быть позже триггера и выше в ленте
Коммит: 0882967 (11.09.2026)
Баги с клонированием приложения и чёрным экраном при старте
Коммит: 4edba52 (08.09.2026)
документация
Коммит: af7e864 (07.09.2026)
Доработка синхронизации
Коммит: d31e53b (07.09.2026)
Исправления в разделе "Долги" при оффлайн-работе
Коммит: b1cfff0 (07.09.2026)
Баг в кредитах после оплаты
Коммит: 5bf91b5 (04.09.2026)
- БАГ. Android: после правки операции на web (разбиение) на главной оставалась одна операция, пока несколько sync/перезапусков — список всех операций и счёта уже показывали две - CI/act: тесты SQLite — шаблон мигрированной БД + `synchronous=OFF`; `go test -timeout 30m` (иначе act упирался в 10m на goose/fsync)
Коммит: 4b67839 (04.09.2026)
БАГ. Web: календарь в подписках (и везде с выбранной датой) — не перелистывал месяцы: `$effect` в `DateTimePicker` сбрасывал `viewMonth` при навигации
Коммит: 39ea9cf (03.09.2026)
версия 1.5.2