A sufra is a table set for the people you love. Sufra the app is a photo-first calorie tracker for the people at yours. Open-source, deployed to your own Cloudflare account, never phoning home.
What it does.
You photograph a meal. The model recognises the dish, names it kabsa, fattoush, mansaf rather than "rice with chicken", and returns a calorie estimate broken down per food, with the things it's unsure about written out as questions you can answer.
You can override the totals directly, or refine the estimate by telling the model what it missed (the chicken was closer to 200g, no olive oil). Days bucket on your phone's current timezone, so when you travel, "today" travels with you. Weights graph against your body, not someone else's average.
See it.
Three things, in the order you'll do them.



Who it's for.
Two people, on purpose. The Host is you. You have a Cloudflare account and an evening. You deploy once, hold the API key, and provision accounts for the people at your table. You are the support team. You eat too.
The Members are your household. They get a URL and a username. They never enter an API key, never see an admin panel. They sign in, take a photo, see a number, and put their phone down. Their mental model is "the food app", not "the LLM wrapper my partner deployed".
How it works.
- 1.0
Photograph.
Default action on opening the PWA is the camera. One prominent shutter, one secondary "pick from library". No hunting for "log meal".
- 2.0
Estimate.
The Worker calls your OpenRouter key with the photo. The prompt is tuned for Middle Eastern, Levantine, and Gulf cuisine alongside the global default. Per-food breakdown arrives in ~3–5s. Photo is only written to R2 after the model succeeds.
- 3.0
Clarify, if needed.
The estimate carries a small "Improve" affordance, coloured by the model's own confidence. Tap it and the model's uncertainties become questions: Closer to 1 cup or 1.5? Answer the ones you know. The estimate re-runs.
- 4.0
Log, or override.
Accept the number, or type your own (the AI value stays as placeholder so you can revert). Bookmark a meal to re-log it later without a photo. Move on to the rest of your day.
The stack.
One Worker, your data, no vendors with a seat at your table.
| Frontend | Vite + React 19 + TanStack Router + Tailwind v4PWA. Installable from the browser, no app store. |
|---|---|
| Backend | Hono on Cloudflare WorkersSingle Worker serves the SPA and /api/* |
| Database | Cloudflare D1 (SQLite) via DrizzleYour D1, your rows. Migrations checked in. |
| Storage | Cloudflare R2Meal photos, accessed via authenticated Worker routes. Never a public bucket. |
| Inference | OpenRouter (your key)Pick any vision model OpenRouter routes to. You pay for what your household uses, not a per-seat subscription. |
| Auth | better-auth, scrypt, no emailHost-provisioned accounts via single-use password links. No magic-link emails, no SMTP server to run. |
| License | MITFork it. Run it. Modify it. Charge your relatives nothing. |
Deploy it.
Two things you'll need: a Cloudflare account, and an OpenRouter API key. That's the whole list.
One command walks you through the rest. It provisions D1 and R2 in your account, generates a session secret, applies migrations, deploys. About 90 seconds.
$git clone https://github.com/Fawwaz-2009/sufra && cd sufra
$pnpm install
$pnpm bootstrapOpen the deployed URL. The Setup wizard runs once. Name your Sufra, pick a username and password. From there: admin → add Member → copy the password link → hand it to your household. WhatsApp, iMessage, a sticky note on the fridge. No email is ever sent because there is no email server to send it.
What isn't here.
Negative space matters. v1 ships without these on purpose.
- Social features. No streaks visible to anyone but the Member themselves.
- Telemetry, analytics, anything that phones home.
- Native iOS or Android apps. PWA only. Add to Home Screen and live there.
- Email infrastructure. Notifications. Magic links.
- Ads, surveillance, anyone monetising what your household eats.
About the name.
Sufra (سفرة) is the Arabic word for the dining table, but it means more than the furniture. A sufra is the spread of food laid out, the act of gathering, the hospitality of feeding the people you love.
The app is named after it because it exists to help you stay at the sufra: to keep showing up at the table, while staying aware of what you're eating. Middle Eastern cuisine is a first-class citizen in the food recognition, not an afterthought. You don't need to be Arab to have a sufra. Every household has a table.