buhgalter

Тип проекта: личный проект

Бухгалтер: Self-hosted личная бухгалтерия

⭐Звезды: 1
🍴Форки: 0
🔄Обновлен: 5 нояб. 2026 г.
📰 Релизы
Релиз: v1.11.3 (05.11.2026)

[v1.11.3] — 2026-11-05

Без миграций БД. Перевод на кредитную карту больше не отклоняется, если сумма больше credit_limit − balance.

Android

Исправлено

  • Перехват уведомлений: «Возврат» (не отмена покупки) создаёт черновик дохода, магазин берётся из текста после суммы. Категория и подкатегория черновика — по истории операций того же типа, в том числе по описанию («Выплата процентов»), а не только по магазину из справочника
  • Ошибки API в тостах и формах больше не показываются сырым кодом ERR_… — подставляется текст из каталога

Изменено

  • Пополнение кредитной карты: можно перевести любую сумму, в том числе больше остатка долга; баланс карты может стать выше лимита (ui-credit-cards.md)

Web

Исправлено

  • Ошибки API больше не показываются сырым кодом ERR_…

Изменено

  • Пополнение кредитной карты сверх лимита разрешено; кнопка «Весь лимит» по-прежнему подставляет остаток долга

Server

Изменено

  • POST /transfers на credit_card принимает сумму больше credit_limit − balance; код ERR_CREDIT_CARD_PAYMENT_EXCEEDS_LIMIT больше не возвращается
  • Все коды ошибок из обработчиков есть в server/locales и в errors.* клиентов; error.message — человеческий текст, не ключ

Техническое

  • scripts/check_api_error_i18n.py в make ui-i18n-check: код из WriteR / WriteL должен быть в локалях сервера и UI
  • Тесты: перевод на карту сверх лимита; formatApiError не показывает сырой код; Playwright credits-principal-income сверён с локализованным message

Коммиты

Changelog

  • dbbc445500191d9dde797b4d5b513e85b1506b69 исправил отображение ошибок в интерфейсе
  • 1d8e81e381615eaedf2d669b57998fbdda9f5924 Пополнение кредитной карты сверх лимита
  • 30b5a60b246742d20d6a893bf54c7d67d83afaca Исправлен баг с черновиками уведомлений

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.11.3. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.11.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.11.3

Android

Вложения buhgalter-android-1.11.3.apk (universal) и buhgalter-android-1.11.3-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.11.2 (01.11.2026)

[v1.11.2] — 2026-11-01

Без миграций БД. API не менялся.

Android

Исправлено

  • Перехват Ozon Банка: сумма с разделителем тысяч — узким неразрывным пробелом (U+202F) — читалась с конца («3 073 ₽» → 73). Экзотические пробелы теперь нормализуются перед разбором
  • Перехват WB Банка: доход «Выплата процентов» попадал в описание как «а процентов». Метка операции берётся целиком; «Ozon Банк» в заголовке пуша больше не считается магазином
  • Сканер чеков: при запущенной камере кнопки «Остановить» и «Загрузить фото» были неактивны. Теперь обе доступны, выбор фото сам останавливает камеру (android-client-receipts.md)
  • Кредит: бейдж ближайшего платежа считал день по UTC — в поясе восточнее UTC платёж на завтра показывался как «сегодня»
  • Бюджет: «Копировать на следующий месяц», сохранение и удаление перерисовывали страницу целиком и сбрасывали прокрутку наверх. Теперь список обновляется на месте

Изменено

  • Кнопки без яркой заливки: основные и опасные — тональные «таблетки», приглушённый тумблер, выбранные вкладки и сегменты — тональные (ui-visual-style.md)
  • Кнопка создания в шапке списков везде «+ Добавить»: счета, кредиты, подписки, периодические операции, бюджет, шаблоны, правила категорий
  • Заголовки групп везде одного вида — без счётчиков и подсказок
  • Периодические операции разделены на группы «Активные» и «Неактивные»
  • Убраны лишние подсказки: периодические операции, шаблоны, категории, магазины, теги, правила категорий, «Черновики», «Уведомления банков», «Сервер», «Безопасность»
  • Форма бюджета: переключатели «Активен» и «Копировать на следующий месяц» в один ряд, без подсказки

Web

Исправлено

  • Сканер чеков (импорт и прикрепление чека): «Остановить» и «Загрузить фото» доступны при запущенной камере
  • Кредит: бейдж ближайшего платежа — день по часовому поясу пользователя, не по UTC
  • Бюджет: копирование, сохранение и удаление больше не сбрасывают прокрутку

Изменено

  • Тот же стиль кнопок, «+ Добавить» в шапке списков, заголовки групп без счётчиков и подсказок, периодические операции «Активные» / «Неактивные», меньше подсказок
  • Форма бюджета: переключатели в один ряд, поля выровнены в две колонки

Server

Изменено

  • Строки Android UI (server/ui_locales): новые ключи common.add, recurring.group.active / recurring.group.inactive; из заголовков групп убраны счётчики

Техническое

  • Тесты: vitest парсеров уведомлений и daysUntilApiDate; Playwright — сканер чеков с фейковой камерой, обновлены budget, z-category-rules, coverage-gaps, credits-principal-income

Коммиты

Changelog

  • d4ebf1a3087e841a7b003e8e48d4295b822bdd22 документация
  • 5755f1e23c938a01dd478912f16e2a88c0eb8f05 Улучшение UI (Web + Android)
  • 555d8f9df9522d99f4dbacdc4ef02f4654490ce8 Баг парсера даты в бейджах. Раздел "кредиты"
  • fd7b2ac14756fe37fab86ebba16c58a3b6dd06eb Исправил баги в сканере чеков
  • ba63ecd52ee184b50f10d4baf2ccbeab8a0c2f53 Исправления в парсере уведомлений

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.11.2. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.11.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.11.2

Android

Вложения buhgalter-android-1.11.2.apk (universal) и buhgalter-android-1.11.2-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.11.1 (01.11.2026)

[v1.11.1] — 2026-11-01

Без миграций БД. Сервер и веб не менялись (только версия сборки); изменение — в APK.

Android

Добавлено

  • Перехват уведомлений нового приложения «ВБ Банк» (ru.wildberries.bank): пуши разбираются как у прежнего приложения WB Банка, привязка «счёт → банк» не меняется (notification-intercept-harden.md)

Коммиты

Changelog

  • e11394ee38e1718aa8b742c61b030f3a9c381c27 Добавлена поддержка уведомлений от нового приложения WB-банка

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.11.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.11.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.11.1

Android

Вложения buhgalter-android-1.11.1.apk (universal) и buhgalter-android-1.11.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.11.0 (31.10.2026)

[v1.11.0] — 2026-10-31

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЭКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Миграции БД 063–067: валюта у счетов, бюджетов и долгов (заполняется валютой профиля), уникальность бюджета с учётом валюты, семья / команда, автор операции и исходный владелец счёта. Данные не удаляются.

Android

