Work · 2026 · In production
7asebly
Settle a night out from Arabic receipts and Masri voice notes.
- 7asebly.aabdoo23.dev
- Private repository
- Product design · Backend · Frontend · Infrastructure

المشكلةThe problem
Three to eight friends, four venues, different people paying different thermal-paper receipts in Arabic and Franco, at night, on one phone with one thumb. The job is getting from "we went to four places" to "here is exactly who owes whom" without anyone opening a calculator or asking twice.
البناءThe build
A FastAPI backend on async SQLAlchemy with Celery for the slow work, and a React PWA that defaults to Arabic and right-to-left, with English as the second locale. Receipts are photographed and read by Gemini; expenses can be spoken in Masri and transcribed; service and VAT compound the way Egyptian bills actually do; settlement computes the minimum set of transfers and hands each person an InstaPay address. The palette is receipt paper by day and the night outside the restaurant by dark, generated in OKLCH and checked to WCAG 2.2 AA.
التشغيلHow it runs
Its own Compose stack that shares Postgres, Redis and MinIO with Warshagy over one isolated network: a separate database and role, separate Redis indices, a bucket-scoped storage user. WhatsApp one-time codes come from a sidecar. Strict mypy, ruff, pytest and vitest gate a deploy that runs on every push.
System · النظام
How 7asebly is put together
281 files in 50 folders, without dependencies or vendored code. Python 49% · TypeScript 38% · Docker 2%. The repository is private; the structure stays that way.
- the product's own code
- services it runs
- data
- outside providers
One request · رحلة طلب
A receipt at one in the morning
Step by step through the system above. The tags name the parts each step touches.
Capture
The organiser photographs the thermal receipt. The PWA uploads it through the API into MinIO and shows the expense as pending, so the table can move on.
- React PWA
- API
- MinIO
Read
A worker sends the image to Gemini and gets structured data back: line items, totals, and any service or VAT printed on the slip. A voice note goes through speech to text the same way.
- Celery worker
- Gemini
- Speech to text
Correct
Whatever the model got wrong is fixed in seconds, one thumb, in the dark. Arabic-Indic numerals are accepted as typed, because that is what an Egyptian keyboard produces.
- React PWA
Compound
Service and VAT compound the way Egyptian bills actually do: read from the receipt where printed, defaulted where absent, always overridable.
- API
Split
Shares are assigned per person. A friend joining from the invite link sees what they owe without creating an account.
- React PWA
- API
- Postgres
Settle
When the tab closes, settlement computes the minimum set of transfers and hands each person an InstaPay address to pay. The tab ends; nothing follows anyone home.
- Celery worker
- Postgres
Decisions · قرارات
Why 7asebly is built this way
Share datastores with Warshagy over one isolated network
One Postgres, one Redis and one MinIO to operate instead of two of each. Isolation is by database and role, by Redis index, and by a bucket-scoped storage user.
CostA shared failure domain, accepted for a two-product setup.
Capture first, correct later
A half-logged expense that took three seconds is worth more than a complete one that took thirty. The receipt is the source of truth, not a form, and the model's mistakes are cheap to fix at the table.
Arabic is the source language
Copy is written in Masri and translated to English, not the other way round. Right-to-left is the first-class layout, set in Cairo, a face designed for Arabic.
Colours generated in OKLCH and contrast-checked
The six brand colours were nearly isoluminant and had no value structure of their own, so every neutral was derived. The wheat rule, a fill and never ink on paper, came out of the one contrast bug that shipped.
A tab settles, then lets go
Splitwise keeps a running ledger that treats friends as counterparties. Here a night ends when the tab closes, and balances stay neutral in colour and copy: owed and owing are directions, not verdicts.
WhatsApp codes instead of passwords
Everyone at the table has WhatsApp and nobody wants a new password at one in the morning. The sender is a sidecar container, so its session survives redeploys of the app.
Design system · نظام التصميم
How 7asebly looks
Paper and night: receipt paper by day, the petrol-blue night outside the restaurant after dark, wheat gold on both.
Palette
- Paper#FAF8EFDay ground
- Paper ink#2A2514Ink on paper
- Night#0A1620Night ground, the default
- Wheat#EAD881Primary: a fill, never ink, on paper
- Forest#177C52Settled
- Brick#721F28Owed
- Petrol#1C4661Information
Type
Plus Jakarta Sans · display and interface7asebly Aa Bb 0123
Cairo · Arabicحاسبلي أبجد هوز ٠١٢٣
Principles · design docs
- The receipt is the source of truth, not a form. Photograph or speak the expense, then fix what the model got wrong.
- Never make a friend feel like a debtor. Owed and owing are directions, not verdicts, so balances stay neutral in colour and copy.
- One thumb, one hand, at night. Every primary action sits in the bottom third of the screen; nothing tappable is under 44px.
- Arabic is the source language. Copy is written in Masri and translated to English, not the other way round.
Screens · شاشات
7asebly as it ships
Captured from the live product. Desktop frames are 1440 wide, phones 390.
