Skip to content
All projects
Client project Delivery & commerce

Talabatek

Arabic-first delivery, built for real POS hardware

A food and grocery delivery platform in Palestine with four Flutter clients: customer, driver, restaurant and web. 10K+ installs on Google Play.

Country
Palestine
Type
Client project
Timeline
2024–2026
Platforms
Android · iOS · Web
Talabatek banner
installs on Google Play
10K+
Flutter clients
4
unit tests
~80
brands on one platform
3

Overview

Talabatek is a food and grocery delivery service in Palestine, covering Shu'fat Camp, Anata, Ramallah, Kafr 'Aqab, al-Ram, Nablus and the areas around them. Customers order from restaurants, cafés and grocery stores, drivers pick up and deliver, and restaurants run their menus and order boards from a dedicated app.

I was the lead Flutter engineer for every client app: customer, driver, restaurant with thermal receipt printing, and the Flutter web app. The customer app has been on the App Store since January 2024, and all four clients kept evolving through 2026, including a full dark and light redesign.

The challenge

  1. 01

    Three audiences, three apps: customers need fast browsing and simple checkout, drivers need clear one-tap alerts on the move, and kitchen staff need a board readable from across the room.

  2. 02

    Real hardware: restaurants run Sunmi and other Android POS terminals or Bluetooth printers, and receipts must print in Arabic with zero setup.

  3. 03

    Flaky networks and aggressive Android task-killing: sessions, OTP flows and order alerts must survive process death.

  4. 04

    City-based coverage: the backend models cities and areas by name, not coordinates, yet the phone still has to work out where the customer is.

  5. 05

    Fast shipping: hot fixes go out over the air without waiting for a store review.

Highlights

Customer app

  • Browse restaurants by category, search with Arabic text normalisation, and discover 'new' and 'free delivery' rails.
  • Cart and checkout with cash on delivery, saved addresses and a map-based address picker.
  • Order history, ratings and reviews, plus an active-order banner that refreshes in the background.
  • OTP phone login, Google, Apple and Facebook sign-in, and verified App Links that open shops and orders directly.
  • A short-video reels feed, in-app chat, and light and dark themes.

Driver app

  • An 'orders radar' home screen with online/offline status and earnings counters.
  • Persistent order notifications with Accept and Reject buttons, and critical alerts that ring even in silent mode.
  • Weekly shift booking and a ratings and reviews screen.

Restaurant app

  • A live order board grouped by stage: new, preparing, ready, on the way, done and rejected.
  • Automatic thermal printing of every new order on Sunmi, built-in POS and Bluetooth printers.
  • Menu management with images and per-item video, availability toggles and offers.
  • A quick-order form to request a driver for orders the restaurant took itself, plus statements, notifications and dark mode.

Web app

  • The customer experience ported to the browser with Flutter web, including a city picker, cart and OTP login.
  • Clean-architecture features with go_router and hydrated_bloc.
  • Deployed as a static build behind nginx.

Signature feature

Orders that print themselves

  • Restaurants don't want to tap print for every order, so the restaurant app prints each new order automatically on whatever printer the device has.
  • Printer detection runs in order: a Sunmi device first, then the built-in Intelligent POS printer through a small Java PrinterClient that sends raw ESC/POS bytes over an Android LocalSocket, and finally a Bluetooth printer.
  • Receipts are laid out for 80 mm paper with esc_pos_utils_plus and UTF-8 Arabic text; on Sunmi the native right-aligned text API is used.
  • No order prints twice: printed IDs persist across restarts (capped at 400), existing orders are marked printed after an update, orders older than 12 hours are skipped, and an order only counts as printed once paper comes out, with up to 3 attempts per session.
  • It reacts fast: a 15-second refresh while the app is open, an instant refresh on a new-order push, and single-flight fetches so overlapping refreshes can't double-print.

Swipe for more

Engineering notes

  1. 01

    Token refresh safe for rotating refresh tokens

    All apps share one SessionManager with a single-flight refresh, so concurrent 401s trigger only one refresh call. The new refresh token is saved before the access token, and only a real 401 logs the user out; a 429 or 503 is treated as temporary.

  2. 02

    Server-side OTP

    OTP verification moved from the device to the server, and I documented the backend contract for the API team. Only the pending phone number is persisted, never the code, so Android killing the app mid-flow doesn't lose the user's place.

  3. 03

    City matching without coordinates

    The app reverse-geocodes the customer's location and fuzzy-matches it against city and area names, normalising Arabic spellings and mapping English geocoder names to Arabic. 13 unit tests cover it, including false-match cases.

  4. 04

    Driver alerts that can't be missed

    Order notifications stay on screen with Accept and Reject actions, an opt-in critical mode sounds through silent mode, and a heartbeat tells the backend which drivers are really online.

  5. 05

    Four apps kept in step

    Shared Arabic UX patterns and TkDesign tokens let the dark v2 redesign ship across the customer, driver and restaurant apps in the same release cycle.

Results

  • Customer app: 10K+ installs on Google Play, and on the App Store since January 2024.
  • Driver app: 100+ installs on Google Play.
  • Restaurant app: 100+ installs on Google Play, also on the App Store.
  • 4 Flutter clients shipped, with about 80 unit tests and flutter analyze clean across all four projects.
  • The same platform was later redeployed for two more brands: OneWay Fast Food and Jahiz.

Stack

  • Flutter
  • Bloc / Cubit
  • Dio
  • Socket.IO
  • FCM
  • Crashlytics
  • Google Maps
  • flutter_map
  • ESC/POS
  • Sunmi SDK
  • go_router
  • hydrated_bloc
  • Shorebird
  • nginx