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.
Demo
See it in 25 seconds
Photo in, exact split out.
Flow
How it works
Photograph the receipt
One person sends a photo to the bot in Telegram. Nobody installs anything and nobody makes an account.
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.
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.
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.
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.