Добавлено

  • Семья / команда: создание группы, приглашение кодом, ссылкой или QR (камера или файл), deep link ru.kai_zer.buhgalter://invite/{code}, участники, передача владения, выход и роспуск. Семейные счета с бейджем, тумблер «Семейный счёт» при создании, «Сделать общим» / «Сделать личным». Вкладки «Личные / Семья» в справочниках, «Всё / Личное / Семья» на главной, в статистике и бюджете. Экран требует сеть (household.md)
  • Валюта счёта: выбор при создании, итоги главной по валютам, обмен между счетами разных валют (две суммы, курс из них), чипы валюты в статистике и бюджете. Виджеты баланса — в валюте профиля с пометкой «+ другие валюты» (multicurrency.md)

Изменено

  • Редизайн всех экранов: группы с заголовком и подсказкой, списки одной карточкой, сводки плитками, бейджи статуса, «Опасная зона». Хабы настроек и админки со значками и подсказками (ui-visual-style.md)
  • Изменение бюджета открывается в окне снизу экрана, а не раскрывается внутри карточки
  • Время в периодических операциях и подписках — обычное поле «Время выполнения», без спойлера
  • Сервер, выбранный в поиске по LAN: его внешний URL сразу попадает в профиль. В «Настройки → Сервер» заполняет пустое поле «Внешний URL»; если поле уже заполнено другим адресом — подсказка «Сервер сообщает: …» и кнопка «Подставить». Внешний адрес, который не отвечает из домашней сети, не мешает сохранить профиль (android-client-platform.md)
  • «Копировать на следующий месяц» в меню бюджета включает у бюджета тумблер копирования и перезаписывает уже существующий бюджет следующего месяца (budget.md)

Исправлено

  • Стрелки у шаблонов и черновиков из уведомлений: доход — вниз, расход — вверх
  • Экран «Черновики», открытый до загрузки пользователя (холодный старт, переход из уведомления), показывал «Включите перехват уведомлений», хотя перехват включён
  • Ошибка копирования бюджета больше не появляется в форме другой статьи и не показывается сырым кодом ERR_BUDGET_COPY_EXISTS: ошибки копирования — тостом
  • Одинаковые отступы между спойлерами «Мои средства» и «Кредитные средства» на главной и между блоками на страницах долга, кредита, подписок, периодических и пароля

Web

Добавлено

  • Семья / команда: /settings/household, приглашения кодом, ссылкой /invite/{code} и QR (меню «⋯» у приглашения: «Показать QR», «Отозвать»), на мобильном — «Открыть в приложении». Семейные счета, справочники и фильтр «Всё / Личное / Семья» — как в Android (household.md)
  • Валюта счёта: выбор при создании (менять можно, пока нет операций и связей), итоги главной по валютам, обмен между валютами, чипы валюты в статистике, нетто-капитале и бюджете (multicurrency.md)

Изменено

  • Редизайн всех экранов в стиле справочников: группы с подсказками, списки одной карточкой, сводки плитками (.stat-grid), таблицы .data-table, бейджи статуса, футер с действиями, «Опасная зона» (ui-visual-style.md)
  • «Копировать на следующий месяц» в меню бюджета включает тумблер копирования и перезаписывает уже существующий бюджет следующего месяца (budget.md)

Исправлено

  • Стрелки у шаблонов: доход — вниз, расход — вверх
  • Ошибка копирования бюджета показывается тостом, а не в форме, открытой следом
  • Одинаковые отступы между спойлерами на главной и между блоками на страницах долга, кредита, подписок, периодических и пароля

Server

Добавлено

  • Семья / команда: households (kind = family | team), участники, инвайты (9 символов, 7 суток, одноразовые), POST /accounts/{id}/share и /unshare, scope=all|personal|household у главной, операций, статистики, нетто-капитала и бюджета. Модуль household (по умолчанию включён). Миграции 065–067 (household.md, feature-toggles.md)
  • Валюта счёта: accounts.currency, budgets.currency, debts.currency (миграция 063), GET /currencies (RUB, USD, EUR, CNY, KZT, BYN, TRY, GBP), to_amount у перевода между валютами, totals_by_currency на главной, ?currency= в статистике и бюджете. Связи счетов (кредитка → счёт оплаты, автопополнение, архивация, кредит, долг, бюджет со счётом) — только одна валюта, ERR_CURRENCY_MISMATCH. Смена валюты счёта с операциями — ERR_ACCOUNT_CURRENCY_LOCKED (multicurrency.md, data-model.md)
  • Импорт «Бухгалтер» читает валюту счёта; Cubux импортирует строку, если её валюта совпадает с валютой счёта, иначе пропускает с warning. Уведомления форматируют сумму валютой счёта или бюджета (import/buhgalter.md, import/cubux.md, notifications.md)

Изменено

  • POST /budgets/{id}/copy-next включает у источника copy_forward и пишет следующий месяц как сохранение с тумблером: бюджет того же scope и валюты обновляется, иначе создаётся. 409 ERR_BUDGET_COPY_EXISTS удалён (budget.md)
  • Уникальность активного бюджета учитывает валюту (миграция 064)

Исправлено

  • Кеш GET (apicache) дублировал все заголовки ответа, включая Access-Control-Allow-Origin и Vary: браузер отбрасывал кросс-доменные ответы (Android-UI в браузере, сторонние клиенты). Веб с того же origin не затронут

Коммиты

Changelog

  • 18af10cfbe4341ed5cb201a3e3102e49e7e140bf документация
  • 639fa9d68460ab986c4fff0573d540a32cf07333 Исправления в бюджете
  • aa1f499d3833e4475811e9dbe95dba26825906ca Редизайн веба и Android
  • 42049d5cd5120810e40267d116214ddde4300d97 Android: внешний URL из найденного сервера
  • 6fb4ca074a4d43a6505ac339b27b5ed3818dfea5 Редизайн веба и Android
  • 44c4d8d0239fc094bed31f352020fa17e4500451 Семья / команда
  • c010bcea94eddfce7738d58ea16c2e3e706a9085 Валюта счёта

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.11.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.11.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.11.0

Android

Вложения buhgalter-android-1.11.0.apk (universal) и buhgalter-android-1.11.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.10.1 (26.10.2026)

[v1.10.1] — 2026-10-26

Без миграций БД. Сервер и веб не менялись (только версия сборки); исправления — в APK.

Android

Исправлено

  • «Изменить время» у платежа по кредиту открывалось в самом низу длинной страницы (главная, операции, счёт), а не у нижнего края экрана. Модальные окна теперь всегда относительно экрана (android-client-ui.md)
  • Поле времени открывало системный выбор только по иконке часов; теперь — по тапу в любом месте поля, на всех экранах (android-client-ui.md)

Техническое

  • ModalShell — портал в body; PullToRefresh без transform / will-change в покое; action use:nativeTimePicker (showPicker() по тапу); vitest на action, стиль PTR и source-scan инвариантов

Коммиты

Changelog

  • 694f39f5f9c78b14238a3d98dd17d6a316b209fc Важные UI исправления, после релиза 1.10.0

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.10.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.10.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.10.1

Android

Вложения buhgalter-android-1.10.1.apk (universal) и buhgalter-android-1.10.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.10.0 (25.10.2026)

