Skip to content
Farhad Nazir

Personal utility app for expats

Arab Expat

An offline-first Android app that helps expats in Saudi Arabia track documents, overtime, spending, remittances and their labor rights.

Role
Full-stack developer: audit and rebuild
Platforms
Mobile, Backend & API
Status
Preparing for closed beta
Timeline
2026
  • Mobile app
  • Business system
Arab Expat home dashboard in English: greeting with Gregorian and Hijri date, profile completion, total balance SAR 8,412.75 with monthly spending against budget, and alerts for an expired Istimara and an Iqama expiring in 18 daysRecreated from source, demo data

Overview

Arab Expat is a personal utility app for expatriate workers in Saudi Arabia. It brings five everyday jobs into one Android app: a document vault with expiry reminders, attendance with a Saudi Labor Law overtime estimator, a wallet with VAT tools and ZATCA receipt scanning, a remittance tracker, and an offline library of official labor and traffic law articles.

The app works in English, Arabic, Urdu and Hindi, with right-to-left layouts for Arabic and Urdu. It stores data in an encrypted local database first, so it keeps working without a connection, and syncs with a Laravel API when it can.

I started from an existing online-only prototype. I audited it, then rebuilt the Flutter app and the Laravel backend module by module, hardened security and verified a release build. The product is not on Google Play yet: it is ready for a controlled closed beta once the owner supplies an SMS sender, hosting, a signing key and a privacy policy.

Built for: Expatriate workers in Saudi Arabia, for example from Pakistan, India, Bangladesh and Egypt, who manage Iqama and other documents, shift work, budgets and money sent home, often in Arabic, Urdu or Hindi rather than English.

The problem

Expats in Saudi Arabia juggle Iqama, driver's license and insurance expiry dates (often shown in Hijri), unclear overtime entitlements, VAT on receipts, remittance costs and labor rights written in language that is hard to follow. Each of these usually lives in a different place, or nowhere.

The prototype I inherited was online-only, and my audit found 61 critical and high issues, including an authentication bypass, OTP codes written to logs, money stored as floating-point numbers, and invented exchange rates and law text. An app that holds identity documents also has to meet Google Play and Saudi PDPL expectations for sensitive data.

The solution

I rebuilt the app around an offline-first design. Every change is written to an encrypted SQLCipher database on the phone and queued in an outbox. A sync engine replays the queue against the Laravel API with idempotency keys and version checks, then pulls server changes from a per-user change feed. If the server rejects a change, for example because of a version conflict, it appears on a Sync issues screen where the user can re-apply or discard it.

The server stays authoritative for money and legal calculations. Overtime is computed from versioned, source-cited labor rule sets and shown with a full breakdown and an "estimate only" note. Identity fields and document scans are encrypted at rest with rotatable keys, and responses mask them by default.

I also removed everything the prototype had made up. Exchange rates now come from a named source with attribution, and law text is copied word for word from the official Bureau of Experts portal, with a "legal review pending" badge until a lawyer checks it.

Main features

What is built so far, taken from the code.
  • Document vault and reminders

    Tracks Iqama, driver's license, Istimara, insurance and other documents, with Umm al-Qura Hijri dates. Scans are encrypted per file and viewed in the app. Expiry reminders come from scheduled server jobs and from local notifications on the phone.

  • Attendance and overtime

    Clock in and out, log breaks and overnight shifts, and set up schedules and contracts. Overtime is estimated server-side from versioned rule sets based on Article 107 of the Labor Law, with optional Ramadan hours and public holidays.

  • Wallet, budgets and VAT

    Multiple wallets with balances derived from a ledger, transfers between them, monthly budgets with alerts, reports and duplicate-receipt detection. The VAT calculator handles inclusive, exclusive, zero-rated and exempt amounts.

  • ZATCA receipt scanner

    Scans the QR code on Saudi e-invoices with the camera and decodes its TLV data. The same strict parser runs in the app and on the server, tested against official ZATCA examples.

  • Remittance tracker

    Logs money sent home, with recipients, history and analytics, and debits the matching wallet. It tracks transfers only and never moves money. Reference exchange rates show their source and are flagged when stale.

  • Offline law library

    A "Know your rights" library of 52 labor and traffic law articles copied from laws.boe.gov.sa with links to the source. Full-text search works offline in English, Arabic and Urdu, with bookmarks and updates synced as deltas.

  • Sign-in and account control

    Sign-in by phone number with one-time codes, plus biometric app lock, a list of signed-in devices with remote logout, a JSON export of personal data, and account deletion that removes files and personal records.

  • Four languages, RTL layouts

    English, Arabic, Urdu and Hindi, with bundled IBM Plex Sans and Noto Nastaliq Urdu fonts so every script renders properly. Layouts mirror for Arabic and Urdu, and a dark mode is included.

