• Telegram bot
  • AWS
  • Live

AnySplit

Split a restaurant bill from a photo of the receipt. Claude reads the items, you assign them in a Telegram Mini App, and everyone gets their own total.

Built for Singapore, where a receipt might stack ten percent service charge and then nine percent GST, or have neither. Both are read off the receipt rather than configured.

On the deskThe phone & receipt

Demo

See it in 25 seconds

Photo in, exact split out.

Twenty-five seconds: photograph the receipt, tap who had what, send everyone their exact share.

Flow

How it works

  1. Photograph the receipt

    One person sends a photo to the bot in Telegram. Nobody installs anything and nobody makes an account.

  2. It replies before Telegram gives up

    Telegram redelivers a webhook it has not heard back from in about five seconds, and a vision call takes far longer than that. So the first function only validates, saves, and queues, then answers straight away. The slow work happens behind the queue.

  3. Claude reads the line items

    The image is cropped to the receipt and streamed into a Claude vision call that must answer in a fixed structure. Two independent checks then confirm the items reconcile against the printed subtotal.

  4. You assign items in the Mini App

    A four-screen web app opens inside Telegram: review what was read, list who is splitting, tap people onto items, and preview the totals. The model proposes, you confirm, and every field is editable.

  5. Everyone gets their own total

    Service charge and GST are folded in proportionally, rounded to whole cents, with the last cent given to the largest share so the totals add up to exactly what was paid. The result arrives as one forwardable message per person or a single message for the group.

Privacy

It forgets on purpose

The promise that AnySplit does not keep your receipts is enforced by the shape of the system, so it cannot quietly stop being true.

  • Photos are never stored

    The image is streamed from Telegram straight into the vision call. It never touches a disk or a bucket.

  • Bills expire on their own

    Every record carries a 24-hour time to live, re-checked on read so a slow sweep cannot serve a stale bill.

  • Identities are hashed

    User IDs are never stored raw. Usage is a count, not a history: no roster of who eats with whom, nothing to mine.

Stack

Under the hood

Runtime
Three Lambda functions on arm64: webhook and REST API, queue consumer for the vision call, and a daily usage digest
Data
One DynamoDB table with time-to-live, and a queue with a dead-letter queue between the fast path and the slow one
Front end
React and Vite, built static, served from a private bucket through CloudFront with origin access control
Secrets
Bot token and keys in Parameter Store. No model API key exists in the deployment: the parser federates its own IAM role for a short-lived token
Delivery
Terraform for everything, deployed from GitHub Actions through OIDC. No cloud keys in the repository
Cost
Roughly one to three dollars a month of AWS, mostly inside the free tier, plus the vision calls

Try it

Split your next bill

Or read how it is built.