[v1.10.0] — 2026-10-25

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЭКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Есть аддитивные миграции БД 057–062 (сканер чеков: токен API, точки чека, импорты, кеш preview, категории позиций; страховочное merchant_aliases).

Android

Добавлено

  • Сканер чеков 54-ФЗ: кнопка «Чек» на главной, в операциях и на счёте; QR читается на устройстве (камера, снимок, файл из галереи), на сервер уходит только строка. Import — расходы по позициям с категорией у каждой строки; «Прикрепить чек» и «Открепить» в меню расхода; просмотр чека из журнала. Только online (docs/receipt-scanner.md, android-client-receipts.md)
  • Кнопка «Войти в демо-режим» на экране адреса сервера и на выборе входа: вход на публичный стенд buhgalter-demo.kai-zer.ru одним нажатием. Сохранённый свой сервер заменяется только после подтверждения; ошибка оставляет прежний адрес (roadmap/android-demo-login.md)

Изменено

  • Платёж по кредиту: в меню строки «Изменить время» вместо пунктов подписки; день операции не меняется (transactions-display.md)
  • Подсказка «Копировать на следующий месяц»: сохранение пишет только следующий месяц и выключает там копирование; месяц через один появляется 1-го числа, если у следующего копирование включено

Исправлено

  • Системный «Назад» с пуша или внешней ссылки открывает главную, а не закрывает приложение (android-client-ui.md)
  • Главная при уже показанной сводке без сети остаётся на месте с полоской «Нет соединения», а не уходит в заглушку «Сервер недоступен» со вторым таким же toast (android-client-ui.md)
  • Список магазинов: удаление убирает строку на месте, список не перезагружается и не прыгает в начало (ui-stable-layout.md)

Web

Добавлено

  • Сканер чеков 54-ФЗ: кнопка «Чек» на главной, в /transactions и на счёте; QR с камеры или из файла читается в браузере. Import расходов по позициям, «Прикрепить чек» к существующему расходу (сверка суммы), «Открепить», просмотр чека из журнала с подсветкой позиции (docs/receipt-scanner.md)
  • Админка → API чеков: токен proverkacheka (write-only) и модуль receipt_scanner (README.md)

Изменено

  • Платёж по кредиту: в меню строки «Изменить время» вместо пунктов подписки (transactions-display.md)
  • Подсказка «Копировать на следующий месяц»: сохранение пишет только следующий месяц и выключает там копирование; месяц через один появляется 1-го числа, если у следующего копирование включено

Исправлено

  • Список магазинов: удаление убирает строку на месте, список не перезагружается и не прыгает в начало (ui-stable-layout.md)

Server

Добавлено

  • Модуль чеков: POST /receipts/parse (строка QR → preview через proverkacheka, повтор того же чека — из БД), POST /receipts/import, POST /receipts/attach, POST /receipts/detach, GET /receipts/{id}, GET /stores; PUT /admin/settings/receipt-api-token. Без feature flag receipt_scanner — 404, без токена — 503 ERR_RECEIPT_API_NOT_CONFIGURED
  • Магазин чека разрешается по каталогу merchants (имя или алиас), как у ручной операции. «По магазинам» в статистике считает merchant_id; подкатегории позиций прикреплённого чека попадают в GET /stats/by-subcategory
  • PUT /transactions/{id}/time — смена часа и минуты операции, связанной с платежом по кредиту; дата и debit_time_local кредита не меняются

Исправлено

  • Тумблер «Копировать на следующий месяц» при сохранении уже наступившего месяца сразу создаёт или обновляет только следующий месяц и выключает у него копирование. Чтение списка, сводки и проверка порога бюджет не пишут. 1-го числа по часовому поясу пользователя создаётся отсутствующий следующий месяц, если у текущего копирование включено; уже существующий месяц этот проход не меняет
  • Предупреждения, которые handler пишет через пакетный slog (ошибки привязок банковских уведомлений, настроек уведомлений, удаления данных, импорта), теперь попадают в logs/app.log, а не только в stdout

Техническое

  • OpenAPI 1.10.0; версия сборки 1.10.0
  • Миграции 057_receipt_api_token, 058_receipt_scan_jobs, 059_stores_and_receipts, 060_receipt_fiscal_previews, 061_receipt_import_item_categories, 062_merchant_aliases_ensure (CREATE … IF NOT EXISTS, на базе после 056 ничего не меняет)
  • На публичном демо-стенде сканер чеков выключен: лимита proverkacheka не хватает на общий стенд

Коммиты

Changelog

  • 82ccb719f81e6244ad18e7895d09ceca94e48a75 документация к релизу 1.10.0 (Сканер чеков)
  • 936ad3cc29318ce1df4b814ddf9ac21232a87fb2 Починил логирование части запросов
  • c800095afc54d92ef7c4a24265f3aa245da3cfcf Демо-вход на андроиде
  • 83c724f4888f5b49ecd8924057ae49b9a362ad18 Доработка сканера чеков (UI)
  • 8a389f9bb1c96485dee81557de4d6d882bf9d535 Доработка сканера чеков (магазины)
  • df82041bdd8e26a41f7fa56891deaab8f1287d72 Платёж по кредиту: в меню строки «Изменить время» вместо пунктов подписки
  • 7aa79aa5ec27e5edf9b27f1598ed4a82374e48ff UI списка магазинов
  • e5aaffb06419669015e686e49e0e4c47c8142584 Убрал ошибку соединения на главной странице Андроида
  • 2dd9c71f76b74cd754ed2671e32c49ce8a31bb1a Нажатие "Назад" после перехода из пуша - ведёт на главную, а не закрывает приложение
  • 93ca81d6cb4553a548eda834fc9003a431720022 Документация для разработки
  • 7652f6f7efb271a34126cf989ad1be032dce3e03 Баги в "Бюджете"
  • 235ed4b1f909eafe0e6080328a78491954cf00c5 Merge branch 'master' into scan_chek
  • 7df4171b2394024f224780e40d48ac4ddbee0d21 Сканер чеков v1.10
  • 358b155bc18db4283522daadb429c3e33d1955a6 Merge branch 'master' into scan_chek
  • ab2b14165452934f44c4b74f049f8b4f22c22b9c check-scan-test

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.10.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.10.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.10.0

Android

Вложения buhgalter-android-1.10.0.apk (universal) и buhgalter-android-1.10.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.9.2 (24.10.2026)

[v1.9.2] — 2026-10-24

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЭКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Есть аддитивная миграция БД 056 (таблица merchant_aliases).

Android

Изменено

  • В хабе настроек нет пункта «Уведомления» (каналы, шаблоны и кнопки Telegram/MAX — в вебе). Банковские уведомления и черновики перехвата на месте; прямой адрес страницы по-прежнему показывает баннер (roadmap/android-hide-notification-settings.md)
  • В форме операции магазин ищется по основному имени и алиасам; в журнале и в выбранном значении — только основное имя (roadmap/merchant-aliases.md)

Web

Добавлено

  • Алиасы магазина (создание и правка) и Объединить: выбранный магазин остаётся, имена остальных становятся его алиасами, операции переезжают на него (roadmap/merchant-aliases.md)

