Flutter Developer · Offline-First Business Apps · Arabic RTL
Libya
Money Log — a fully reactive Flutter ledger. Every screen driven by a live SQLite stream.
I build Flutter applications that keep working when the network doesn't.
Most mobile apps assume a stable connection. In the markets I build for, that assumption breaks daily — so my work centres on local-first architecture: the app runs entirely on-device, holds a single source of truth in SQLite, and syncs cleanly when connectivity returns. Alongside that, I care about the parts that survive a codebase's second year — typed schemas, tested state machines, and CI that refuses to merge a regression.
I work in both Arabic and English, and give real attention to RTL correctness rather than treating it as a translation pass.
| Project | What it demonstrates | Stack |
|---|---|---|
| Money Log | Fully reactive architecture — every screen driven by a live database stream, no manual refresh anywhere. Optimistic delete with a countdown undo. | Bloc · Drift · get_it · CI |
| Sabil | Fintech MVP: phone/OTP auth, AI-assisted KYC face verification, real-time credit scoring, Arabic RTL-first UI. | Cubit · Dio · go_router |
| Pets Finder | Clean Architecture end to end, with unit, widget, and integration test coverage. | Cubit · Dio · Clean Arch |
| Flutter Core Utils | Reusable core module consumed as a git submodule — shared configs and architecture to bootstrap projects consistently. | Dart · Architecture |
| Quotes App | Native interop via platform channels — a Kotlin shake detector on the Android side wired through to Flutter. | Flutter · Kotlin · Platform Channels |
| Movies DB | Infinite-scroll pagination, Hive offline caching, Sentry error tracking, light/dark theming. | Cubit · Hive · Sentry |
The choices below are documented in the repositories themselves — I write down the reasoning, including the trade-offs, not just the outcome.
- Money as integer minor units, never
double(Money Log) — IEEE 754 can't represent most decimal fractions exactly, so summed amounts drift over time. Whole minor units keep every operation exact; conversion to a display string happens only at the UI boundary. - Balance derived from queries, never stored (Money Log) — one source of truth means no reconciliation step, and no way for a cached total to disagree with the ledger.
- Tests run against a real in-memory database, not mocks (Money Log) — mocking the data layer tests the mock, not the schema. A real SQLite instance per test catches constraint violations, defaults, and enum round-tripping that mocks silently pass.
- Shared core extracted as a git submodule, not copy-pasted (Flutter Core Utils) — duplicated base configs diverge the moment one project fixes a bug. A consumed module means the fix propagates instead of rotting in three places.
- Offline cache with explicit error reporting (Movies DB) — Hive caches pages so the list survives a dropped connection, and Sentry captures what actually failed in production rather than leaving silent empty states.
- RTL designed in from the start, not retrofitted (Sabil) — direction-aware layout, numerals, and input behaviour are architectural, not a translation pass. Retrofitting them means revisiting every screen.
- Drop to native only where the platform requires it (Quotes App) — sensor access lives in Kotlin behind a platform channel; everything above it stays in Dart, so the native surface is small and testable.
| Language & Framework | Dart · Flutter · Kotlin |
| State Management | Bloc / Cubit · Freezed |
| Data & Backend | Drift (SQLite) · Hive · Supabase · Firebase · REST via Dio + Retrofit |
| Architecture | Clean Architecture · SOLID · Design Patterns · Dependency Injection (get_it) |
| Testing & Quality | flutter_test · bloc_test · mocktail · widget & integration tests · Sentry |
| Delivery | GitHub Actions CI · signed release builds & Google Play publishing · Git submodules |
| Design | Figma to Flutter · design tokens · light/dark theming · responsive layouts · RTL |
Extending Money Log into a full offline-first ledger — relational categories and accounts via real Drift migrations, with bloc_test and mocktail coverage across the write paths.
Writing about Flutter architecture in Arabic on LinkedIn — reactive streams, state modelling, and the decisions behind them.
Open to remote roles, freelance projects, and collaboration.




