SPLT case cover
Case study Кейс

SPLT

Telegram bot · shared expense tracking.

Telegram-бот · учёт совместных трат.

Open page Открыть страницу

About the project

О проекте

SPLT is a Telegram bot for couples and small groups that turns an ordinary shared chat into an automatic shared-expense ledger. People log spending in plain language right where they already talk — the bot parses it, splits it, and keeps a live balance of who owes whom.

SPLT — Telegram-бот для пар и небольших групп, который превращает обычный общий чат в автоматический учёт совместных трат. Расходы пишут обычным языком прямо там, где уже переписываются, — бот их распознаёт, делит и держит актуальный баланс «кто кому должен».

Task

Задача

Make splitting expenses effortless inside the place people already chat: no separate app to install, no forms to fill — just type a line, snap a receipt, or send a voice note, and get an accurate running balance.

Сделать разделение трат незаметным прямо в чате: без отдельного приложения и форм — просто пишешь строку, фотографируешь чек или отправляешь голосовое и получаешь точный текущий баланс.

What we did

Что сделали

We built the bot on a clean hexagonal architecture: a pure splitting engine — balances, debt simplification, integer minor-unit (kopeck-precise) rounding — is fully decoupled from the Telegram transport, so the same core can later power other clients without a rewrite.

Free-text entries run through a fast deterministic parser with an LLM fallback for tricky phrasing and word-numbers; it also understands repayments ("returned 5000") as settlements, not new expenses. Receipts are read QR-first with a vision-model fallback that lifts the total straight from a photo. Voice notes are transcribed and pushed through the very same pipeline. Access is restricted by an allowlist, and API spend is capped at the provider level.

Бот построен на чистой гексагональной архитектуре: чистый движок разделения — балансы, упрощение долгов, округление в целых копейках — полностью отделён от Telegram-слоя, поэтому то же ядро позже сможет питать другие клиенты без переписывания.

Свободный текст проходит через быстрый детерминированный парсер с LLM-фоллбэком для сложных формулировок и сумм прописью; бот также понимает возвраты («вернул 5000») как погашение долга, а не новую трату. Чеки читаются QR-first с фоллбэком на vision-модель, которая забирает итог прямо с фото. Голосовые расшифровываются и идут через тот же конвейер. Доступ ограничен allowlist'ом, а расход на API ограничен лимитами на стороне провайдеров.

Stack

Стек

  • TypeScript
  • grammY (Telegram Bot API)
  • Vercel (serverless)
  • Neon Postgres
  • Claude (Anthropic)
  • Speech-to-text
  • QR + vision OCR
  • Vitest
  • TypeScript
  • grammY (Telegram Bot API)
  • Vercel (serverless)
  • Neon Postgres
  • Claude (Anthropic)
  • Распознавание речи
  • QR + vision OCR
  • Vitest

Result

Результат

A production bot that logs an expense in seconds — from text, a receipt photo, or a voice message — auto-categorizes spending, tracks balances in real time, and produces monthly category breakdowns, all inside a single Telegram chat. The decoupled engine, covered by unit tests, is ready to be reused by a future app on a shared backend.

Продакшен-бот, который заносит трату за секунды — из текста, фото чека или голосового, — автоматически категоризирует расходы, считает баланс в реальном времени и строит помесячную разбивку по категориям, всё внутри одного Telegram-чата. Отделённый движок, покрытый юнит-тестами, готов к переиспользованию будущим приложением на общем бэкенде.