Изменено

  • В каждом шаблоне Telegram/MAX кнопки по умолчанию уже в раскладке: их можно переставлять, нельзя удалить; текст правится только в «Кнопках по умолчанию». Свои кнопки шаблона добавляются отдельно (roadmap/notification-template-global-buttons.md)
  • Конструктор «Кнопок по умолчанию» только у включённого канала; оба включены — вкладки. Клавиатура выключенного канала при сохранении блока не затирается
  • В форме операции совпадение с алиасом выбирает существующий магазин

Server

Добавлено

  • Алиасы магазина (merchant_aliases): поле aliases в GET /merchants и GET /ui/meta; POST /merchants/{id}/merge. Создание операции и импорт по merchant_name находят магазин по алиасу. В журнале и в merchant_name — основное имя
  • Экспорт «Бухгалтер»: колонка aliases в секции merchants. Файл без этой колонки импортируется как раньше
  • У шаблона уведомления placement — порядок общих и своих кнопок. Нет placement — как раньше: global → шаблон → блок недостатка средств. Новая глобальная кнопка дописывается в конец раскладки шаблона

Изменено

  • GET /api/v1/export без format (пустая строка и пробелы тоже) — формат «Бухгалтер», фильтры дат/счёта/категории не применяются. Cubux — format=cubux. Неизвестное значение остаётся Cubux (roadmap/export-default-format.md, import/buhgalter.md)

Исправлено

  • /docs: Redoc открывается (схема TransactionList у GET /transactions/inbox вместо битой ссылки TransactionListResponse)

Техническое


Коммиты

Changelog

  • 87337dfde530828504558177a09779e13c463207 Документация
  • 4393c97d5f59570bf2c0ccc20109ffc56cc12d49 Экспорт без format — формат Бухгалтер
  • fa4d70a513b66f02e9167eafabd94e135c54d041 Android: скрыть раздел «Уведомления» в «Настройках»
  • 936812036122dcf8bc95a20b15767f4831e5fc5e Алиасы магазинов
  • f0e6a5891df7673656178dc64bb22af76aa0203e Глобальные кнопки в уведомлениях
  • 778b328c8ce26bce787e3cafe00b5ea56cc75d01 Исправление /docs

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.9.2. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.9.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.9.2

Android

Вложения buhgalter-android-1.9.2.apk (universal) и buhgalter-android-1.9.2-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.9.1 (17.10.2026)

[v1.9.1] — 2026-10-17

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЭКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет.

Android

Изменено

  • Перехват уведомлений: единый gate для черновиков и уведомлений в шторке; marketplace WB/Ozon без маркетинга и доставки; provisional только с суммой и маркером валюты (roadmap/notification-intercept-harden.md)
  • Направление переводов: «перевод по …» → расход; «перевод от …» → доход; оба с одной суммой в окне ~2 ч → перевод между своими счетами (roadmap/notification-intercept.md)

Исправлено

  • WB Кошелёк «Перевод по СБП» снова распознаётся как операция (не ignore / не сумма «Доступно»)
  • Ложные уведомления бухгалтера на рекламу и доставку Wildberries / Ozon (в т.ч. «80%» → «80 ₽»)

Server

Техническое


Коммиты

Changelog

  • 3da6666c3068e8b5d74acc64ab0789f5c34bfaac документация
  • a6ce7fd84a2df78feb69bc2267c1ccea58278d6c Улучшение перехвата уведомлений

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.9.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.9.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.9.1

Android

Вложения buhgalter-android-1.9.1.apk (universal) и buhgalter-android-1.9.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.9.0 (16.10.2026)

[v1.9.0] — 2026-10-16

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЭКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Есть аддитивная миграция БД 055 (колонки JSON-клавиатур уведомлений).

Android

Добавлено

  • Парсер перехвата: ВТБ «Поступление», Сбер SMS «Перевод по СБП», сумма с «р» без кода валюты, номер карты/счёта из «СЧЁТ5159» (roadmap/bank-notification-income-patterns.md)

Изменено

  • Интерфейс: на сенсорных экранах без полос прокрутки; «потянуть вниз» обновляет текущий экран; в профиле стиль «Классика» / «MaterialBased» (roadmap/ux-polish.md)
  • На странице уведомлений остаётся только баннер «Настройте в веб-версии» (каналы, шаблоны и кнопки — в вебе) (notifications.md)
  • Принять в шторке банковского черновика снова открывает форму операции/перевода с предзаполнением (не создаёт операцию сразу); подтверждение — «Сохранить» в приложении. Отклонить без изменений (shade-accept-open-form.md)

Исправлено

  • При запуске приложение сразу сворачивалось (гонка при фоновом подъёме перехвата уведомлений на HyperOS и др.) (android-client-platform.md)
  • В поле Магазин формы черновика больше не попадает почти весь текст push — вместо Оплата р Карта … Баланс остаётся имя точки (notification-merchant-strip.md)

Web

Добавлено

  • Исходящие кнопки в сообщениях Telegram и MAX: общие и в шаблоне; конструктор перетаскиванием; пресеты по типу уведомления; предпросмотр и тест. Обработка нажатий (webhook) в этом релизе не входит (notifications.md, roadmap/telegram-max-buttons.md)
  • В шаблоне недостатка средств — ссылка на счёт ({account_url}) и пресет «Открыть счёт»

Изменено

  • Интерфейс: на touch без полос прокрутки (на desktop — тонкие); «потянуть вниз» на мобильных; в профиле стиль «Классика» / «MaterialBased» (roadmap/ux-polish.md)
  • Настройки уведомлений: блоки под спойлерами; в шаблонах — только включённые каналы; в payload клавиатуры нет клиентского id (toApiKeyboard)

Исправлено

  • Кнопка сохранения в настройках уведомлений показывала ключ перевода вместо текста (на Android экрана с этой кнопкой нет — только баннер)

Server

Добавлено

  • Исходящие кнопки Telegram и MAX в настройках и шаблонах уведомлений (порядок при отправке: общие → шаблон → блок недостатка средств; кнопка без URL после подстановки плейсхолдеров не добавляется)
  • Плейсхолдер {account_url} в шаблоне недостатка средств

Техническое

  • OpenAPI 1.9.0; версия сборки 1.9.0
  • Миграция 055_notification_keyboards — колонки keyboard_telegram / keyboard_max (JSON, default пустая клавиатура)
  • В README — что делать при Android 15+ «Конфиденциальные данные скрыты» при перехвате банковских push (README.md)
  • Формат даты Layout в DraftNotifyHttp (hardening; Accept из шторки больше не POST’ит) (shade-accept-sync-failed.md)
  • Проверка полноты переводов UI (make ui-i18n-check): ключи из интерфейса должны быть в ru и en

Коммиты