Screens marked "recreated from source" were rebuilt from the app's code with demo data, so no client data is shown. The rest are from the software itself.

Arab Expat law library article for Saudi Labour Law Article 84, End-of-service award, with the official Arabic text in a right-to-left block, the official English translation and a legal review pending noticeRecreated from source, demo data
A Labour Law article with the official Arabic text next to the official English translation, and a legal review notice.
Arab Expat wallet with balance by currency, actions for adding transactions, scanning receipts, budgets, reports and a VAT calculator, two wallets and recent categorised transactionsRecreated from source, demo data
The wallet with per-currency balances, receipt scanning, budgets, reports, the VAT calculator and categorised transactions.
Arab Expat Iqama document detail with Expiring soon status, a masked document number, Hijri and Gregorian expiry date, and expiry reminders 30, 14, 7 and 1 days beforeRecreated from source, demo data
An Iqama record with Hijri dates, a masked number and expiry reminders 30, 14, 7 and 1 days before.
Arab Expat home dashboard in Arabic with a fully mirrored right-to-left layout, Hijri date, balance, monthly spending and document alertsRecreated from source, demo data
The same dashboard in Arabic, mirrored right to left and using the app's own Arabic strings.

Development and architecture

The Android app is built with Flutter. Screens talk to repositories, repositories write to an encrypted local Drift database that acts as the source of truth while offline, and an outbox feeds a sync engine that calls the API over Dio. Background sync runs through WorkManager.

The backend is a Laravel 13 REST API on PHP 8.5 with Sanctum tokens. Requests go through form requests into actions and services, targeting MySQL 8 for production and using SQLite for tests, with a queue worker, a scheduler and adapters for SMS, exchange rates and push. An OpenAPI spec, checked by a test, documents the API.

The app is not deployed yet. I built and verified unsigned release bundles, and a deployment guide targets a VPS hosted in Saudi Arabia.

Offline-first sync
I used a generic outbox that replays normal REST calls, so there is one validation path. Idempotency keys stop duplicates, row versions return a conflict instead of overwriting, and a gap-free change feed lets the app pull exactly what it missed.
Decimal money everywhere
Amounts are never floats. The server uses BcMath, the app uses a decimal type, amounts travel as strings, and the database stores DECIMAL columns, so balances and VAT always add up.
Encryption at rest
Passport, national ID and border numbers use field-level XChaCha20-Poly1305 encryption with key IDs and a rotation command. Document scans are encrypted per file and served through five-minute signed links that re-check ownership.
Protecting the phone side
The local database is encrypted with SQLCipher, cached files with AES-GCM, screens with personal data block screenshots, Android backups are off, and release builds only talk HTTPS.
Source-cited labor rules
Overtime rules live in versioned rule sets that cite the law they come from. Each result stores the rule set and the inputs used, so an estimate can always be explained later.
Authorization tested across the API
A matrix test covers all 121 API operations. Reading another user's data returns 404, and any new route without an access rule fails the test suite.
Release readiness
I brought known dependency advisories from 35 to 0 and upgraded the barcode scanner so the release build meets Android's 16 KB page-size requirement.

Technology

  • Flutter
  • Dart
  • Laravel
  • PHP
  • MySQL
  • SQLite
  • Android
  • Drift
  • SQLCipher
  • Laravel Sanctum
  • Pest
  • Larastan

Results

Backend tests passing
1,064Backend tests passingRun on both SQLite and MariaDB 10.4
Flutter tests passing
469Flutter tests passing
Critical and high audit findings closed
61Critical and high audit findings closedFrom my audit of the original prototype
Dependency security advisories
35 to 0Dependency security advisories
Estasher store graphic reading 'Engineering experts, verified' beside two phones showing the engineers home screen and an Arabic chat

Engineering consultation marketplace app

Estasher

A bilingual iOS and Android marketplace where clients in Saudi Arabia book consultations and request offers from verified engineers and engineering offices.

  • Mobile app
  • SaaS product
  • Business system
  • Web application
Just Book admin dashboard with KPI cards for bookings today, GMV, commission, new customers, pending KYC, withdrawals, open disputes and active bookings, above a bookings-per-day chart
In development

Home-services booking marketplace

Just Book

A home-services marketplace where customers book verified providers, with one Flutter app, a Laravel API, an admin panel and websites.

  • Mobile app
  • Web application
  • SaaS product
  • Business system
GeoPrints Google Play feature graphic with the app icon and three phone screens: Today's Journal, Map Explorer and History calendar

Private location journal for Android

GeoPrints

An Android travel diary that automatically logs your stays, routes and photos, with all location history kept on your phone.

  • Mobile app

Have a software idea or a business process that needs a proper system?

Tell me what you are trying to fix. I will reply with honest questions, a practical plan and a realistic estimate.