← All projects
Sole engineer & architect — AI pipeline, GraphQL backend, Telegram bot and mobile app2026

Daftarcha

An AI voice-bookkeeping platform that turns spoken Uzbek/Russian market chatter into structured accounting entries — across a NestJS GraphQL backend, a Telegram bot, and an Expo iOS/Android app.

~43,000Lines of TypeScript
241Git commits
4AI pipeline stages
3Deployable apps
UZS/USD/RUB/KRWCurrencies

The problem

Traders and everyday users in Uzbekistan track sales, debts and expenses in their heads or on paper because typing each transaction is too slow during a busy market day — and existing tools do not understand spoken Uzbek/Russian, where Whisper is unsupported and routinely mishears number words and local names. The result is lost records and no real financial picture.

The solution

A voice-first system: the user just speaks, and a four-stage AI pipeline (hybrid Uzbek-optimized STT with OpenAI fallback, Claude transcript correction, Claude structured parsing with user context, and deterministic price-sanity validation) converts the utterance into typed, confidence-scored transactions. A confirmation gate surfaces low-confidence entries, per-currency checks prevent impossible spends, and capture happens through whichever surface is fastest — a Telegram bot or a native app — over a centralised NestJS GraphQL backend.

Overview

Daftarcha is a voice-first bookkeeping product for Uzbek bazaar traders and everyday users who track money by talking, not typing. A user records a voice note and the system transcribes it, parses it into typed transactions (sale, debt, purchase, expense, income, balance top-up, currency exchange), validates them against the running balance, and persists them — in seconds. It ships as three coordinated surfaces over one TypeScript codebase: a Telegram bot for instant capture, a polished Expo app for full management, and a NestJS GraphQL/REST backend that owns all logic.

The technical heart is a four-stage AI voice pipeline engineered around the failure modes of Uzbek speech recognition — a language Whisper does not officially support. Stage 1 is hybrid speech-to-text: it prefers an Uzbek-optimized engine and falls back to OpenAI gpt-4o-transcribe with mode-aware prompts that spell out spoken Uzbek number words and trader names. Stage 2 uses Claude to repair known transcription artifacts. Stage 3 sends the cleaned transcript plus the user context to Claude for structured JSON extraction with per-item confidence. Stage 4 is a deterministic price-sanity layer that cross-checks parsed prices against real UZS ranges and gates suspicious entries behind a confirmation step. Balance math runs per-currency (UZS/USD/RUB/KRW).

The backend is a NestJS monorepo of three deployable apps (API, Telegram bot, batch worker) sharing a typed domain library, with a code-first GraphQL schema, JWT auth, admin tooling, and a multi-tenant Shop mode where a Boss invites Workers via expiring codes and QR deep links and sees an audited activity feed gated by a subscription lifecycle. The Expo client is feature-first with Apollo, Zustand, MMKV/SecureStore, react-hook-form + zod, Uzbek/Russian i18n, and a custom native iOS Live Activity Swift module. Across ~43,000 lines of TypeScript and 241 commits, it is a production-shaped, AI-powered fintech product owned end to end.

Key features

  • Four-stage AI voice pipeline: hybrid Uzbek/OpenAI STT, Claude transcript correction, context-aware structured parsing, and a deterministic price-sanity gate
  • Mode-aware prompting that spells out spoken Uzbek number words and trader names to fix systematic mis-transcription, with confidence driving a confirm-before-save flow
  • Multi-transaction batch parsing from one utterance with per-currency (UZS/USD/RUB/KRW) running-balance validation and partial-save
  • Rich transaction domain: sales, purchases, expenses, income, two-directional debt tracking, top-ups, and atomic two-legged currency exchange
  • Multi-tenant Shop mode: a Boss invites Workers via expiring 6-char codes and QR deep links, with an audited activity feed and a subscription lifecycle swept hourly by a cron
  • Telegram bot capture with inline confirm/reject keyboards over a thin client that never touches the database directly
  • Expo iOS/Android app with Apollo + Zustand + MMKV/SecureStore, react-hook-form/zod, Uzbek/Russian i18n, and a custom native Swift Live Activity module
  • Admin platform: stats, broadcasts, CSV export, voice-log inspection and an audit-log interceptor over JWT auth
  • Three deployable NestJS apps (API, Telegram bot, batch worker) sharing one typed domain library, behind Nginx + PM2

Tech stack

NestJSTypeScriptGraphQL (Apollo)MongoDBOpenAI (gpt-4o-transcribe)Anthropic ClaudeUzbekVoiceAI STTTelegrafReact Native (Expo)Apollo ClientZustandMMKVSwift (Live Activity)JWTNginx + PM2DigitalOcean