Changelog

  • b124887342f3e2b6c21523513fc2b64a621dc95b документация версии 1.9.0
  • 947d8f7dd71659814163e233e8e0abefd9bb6ec5 Улучшение уведомлений в шторке
  • 754af034a0ab5c43b1244b8fb0f2e9776f5247b3 Исправление работы уведомлений в шторке (не перехват)
  • e9ee0e27d4153d66f4ce2f82075b87464e6c4a28 улучшения парсинга уведомлений
  • a4d54e48c13dd96d0f9d22d48f14b9ad73da3ef1 Банковские push: «Конфиденциальные данные скрыты» (Android 15+)
  • 6afb9168ac01ddbedd27eefc16c501920aaa4d7e Кнопки в сообщениях мессенджеров
  • f3a99e6b19f53edfd98c83948da23e948478a1e5 переводы
  • 30e0738db78d65a07959a3d321ec2582e960c72e MaterialBased тема
  • dc5a04c72001a6756659df9abd23f0f6bc36e4b4 исправление сворачивания при запуске приложения

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.9.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.9.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.9.0

Android

Вложения buhgalter-android-1.9.0.apk (universal) и buhgalter-android-1.9.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.8.0 (13.10.2026)

[v1.8.0] — 2026-10-13

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Есть миграции БД (053, 054).

Android

Добавлено

  • Статистика: блок нетто-капитала (текущее значение, assets/liabilities, ряд по месяцам) без интерактивных графиков (ui-stats.md)
  • Правила категорий и очередь «Разобрать» (операции без категории): drawer, evaluate в форме, «всегда так» → правило (category-rules.md)
  • Привязки банк/карта→счёт для перехвата уведомлений на сервере (GET/PUT /user/notification-intercept/bindings) — переживают переустановку APK

Исправлено

  • После переустановки «Синхронизировать» больше не проигрывает всю ленту transaction-changes с since_id=0: warm — watermark/seek; heavy-warm отложен (ui-api-cache.md)
  • SMS банков из «Сообщения» (com.android.mms и OEM) снова попадают в черновики
  • Кнопки «Создать операцию» / «Создать перевод» в карточке черновика — на всю ширину ряда
  • После create/update/delete операции или перевода балансы и списки на открытых экранах обновляются сразу (touchLedgerAfterTransactionMutation + afterOnlineWrite)
  • При выходе из профиля больше нет toast «Требуется авторизация» (и дублей)
  • Сетевые ошибки native/OkHttp (Host unreachable и др.) → человекочитаемое сообщение, не сырой английский текст

Web

Добавлено

  • /stats: графики Chart.js (нетто line, доходы/расходы bar, donut по категориям) + блок нетто-капитала (ui-stats.md)
  • Правила категорий (/category-rules) и очередь «Разобрать» (/transactions/inbox, badge при inbox_count > 0) (category-rules.md)
  • После логина возврат на исходный URL (?next=), а не всегда на главную
  • Редирект /subscriptions/{id} → /subscriptions?edit= (ссылки из Telegram/MAX)

Исправлено

  • После локальной мутации операции/перевода — soft-reload открытых экранов; in-flight GET при смене cacheEpoch не заливает stale (ui-api-cache.md)
  • При выходе — без toast «Требуется авторизация» (toast.fromError глотает 401; logout не soft-reload’ит экраны)
  • Бюджет следующего месяца: удаление строки больше не воскресает из-за copy_forward прошлого месяца

Server

Добавлено

  • GET /api/v1/stats/net-worth — снимок и ряд нетто-капитала по месяцам
  • GET/POST/PUT/DELETE /api/v1/category-rules, PUT .../order, POST .../evaluate; GET /transactions/inbox, /transactions/inbox/count; silent apply категории при create, если ровно одно text-правило
  • GET/PUT /api/v1/user/notification-intercept/bindings — банк/карта→счёт для Android-перехвата
  • Миграции 053_notification_intercept_bindings, 054_category_rules

Исправлено

  • Удаление бюджета будущего месяца: сброс copy_forward у источника, чтобы summary не создавал копию снова

Техническое


Коммиты

Changelog

  • 293496679f8ea565d0e39b4e44f987f1137f9b9e документация
  • 8e22c7a38003f80c2c050e5888347fa4ce51586d фикс английских ттекстов ошибок, и документация к следущему релизу
  • 351974f3e7adf18756e79b109caa55594674fc4e убрал сообщения об отсутствии авторизации на экране входа
  • 0f630dffd66482f2342f4522dd1f945cab8a2018 исправлена переадресация после авторизации
  • 5b357f524cca3586e2a72d55519583f38be5b491 Синхронное обновление балансов счетов на всех страницах
  • e0387fa518f3dd02cf4446f732d7f29abc3f4aaf Ссылки на подписки
  • cc452a239d4260fe9e5463693bad2c17ac474736 Баг удаления бюджета
  • fb0c64579eeed9196a1aa2f0a18f2e151741ca17 Android: СМС UI черновиков UI web
  • 08281b1f8218d78742ccfcb2adf5725dc02f4713 Правила категорий + очередь «разобрать»
  • d98ab6379426de18b4e669acf748a54025f598c0 Графики /stats и нетто-капитал
  • 9c4649987635c5eafef5a4fb257cb83057300d4e БАГ. Android: после переустановки долго синхронизируется и тормозит
  • 7368d090e675d77914e7e171695cfb51a1bafd52 Не сохраняются настройки банковских карт

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.8.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.8.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.8.0

Android

Вложения buhgalter-android-1.8.0.apk (universal) и buhgalter-android-1.8.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.7.1 (02.10.2026)

[v1.7.1] — 2026-10-02

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет.

Android

Исправлено

  • Офлайн и сетевые ошибки: единое человекочитаемое сообщение вместо сырого текста (HTTP-код, URL запроса)
  • После отпечатка / PIN приложение реже само сворачивается; меньше задержек главной и бокового меню сразу после разблокировки (android-client-platform.md)

Web

Изменено

  • Плановый остаток на главной: подпись учитывает запланированные платежи по кредитам текущего месяца (вместе с подписками и периодическими)

Исправлено

  • При живом WebSocket главная могла показывать устаревшие балансы (0.00), а страница счёта — актуальные: сброс ledger-кеша на первом onopen, обогащение /accounts* из dashboard, hint_paths для переводов (ui-api-cache.md)
  • Сразу после создания операции главная, счета и список могли расходиться до истечения TTL: эпоха серверного GET-кеша и клиентского ref-cache — in-flight GET после clearRefCache не записывает stale-снимок

Server

