Work · 2026 · In production

حاسبلي

7asebly

Settle a night out from Arabic receipts and Masri voice notes.

This case study wears 7asebly's own colours
7asebly sign-in on a laptop
Sign in with a WhatsApp codeDesktop · 1440

المشكلة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.

7asebly's stackShared with WarshagyA phone, at the tableinstalled as a PWAA phone, at the table · installed as a PWACloudflareproxied DNSCloudflare · proxied DNSnginx7asebly.aabdoo23.devnginx · 7asebly.aabdoo23.devReact PWAArabic first · offline cartReact PWA · Arabic first · offline cartAPIFastAPI · async SQLAlchemyAPI · FastAPI · async SQLAlchemyWhatsApp sidecarone-time codesWhatsApp sidecar · one-time codesCelery workerOCR · speech · settlementCelery worker · OCR · speech · settlementGeminireads the receiptGemini · reads the receiptSpeech to textMasri voice notesSpeech to text · Masri voice notesPostgresown database and rolePostgres · own database and roleRedisown indicesRedis · own indicesMinIObucket-scoped userMinIO · bucket-scoped user
  • 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.

  1. 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
  2. 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
  3. 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
  4. Compound

    Service and VAT compound the way Egyptian bills actually do: read from the receipt where printed, defaulted where absent, always overridable.

    • API
  5. 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
  6. 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.

7asebly sign-in on a phone
The phone is the real surfacePhone · 390
Résumé