Inspiration

Every shared trip, flatshare, or group dinner ends the same way: someone opens a note on their phone, lists who paid for what, and the group chat fills up with "wait, what did you have?" and "can you send me your IBAN again?". Existing split-expense apps handle the math, but they stop exactly where the real friction begins, the payment itself. You still have to copy an IBAN, type an amount, and hope you did not mistype a digit. We looked at this and asked a different question: what if the split expense app was not an app at all, but a feature of your bank? The math becomes trivial, and the payment becomes a single scan. That is TatraGether.

What it does

TatraGether lets groups track shared expenses and settle them through any Slovak bank using Pay By Square, Slovakia's universal QR payment standard.

The core flows:

  • Group creation with one-link invites, no app store required
  • Receipt scanning via eKasa QR codes (instant, structured data from Slovak fiscal receipts) with AI vision as a fallback for non-eKasa receipts
  • Per-item splitting - assign individual line items from a receipt to specific members, or split them equally
  • Automatic balance calculation using a minimum cash flow algorithm, so a group of five with fifteen transactions resolves into the fewest possible transfers
  • Pay By Square QR settlement - the person who owes opens their banking app, scans, and the transfer is pre-filled with the correct amount and IBAN
  • Recurring expenses for rent, utilities, and subscriptions
  • Complete history of every expense, settlement, and change

How we built it

Stack. Next.js 16 with the App Router for the frontend, TypeScript, Tailwind and shadcn/ui for the design system, Drizzle ORM on Postgres for data, and Better Auth for authentication. Deployed on Hetzner VPS with Coolify. Receipt intelligence. The scanning pipeline is two-tiered. We first attempt to read the eKasa QR code from the receipt using jsqr, this gives us structured, verified data directly from the Slovak Financial Administration, including itemized amounts. If no eKasa QR is detected or the receipt predates eKasa, we fall back to Google's Gemini vision models (via @langchain/google-genai) to extract line items, prices, and totals from the raw image. The user sees a single "scan receipt" button; all of this complexity is invisible. Payment generation. We use the bysquare library to encode payment data into the Pay By Square format, Slovakia's national QR payment standard accepted by every Slovak bank. The amount, IBAN, variable symbol, and payment note are embedded in the QR code, so the payer opens their banking app, scans, and confirms.

AI item recognition uses Gemini 2.5 Flash for its balance of cost, latency, and vision capability. LangChain + LangGraph orchestrate the fallback logic and structured output parsing with Zod schemas.

Challenges we ran into

  • Pay By Square edge cases. The format has strict character-set rules for payment notes (no diacritics in certain fields, length limits on the variable symbol). Debugging a QR that "scans" but fails silently in the banking app
  • Our first idea was a shared wallet, one pooled account that the whole group funds and spends from together. It sounded clean, but the more we dug in, the more it fell apart. A shared wallet means we hold people's money, which means licensing and regulations. It also only works when everyone trusts everyone equally, which is fine for couples but breaks down the moment you have six people on a ski trip. And it needs everyone to pre-fund the pool before the app is even useful, which nobody does. People reach for a split app after someone has already paid, not before. Most importantly, it solves the wrong problem: the real pain is not "we need a shared pot of money", it is "I paid, I want my money back without hassle". So we pivoted. We track who owes what, and when someone wants to pay, we generate a Pay By Square QR that moves money directly between personal bank accounts. We never touch it. That single decision unlocked everything else- no regulator, and every Slovak bank works out of the box.

Accomplishments we are proud of

  • A receipt-to-expense flow that takes under ten seconds
  • Dual-layer receipt intelligence (eKasa -> Gemini)
  • Pay By Square integration that works with every Slovak bank out of the box
  • Real-time live balance updates across group members
  • Shipped a polished, mobile-first web app in 24 hours

What we learned

Slovakia has some really good public fintech infrastructure (eKasa, Pay By Square) that might be underused in consumer products. Gemini's vision models handle Slovak receipts with good accuracy when given a well-structured prompt and output schema, better than we expected.

What's next

  • Add custom tags/labels
  • User research and improvement of UX
  • Push notifications about expenses
  • Discord/Whatsapp/Telegram integration - add a bot tracking expenses to your group chat
  • Native mobile app

Built With

Share this project:

Updates