Исправлено

  • ExternalAccess: localhost / 127.0.0.1 / ::1 в Host не обходят проверку с удалённого IP; X-Forwarded-Host не используется (install/nginx.md)
  • Бан пользователя удаляет API-токены, не только сессии (api/user-status.md)
  • Битый expires_at API-токена — истёкший (fail-closed); смена пароля отзывает чужие сессии (api/authentication.md)
  • forecast_balance: просроченная подписка прошлого месяца не суммируется со списанием текущего
  • Архивация/удаление cash/bank: остаток и статус в одной транзакции (accounts-archive-delete.md)
  • Create/Update/Transfer операций: запись, теги и current_balance атомарно
  • Платёж на кредитную карту: проверка лимита под блокировкой строки счёта
  • Подписки/периодика: списание и сдвиг next_run в одной транзакции (нет двойного списания при ошибке Mark)
  • Восстановление графика кредита с учётом credit_kind; paid_amount не выше тела кредита (data-model.md)
  • Импорт: done после успешной записи статуса; Idempotency-Key без гонки дубля (import/cubux.md)
  • Restore БД: .bak не удаляется до успешного Reopen; Manager.Reopen не закрывает живой handle при ошибке Open
  • Scheduler: lastRun только после успешного ApplyDue
  • Notify: dedup только sent; worker не активирует future при выключенных плановых уведомлениях (notifications.md)
  • Долги и каталоги (merchant/tag/шаблоны): несмапленная ошибка → 500, не 200/201 с пустым JSON
  • Бюджет: auto-copy на GET без 500 при UNIQUE-гонке; budget + budget_period в одной транзакции
  • PUT /accounts/{id}: некорректные суммы автопополнения → 400, не тихий 0

Изменено

  • apicache: инвалидация GET-кеша и realtime invalidate только после успешных мутаций (2xx), не после 4xx/5xx (ui-api-cache.md)
  • GET-кеш: эпоха (SetIfEpoch) — ответ GET, начатый до мутации, не попадает в кеш после инвалидации

Техническое

  • docs/release-notes-v1.7.1.md
  • OpenAPI 1.7.1; версия сборки 1.7.1
  • Release workflow: goreleaser ждёт android-apk и docker; на теге v* не гоняется повторный полный CI (ci.yml + job test в release.yml)

Коммиты

Changelog

  • f48fa95c625d87958d07130c7003ae444c6eeec8 github actions
  • de9d552be12a27b17ed44178987b2771d5ce2724 Документация
  • 846fce0939406a3192c6c3c85f17423eb60863ff Исправление автопополнения
  • 76b4392437754981cdc5decebbb1fbc82c6c38ab Исправления кеша
  • 87d609d88d36ce9948397f5b1b45ad6558fc29e4 Правки по бюджету
  • 7899e034200d50aafea176acafe314c46547b16a Обработка ошибок
  • b9e5d3e6b56897b11423578348139e928bc5dc6c Документация
  • 0f532d9a36dee0766db986ed897f09d8e5526741 БАГ. Android: после отпечатка приложение часто само сворачивается; главная и меню (drawer) тормозят на несколько секунд.
  • 11c73b0feabc14f6af80d7fce9dde29f74233edf Исправления по уведомлениям
  • e22d65efdddfec6b1a7af3cf250a01e5335486d6 Исправление работы планировщика
  • bcb8b93a1d1b2287f1a7777178fde2025ba4c44f БАГ. Android: в офлайне вместо «Сервер недоступен» показывается сырой текст ошибки
  • 776b3a25d0992cc0024f9c107c540d27d3a86703 Сервер: Manager.Reopen при ошибке Open не закрывает живой handle
  • d1715f69153297f7bfca75e88238c1cee0a75922 Сервер: restore БД не удаляет *.bak, пока Reopen не успел; при ошибке открытия откат на прежний файл
  • 3c1df7abf619591eccc3957205f7f8057930c7fb правки импорта
  • f3380bd3dac6b1a9f97320f8b068a674ad74a748 Сервер: credits.paid_amount не превышает тело кредита при автосписании и платеже
  • 656e2d76c73879e714450bfdeb68db4531401928 Исправления платежей по подпискам и кредитам
  • 4a129c5e947161d135db47405833aa640241fb7c Сервер: платёж на кредитку проверяет лимит под блокировкой строки счёта
  • 41c9e40e535cab83beb414926687fb7419e5d1d1 БАГ. Сразу после создания операции главная/счета/список расходились (баланс и сама операция), через ~минуту сходились.
  • 214e56a1f9c6d7cc9106e7b334436cb0cbcffb7e Сервер: Create/Update/Transfer пишут операцию, теги и current_balance в одной транзакции
  • 642be029e53e1ebdb73a8971a274510fce31ce41 Сервер: архивация/удаление cash/bank переводит остаток и меняет статус в одной транзакции
  • ba608d999efa4d3cf3e147d11307a14ff6703b7a Сервер: смена пароля отзывает чужие сессии (текущая сохраняется; через API-токен — все сессии)
  • 012ccfc33278dcb9dc398db782ece1ae4a0bc909 Сервер: битый expires_at у API-токена считается истёкшим (fail-closed), а не бессрочным
  • 75867b2ede64541296708463f0375358280a2dd9 UI: В балансе отображать ещё с учётом кредитов в текущем месяце
  • 39a2771a2197641fdc136c71ac4aa25137d09238 Сервер: бан пользователя удаляет не только сессии, но и API-токены
  • d578b7501f245e8456e2f758889ee4fb2a561d63 Сервер: ExternalAccess не доверяет X-Forwarded-Host; host берётся из Host (как ставит nginx)
  • 07f2df085784b7eeef232a17d867cc3e6e4fa7f6 Сервер: Host localhost / 127.0.0.1 / ::1 не обходит ExternalAccess, если клиент не loopback
  • e5f41baaa794ea6510b7de8c9c22135a3320f35e web: отображение балансов разнилось между главной и страницей счёта
  • 085abecfa58cfb08cdbc301a82de29187876cb26 исправления в github-actions

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.7.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.7.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.7.1

Android

Вложения buhgalter-android-1.7.1.apk (universal) и buhgalter-android-1.7.1-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.7.0 (28.09.2026)

[v1.7.0] — 2026-09-28

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет.

Android

Исправлено

  • Попап «Версии» мог бесконечно показывать старую версию сервера: GET /version/check попадал в SWR ref-cache, а суточный throttle фиксировал stale-ответ; путь исключён из кеша, клик по версии в drawer форсирует сеть
  • У уже привязанной к подписке операции в меню строки больше нет «Сделать подпиской» / «Прикрепить к подписке»
  • SMS банка в шторке «Сообщения» (заголовок вроде «Ваш Т-Банк») снова попадают в историю и черновики: разбор MessagingStyle (EXTRA_MESSAGES), Unicode-дефисы в имени отправителя, больше OEM-пакетов SMS-приложений

Web

Добавлено

  • Живые обновления по WebSocket (GET /api/v1/realtime): другая вкладка, телефон и фоновые джобы сервера сразу отражаются на открытом экране без F5
  • Прогресс импорта по сокету (import.progress / done / failed); poll 1,2 с остаётся запасным вариантом
  • Точечный invalidate с hint_paths / entities — refetch только затронутых API-путей, не всего экрана
  • Главная: если у общего баланса нет прогноза (total_forecast совпадает с балансом) — под суммой текст «Нет ближайших подписок и периодических»

Изменено

  • При живом сокете фоновый SWR-revalidate на каждый GET выключен; без сокета — cooldown 60 с, скрытая вкладка не revalidate
  • После reconnect — догон GET /sync/transaction-changes и soft-reload открытого экрана
  • После мутации — полный сброс клиентского ref-cache (не preserveAuthMe): следующий load() идёт в сеть

Исправлено

  • Импорт: import.done обрабатывается синхронно из WebSocket onmessage (subscribeImportRealtime), до кадра invalidate; иначе $effect опаздывал и UI не показывал «Импорт завершён». Poll остаётся запасным путём
  • У уже привязанной к подписке операции в меню строки больше нет «Сделать подпиской» / «Прикрепить к подписке»
  • После создания операции список счетов мог показывать балансы 0.00: seed из ui/meta без балансов попадал в SWR при живом WebSocket (revalidate выключен). Seed /accounts* из meta отключён; мутации полностью сбрасывают ref-cache

Техническое

  • GET /version/check исключён из клиентского ref-cache (как в документации)
  • E2E: две вкладки — операция в одной, баланс во второй без F5

Server

Добавлено

  • GET /api/v1/realtime — WebSocket-хаб по user_id; события invalidate после мутаций, import job и scheduler
  • Документация nginx: Upgrade / Connection и длинный proxy_read_timeout для /api/v1/realtime (install/nginx.md, docker/nginx.conf.example)

Исправлено

  • Привязка операции к подписке закрывает ближайший платёж в очереди (upcoming_run_ats), если дата операции попадает в его окно — раннее списание банка больше не оставляет «ещё одно списание завтра»

Техническое

  • docs/release-notes-v1.7.0.md
  • Версия 1.7.0 (новых миграций БД нет)
  • Android в этом релизе без сокета: SWR cooldown ~1 мин, как раньше

Коммиты

Changelog

  • 303e92ad335ac8ed67c918098a4a98b04a627dd8 тесты
  • d81c570457476e4236b3b11f0ebcdd630779269b документация
  • 2e9297c00cb657f7b267d18ad7896083ec565e82 тесты
  • 24d801611b2a33c9cb080b6d2e9c7aea474b32f7 привязка платежа к подписке
  • 10b55da728a3914ddb02c39251f427468ddf2ec6 правки перехвата СМС сообщений
  • 11d8505812f250742115c0a282a0504cca609569 баг с подписочными операциями, в меню есть опции прикрепления к другой подписке
  • 23296340ad18d63c31aada72cfc035ae3c230243 исправление проверки версии в Android
  • 8d38fc22e136afd6ff1f03cd44a38be04cab9103 UI главной страницы
  • 6c34b31daac199589670aa646549cb75598ed2bf доработки WebSocket
  • 7efdc93e4f591e33995d1134e6ed442eae0b29ef доработки WebSocket
  • 8452ce034587745b26ce4c4c61ddcb3a3b798777 web: websocket

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.7.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.7.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.7.0

Android

Вложения buhgalter-android-1.7.0.apk (universal) и buhgalter-android-1.7.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.6.0 (25.09.2026)

[v1.6.0] — 2026-09-25

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет (при старте сервера выравнивается категория у уже привязанных платежей по кредиту).

Android

Добавлено

  • Привязка расхода к оплате кредита: в форме категория «Кредиты» (вместо подкатегорий — список активных кредитов) и «Сделать платежом по кредиту» из журнала
  • Quick-actions в шторке для черновиков из перехвата: Принять / Отклонить без открытия приложения; тумблер «Уведомления в шторке» в настройках банковских уведомлений
  • История уведомлений: «Создать операцию» или «Создать перевод» (уникальная пара) по распарсенной строке — без повторного ввода суммы
  • Каталог банков: ВБРР (привязка счёта + перехват push/SMS)

Изменено

  • Черновики из уведомлений: без чекбоксов и массового выбора. У карточки перевода кнопка «Удалить», как у остальных черновиков
  • Форма платежа по кредиту: при категории «Кредиты» скрыты магазин, теги и описание; время сразу под датой (без спойлера)

Исправлено

  • Счётчик «Последние операции» больше не раздувается лентой синхронизации: входящая нога перевода и операции старше страницы не прибавляются к meta.total
  • Выпадающие списки (подкатегории и остальные): направление вниз по умолчанию, вверх только если у низа экрана нет места; после открытия положение не прыгает при скролле
  • Системная клавиатура больше не всплывает поверх своей цифровой при возврате из другого приложения

Web

Добавлено

  • Привязка расхода к оплате кредита: в форме категория «Кредиты» (вместо подкатегорий — список активных кредитов) и «Сделать платежом по кредиту» из журнала

Изменено

  • Форма платежа по кредиту: при категории «Кредиты» скрыты магазин, теги и описание; время сразу под датой (без спойлера)

Исправлено

  • Счётчик операций на главной и в «Все операции» совпадает с числом в импорте: перевод — одна операция, комиссия в счётчик не входит

Server

Добавлено

  • POST /credits/{id}/payments: опциональный transaction_id — привязать существующий расход к ближайшему платежу графика; при старте — выравнивание категории «Кредиты» у уже связанных платежей
  • Каталог банков: ВБРР

Исправлено

  • GET /transactions meta.total: перевод считается один раз (без фильтра счёта — исходящая нога; на странице счёта — нога этого счёта), комиссия перевода не считается отдельно. list_rows импорта равен valid_rows

Техническое

  • make act-keep-image / make act-prune — label + keeper-контейнер, чтобы prune не сносил образ act
  • docs/release-notes-v1.6.0.md
  • Версия 1.6.0 (новых миграций БД нет)

Коммиты

Changelog

  • f2394177c3231f32e645a835cfb6b37c26a252ff документация
  • 73024c09e6437604c78832b2c55047cd346eaf22 доработки UI по добавлению операции "Кредиты", правки тестов
  • 758a5e7389c6247d2657015fc86c5328687a179a исправление тестов
  • 93f85b060a2e0fd432ed9db08fb73af55136347b Добавлен банк ВББР
  • 6b4feb7e7ca14741439bb730389ce8d6f12438d6 UI баги выпадающих списков и встроенной клавиатуры
  • 97e414b7d15492649d7caba6cfc059f138812929 Android: история уведомлений - кнопки создания операций
  • 2cda9555d8e8911eb7a8576baa60ad9506555172 Привязать операцию к оплате кредита
  • cee3a03add1fce8f5e8dfa7933da5411c9daf16c Android: quick-actions
  • 60277b209c1d773e6d2fcf6378a2cc0a0110482f makefile fixes
  • 8f1aea0821910761955053ce8aeae6106588f4f3 правки в черновиках UI
  • 40f511b5528fdc389b2557a32e6aaf238447c484 Баг счётчика операций

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.6.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.6.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.6.0

Android

Вложения buhgalter-android-1.6.0.apk (universal) и buhgalter-android-1.6.0-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.5.5 (22.09.2026)

[v1.5.5] — 2026-09-22

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет.

Android

Исправлено

  • Черновики перехвата: уникальная пара списание+пополнение — одна карточка «Возможный перевод», а не три
  • Кнопка «Создать перевод» снова выглядит как кнопка (btn-primary); действия на карточке в сетке, без кривой вёрстки
  • Счётчик в меню и баннер на главной: пара считается как одна карточка
  • Создание и удаление черновика больше не зависают (справочники счетов в фоне; форма перевода без бесконечного $effect)

Server

Техническое


Коммиты

Changelog

  • ad51abb884ae404979aac56ef59503c190483fc1 баги android, с черновиками

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.5. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.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.5.5

Android

Вложения buhgalter-android-1.5.5.apk (universal) и buhgalter-android-1.5.5-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: v1.5.4 (22.09.2026)

[v1.5.4] — 2026-09-22

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/. Новых миграций БД нет.

Android

Добавлено

  • Импорт/экспорт Бухгалтер: полный перенос учёта между серверами (счета, справочники, операции, кредиты, долги, подписки); Cubux — только операции
  • Профиль: кнопка «Удалить данные» — сброс учёта к состоянию нового пользователя (логин и профиль сохраняются)
  • Перехват уведомлений платёжных приложений (MIR Pay, Samsung Pay, СБПэй, Google Wallet, Huawei Wallet, Mi Pay, ЮMoney) — тот же пайплайн черновиков, что у банков; счёт по last4 / банку в тексте
  • Из черновиков перехвата — перевод между счетами (пара расход + пополнение, одна сумма)

Изменено

  • Превью импорта показывает, сколько записей будет в журнале: перевод в файле — одна строка, в журнале — две

Исправлено

  • Фоновый импорт: экран прогресса не сбрасывается из‑за кратковременной блокировки SQLite; кеш не сбрасывается в момент постановки job
  • Возврат на импорт сразу показывает сохранённый прогресс (снимок job в localStorage), не ждёт загрузки справочников
  • Экспорт «Бухгалтер» выгружает все операции, а не период «с 2025 до сегодня»

Web

Добавлено

  • Импорт/экспорт Бухгалтер: полный перенос учёта между серверами (счета, справочники, операции, кредиты, долги, подписки); Cubux — только операции
  • Профиль: кнопка «Удалить данные» — сброс учёта к состоянию нового пользователя (логин и профиль сохраняются)

Изменено

  • Превью импорта показывает, сколько записей будет в журнале: перевод в файле — одна строка, в журнале — две

Исправлено

  • Фоновый импорт: экран прогресса не сбрасывается из‑за кратковременной блокировки SQLite; кеш не сбрасывается в момент постановки job
  • Возврат на импорт сразу показывает сохранённый прогресс (снимок job в localStorage), не ждёт загрузки справочников
  • Экспорт «Бухгалтер» выгружает все операции, а не период «с 2025 до сегодня»

Server

Добавлено

  • Нативный импорт/экспорт preset=buhgalter / format=buhgalter: секционный CSV (#BUHGALTER,1) — профиль (часовой пояс, валюта, язык), счета (тип, банк, лимит, начальный остаток, автопополнение), операции (время, магазин, теги, комиссия, ID), справочники, кредиты с графиком, долги, подписки, периодические, бюджеты, шаблоны
  • DELETE /api/v1/user/data — сброс учёта пользователя (операции, счета, долги, кредиты и остальное; категории по умолчанию)
  • Превью/отчёт импорта: transfer_rows и list_rows (valid_rows + вторая нога каждого перевода) — сколько записей будет в журнале

Исправлено

  • Импорт экспорта с другого сервера больше не падает с system category is read-only: системные категории не получают новые подкатегории
  • Импорт не схлопывает разные операции с одной датой/суммой/счётом/категорией и не пропускает одинаковые строки внутри файла; балансы после переноса (в т.ч. кредитных карт) совпадают за счёт initial_balance в нативном CSV
  • Секционный CSV #BUHGALTER больше не разбирается как обычный Cubux: служебные секции не считаются операциями без даты
  • GET /export?format=buhgalter игнорирует from/to/account_id/category_id — в файл попадают все операции, включая будущие
  • Плановый остаток подписки не дублирует списание, если следующая дата в upcoming_run_ats уже в следующем месяце (расхождение «с учётом подписок» после импорта на пользователя с другим поясом)
  • Фоновый импорт: подкатегории грузятся одним запросом; POST /import/jobs не сбрасывает API-кеш до завершения job; GET /import/jobs/{id} при блокировке SQLite отвечает 503

Техническое

  • OpenAPI 1.5.4: DELETE /user/data, экспорт format=buhgalter, импорт preset=buhgalter, ImportReport transfer_rows / list_rows
  • CI: экшены GitHub Actions на Node 24 (checkout@v7, setup-node@v7 и остальные); Node.js для сборки UI по-прежнему 22
  • docs/release-notes-v1.5.4.md
  • Версия 1.5.4

Коммиты

Changelog

  • 012e91887d0a9a46ccb8c1cf2ba3e7ccac97b1bb документация по v1.5.4
  • a4e4bc2c3917073ef5fef4ceaf38a1d8625fcddf node version requirements
  • acc87cfec85657cd69fddcd04aa0a35a868b9635 Android: из черновиков перехвата — перевод между счетами
  • 6dcabdb90b5a527013e12b4f1ff850f0a0cf7521 Android: перехват уведомлений платёжных приложений
  • 38cccafd093f1b20091a6f2d76dca3b28f6f10f7 Фиксы иморта/экспорта
  • 04e45b010cf7b396841167d38e7bf6d4f890d690 Удаление данных пользлвателя" в профиле
  • 3d5d2371280e5d1a56f3deae2a0fa36972e3b0cd Правки импорта

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.5.4. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.5.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.5.4

Android

Вложения buhgalter-android-1.5.4.apk (universal) и buhgalter-android-1.5.4-{abi}.apk (arm64-v8a, armeabi-v7a, x86_64). Минимальная версия Android — 8.0 (API 26). Установка поверх предыдущей версии сохраняет данные приложения (URL сервера, токен в secure storage).

Релиз: 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 для подкатегории и магазина с созданием по имени
  • На главной шаблоны и бюджет — в сворачиваемых секциях

Техническое


Коммиты

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, не только перефильтровка списка

Техническое


Коммиты

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).

🧾 Последние коммиты
Коммит: dbbc445 (05.11.2026)
исправил отображение ошибок в интерфейсе
Автор: Maksim Kovalyov
Коммит: 1d8e81e (04.11.2026)
Пополнение кредитной карты сверх лимита
Автор: Maksim Kovalyov
Коммит: 30b5a60 (04.11.2026)
Исправлен баг с черновиками уведомлений
Автор: Maksim Kovalyov
Коммит: d4ebf1a (01.11.2026)
документация
Автор: Maksim Kovalyov
Коммит: 5755f1e (01.11.2026)
Улучшение UI (Web + Android)
Автор: Maksim Kovalyov
Коммит: 555d8f9 (01.11.2026)
Баг парсера даты в бейджах. Раздел "кредиты"
Автор: Maksim Kovalyov
Коммит: fd7b2ac (01.11.2026)
Исправил баги в сканере чеков
Автор: Maksim Kovalyov
Коммит: ba63ecd (01.11.2026)
Исправления в парсере уведомлений
Автор: Maksim Kovalyov
Коммит: e11394e (01.11.2026)
Добавлена поддержка уведомлений от нового приложения WB-банка
Автор: Maksim Kovalyov
Коммит: 18af10c (31.10.2026)
документация
Автор: Maksim Kovalyov