MEHDI/SNOUSSI
REV 2026.11 MAHDIA --:-- GMT+1 Open for projects
Book a call →
Mobile engineering · Mahdia, Tunisia

I take mobile apps from an empty repo to a signed release.

Flutter and React Native, plus the backend behind them. You get one engineer who does the architecture, the code, the icon, the store listing and the release build, not a handoff chain between four freelancers.

Free 30 minutes. You leave knowing what I’d cut from v1 and roughly what it costs. The written scope and fixed price follow within 2–3 days, whether or not you hire me.

Mehdi Snoussi
MEHDI SNOUSSIMAHDIA, TN
Live on Google PlayApps builtExperienceLocalised
8shipped solo, start to store 17apps in the portfolio 4 yrsmobile + full-stack 26languages, incl. RTL
SHEET 01 What you can hire me for

Three ways this usually starts.

Fixed scope, fixed quote, one person accountable. If your project isn't one of these, say so on the call and I'll tell you honestly whether I'm the right fit.

SVC-01

Ship a new app

You have an idea and no app. I take it to a real release on Google Play and the App Store.

  • Architecture, UI and the whole codebase
  • Backend and API where you need one
  • Icon, screenshots and store listing
  • Signed release build and submission
  • Analytics, ads or in-app purchases wired in
First release scoped to 6–10 weeks
SVC-02

Rescue an app you already have

Someone built it and left. It crashes, it's slow, or nobody can release it any more.

  • Audit of the codebase and build pipeline
  • Crash and performance triage, root cause first
  • Dependency and platform-policy catch-up
  • Get it building, signed and shippable again
  • Handover docs so you're not stuck twice
Audit first · 1 week, fixed price
SVC-03

App plus the platform behind it

The app is half the product. The other half is the dashboard, the back-office and the API.

  • Mobile app in Flutter or React Native
  • Web dashboard in Angular
  • API in NestJS, Symfony or Spring Boot
  • PostgreSQL, auth, roles and permissions
  • Real-time updates and offline-first sync
Scoped per project · from 10 weeks
SHEET 02 Proof: apps I shipped alone

This is what one person shipping alone looks like.

Every screen, icon, store listing and signed release below is mine. No designer, no team. Pick one and read exactly what is in it.

Lifestyle / Religion

Dhikr

Tasbih, azkar, prayer times and the Quran, on the phone and the watch

A companion for daily Muslim practice: tasbih, azkar, prayer times, the Qibla and the full Quran, with a Wear OS watch app. Prayer times are computed on the device, and Quran search listens to a recitation on the device too, through a speech model fetched once after install. Recitation audio, the stories’ narration, tafsir and mosque search are the parts that use a connection.

  • Full Quran reader: 114 surahs and 6,236 ayahs in Uthmani script, with English and French translation, ten reciters to choose from and a tafsir in Arabic, English and French
  • Recite a few words to find the ayah: a Tilawi FastConformer model running on ONNX Runtime in native Kotlin
  • Offline prayer times with 15 calculation methods, the country’s own picked by default, per-prayer offsets and an Athan channel
  • A 33-bead misbaha on the phone and on Wear OS, the watch kept in step over the Wearable Data Layer, with a tile and a watch-face complication
  • Qibla compass corrected for magnetic declination, and nearby mosques over the OpenStreetMap Overpass API
  • Four azkar sets, 40 Quranic duas, 25 prophet stories in 83 chapters read aloud in Arabic, English and French, a daily quiz of ten questions, 9 badges and four home-screen widgets

Flutter, BLoC, get_it, GoRouter, Hive, adhan_dart, ONNX Runtime (Kotlin), Jetpack Compose for Wear OS, flutter_map, AdMob + UMP, Play Billing

com.carthage.dhikrv1.4.0Android and Wear OSArabic, English, French Get it on Google Play ↗ Privacy ↗ Terms ↗
Dhikr: Home and today’s prayers Dhikr: Find an ayah by reciting Dhikr: The 33-bead misbaha Dhikr: Prayer times Dhikr: Quran reader
Home and today’s prayers
Game / Puzzle

SortFlow

Color sort on a chemist's bench, solver-verified

A color-sort puzzle with no authored level list. Every board is scrambled out of a solved state and then re-proved by a breadth-first solver, and that same search supplies the hints and sets the three-star threshold, so every board is solvable by construction, with a par that is proven reachable.

  • No authored level list: every board is generated on the fly and re-proved by a BFS solver
  • Generation and hints run on a background isolate, so a level load never blocks the UI
  • Star thresholds come from the board’s own BFS optimum plus a small fairness pad
  • 6 star-gated worlds, 12 claimable achievements and a date-seeded daily challenge with a streak
  • Glass tubes, corks and the brass rack drawn in code with CustomPainter, with no image assets, including the Halloween Potion set and Haunted Night background
  • 8 languages including Arabic RTL, progress backup export and import, and no backend at all

Flutter (no game engine), CustomPainter + AnimationController, BLoC, get_it, GoRouter, Hive, easy_localization, AdMob + UMP, Play Billing

com.sortflow.sortflowv1.3.4Android8 languages, Arabic RTL Get it on Google Play ↗ Privacy ↗ Terms ↗
SortFlow: Pour and sort SortFlow: Home on the bench SortFlow: Star-gated worlds SortFlow: Daily challenge SortFlow: Level complete
Pour and sort
Lifestyle / Tarot

AI Mystic

AI tarot readings on a printed deck

A tarot app that writes each reading with Google Gemini from the cards actually drawn, the question and the zodiac sign. The interesting part is the failure path: if the model is slow, out of quota or unreachable, the app writes the reading on the device from the cards' own meanings, so a reading never comes back empty.

  • A printed 78-card deck drawn in CustomPainter, dealt face down in each spread’s real shape and turned by hand
  • Gemini over its REST API with a lite model first and a second model behind it, then the on-device oracle
  • Daily card, Yes or No and Past, Present, Future for everyone; Love and Career with Mystic Pro, monthly or yearly
  • Three free readings a day and two more by rewarded video; the daily card is seeded by the date
  • A 1080×1920 star-atlas share card whose Play link carries the card for deferred deep linking
  • A Grimoire of all 78 cards, a journal, a waxing-moon streak with milestones at 7, 30, 100 and 365 days, and a home-screen widget

Flutter, BLoC, get_it, go_router, Hive, Gemini REST API, home_widget, AdMob + UMP, Play Billing subscriptions

com.carthage.aimysticv1.3.4AndroidEnglish Get it on Google Play ↗ Privacy ↗ Terms ↗
AI Mystic: Home and today’s card AI Mystic: The daily reading AI Mystic: Past, present, future AI Mystic: Yes or no AI Mystic: The Grimoire
Home and today’s card
Game / Puzzle

Cascade

Drop and merge physics puzzle, printed in riso

A drop-and-merge puzzle built on Flame and Forge2D, where merges resolve through real rigid-body contacts rather than a grid, and every orb is drawn like a two-ink risograph print. The rewarded continue clears a band about two rows deep off the bottom and wakes the sleeping bodies above it, so the stack actually collapses into the gap.

  • Forge2D rigid-body board where same-tier orbs merge on contact: 11 tiers, Spark to Nova
  • Chain-merge combo window with up to a 4× multiplier and triangular per-tier scoring
  • Date-seeded daily challenge giving every player the same board, plus a day streak
  • Three coin-priced power-ups (swap, undo, targeted bomb) and one ad-earned bomb per run
  • 19 claim-to-collect achievements, orb skins including the Halloween Pumpkin set, and a 7-day escalating login reward
  • 8 languages with Arabic RTL, an in-app language switcher and a reduced-motion mode

Flutter, Flame, flame_forge2d physics, easy_localization, shared_preferences, audioplayers, AdMob + UMP, Play Billing

com.carthage.cascadev1.3.4Android8 languages, Arabic RTL Get it on Google Play ↗ Privacy ↗ Terms ↗
Cascade: Drop and merge Cascade: Menu Cascade: Daily challenge Cascade: Orb skins Cascade: Game over and continue
Drop and merge
Game / Puzzle

Zellia

Cozy triple tile match in cut zellige

A triple-tile-match puzzle set in the cut-tile mosaics of Fes. Every board comes out of a constructive reverse-deal generator that lays the winning line down first, so no board can be dealt unsolvable.

  • Constructive reverse-deal generator proves every board solvable, unit-tested from level 1 to 150
  • Shuffle re-runs the deal on the live position, tray included, and is tested to stay winnable
  • 16 tile types cut like real zellige, a glazed square with a star piece set in lime grout, pre-rasterised to 192 px sprites; types differ by silhouette, not just colour
  • Palace restoration: 8 areas of 4 arches bought with tesserae, each finished area adding its own board shape
  • Daily board on a launch-stable seed, the endless Courtyard and a freeze-forgiving streak
  • No banner ads: interstitials every 2nd board on an 80 s cooldown, plus opt-in rewarded

Flutter, Flame, pure-Dart solvable-board generator, shared_preferences, easy_localization, AdMob + UMP, Play Billing, flutter_local_notifications

com.carthage.zelliav1.3.4Android8 languages, Arabic RTL Get it on Google Play ↗ Privacy ↗ Terms ↗
Zellia: A board mid-game Zellia: Menu Zellia: The palace Zellia: The Courtyard Zellia: Level complete
A board mid-game
Game / Casual

Relic Revival

Antique restore and museum builder

A swipe-to-clean restoration game: wipe away the grime and a relic's hidden identity emerges. Every relic is composed from an integer id plus a per-install salt by a seeded FNV-1a and SplitMix64 pipeline, and drawn entirely in CustomPainter, so the game ships with no bitmap art.

  • Swipe-to-wipe reveal driven by a GPU erase mask plus a 64×64 CPU coverage grid
  • Deterministic composer: FNV-1a-64 and SplitMix64 turn a relic id into vector art
  • Five rarity tiers at 60 / 25 / 10 / 4.5 / 0.5 drop weights; higher tiers resist the wipe
  • A museum of 8 themed sets across 61 places, each completion adding permanent income
  • Offline idle income from a 4-restorer roster, capped at 6 h and proof against clock edits
  • 1080×1080 before-and-after share card from the same painter, 8 UI languages, and the Cursed Relics event

Flutter, CustomPainter-only art (no game engine), shared_preferences, easy_localization, AdMob + UMP, Play Billing, audioplayers

com.carthage.relicrevivalv1.3.4Android8 languages, Arabic RTL Get it on Google Play ↗ Privacy ↗ Terms ↗
Relic Revival: Wiping the grime Relic Revival: A rare find Relic Revival: The museum Relic Revival: Restorers Relic Revival: The gallery
Wiping the grime
Auto / Launcher

Blue Hour

A car screen lit by the real sun

A home screen for Android head units and phones in a dashboard mount: a road, your car and a sky lit by the real sun at your GPS position, with the music, the next turn and your apps on top. Cheap head units force-stop third-party launchers when the car sleeps, so Wake guard recognises FYT, MTCD, Reglink and DuraSpeed units and walks the owner through keeping Blue Hour alive.

  • Sun position computed on the device from GPS; the sky moves through night, blue hour, golden hour and day
  • Real weather from MET Norway on a position rounded to about 1 km, cached for drives without signal
  • Five scenes, six car bodies and the plates of 52 countries drawn in CustomPainter, at 30 fps and 20 on weak units, paused while another app is in front
  • A car book kept on the device, with every drive, fill-up, service and cost and a trip computer; each drive is saved as a postcard painted in the light it was driven under
  • Now playing and the next turn read from notifications on the device, never stored or sent
  • Drive mode from GPS speed: the scene holds still, directions grow, and Settings, Share and search wait until parked
  • Layouts from 800×480 to 1920×720 head units, phones in either orientation and portrait car screens, in 26 languages

Flutter, Kotlin (launcher intents, notification listener, head-unit detection), geolocator, MET Norway Locationforecast, Play Billing

com.carthage.bluehourv1.1.5Android head units and phones26 languages Get it on Google Play ↗ Privacy ↗ Terms ↗
Blue Hour: Coastal Road, golden hour Blue Hour: Night City, blue hour Blue Hour: Drive postcards Blue Hour: The car book Blue Hour: The garage
Coastal Road, golden hour
Lifestyle / Virtual pet

Mini Me

A tiny you that walks over your apps and mirrors your real day

A virtual pet that is you. Pick Mimi’s candy sticker world or Kai’s street one, dress your mini, look after it, and let it walk over your other apps, sit in a home-screen widget and follow your day from Health Connect. It needs no account: what you log stays on your phone and your own watch, and steps and sleep are only read, never stored on the phone. Friends and Duo are optional, and the only part that uses a server.

  • An SVG avatar rig ported one to one from the design kit’s JavaScript, 226 looks checked against the original, animated part by part with an idle brain
  • Walks over other apps in a native Kotlin overlay window, and lives in two home-screen widgets that Flutter draws offscreen
  • Steps, sleep and workouts from Health Connect, a morning check-in, statuses, focus sessions and trips the mini comes back from, with at most one reminder a day planned on the device
  • Optional extras: water, a private cycle log that only ever says “cosy” outside its own screen, a workout log, and a Ramadan mode with offline Suhoor and Iftar times
  • Friends and Duo on Firebase: Google sign-in, Cloud Firestore rules tested on the local emulator, and minis that talk in preset phrases only, with no chat and no free text
  • Twelve WhatsApp stickers drawn from your own mini, and a Wear OS app with a tile, complications and a Watch Face Format face
  • Mini Me Plus on Play Billing 8: monthly, yearly with a free trial, or once for life, plus four one-time packs; Google backup only when it is end-to-end encrypted

Flutter, Riverpod, go_router, drift (SQLite), flutter_svg, Health Connect, Firebase (Auth, Firestore, App Check), Kotlin (overlay, widgets, stickers), Jetpack Compose for Wear OS, Watch Face Format, Play Billing

com.carthage.minimev1.0.2Android and Wear OS10 languages, Arabic RTL Get it on Google Play ↗ Privacy ↗ Terms ↗
Mini Me: Mimi on Home Mini Me: Make your mini Mini Me: My day Mini Me: Kai’s wardrobe Mini Me: Stickers from your mini
Mimi on Home

All eight are live on Google Play. Install any of them and hold the work in your hand before you talk to me. I’ll also screen-share the codebase on the call. Privacy policy and terms for each one live at /legal.

SHEET 03 Production work for clients

Four years of production work, under NDA.

Client names and code stay private. The architecture doesn’t, and I’m glad to walk you through any of these decisions on a call.

JOB-01 · ERP

Multi-tenant financial platform

Sole front-end engineer in a 12-person Scrum team. Accounting, e-invoicing, payments and reporting, with per-user permissions, record-level locking and real-time updates.

Angular
Symfony · PostgreSQL
Mercure
JOB-02 · MOBILE

Cross-platform tourism app

Published to both the App Store and Google Play. Live geolocation guidance, a full offline mode, multi-language support and push notifications.

Flutter
iOS · Android
i18n
JOB-03 · FINTECH

Personal finance app, both stores

Taken to production on iOS and Android: offline-first sync, native permission handling, and the store submission process end to end.

React Native
iOS · Android
JOB-04 · HEALTHTECH

Clinical training platform

Learner progress tracking with automatic certificate generation, integrated with an external telephony API and the client's learning-management system.

Angular
Symfony · PostgreSQL
JOB-05 · PROPTECH

Real-estate & vehicle valuation

An instant-estimate quiz with photo and video submission, an admin back-office, and an automated ingestion pipeline that keeps live market comparables flowing in.

Angular · NgRx
NestJS
JOB-06 · INTERNAL

Rich-text editor component

Replaced a paid third-party library with a reusable in-house component, removing a recurring licence cost from the product.

Angular
TypeScript

Earlier: Software Engineering degree, EPI (2020–2023) · BSc Electronics, ISSAT Sousse (2017–2020)

SHEET 04 How a project runs

You always know what week you're in.

No black box, no invoice surprises. From the first week of building, an installable build lands in your hands every week.

01

Call

Thirty minutes. You describe the product, I ask the awkward questions and tell you what I'd cut from v1.

Free · same week
02

Scope & quote

A written scope, a fixed price and a delivery date. If it's out of your budget, you find out here, not later.

2–3 days
03

Weekly builds

An installable build every week, in your own repo from day one. You steer while steering is still cheap.

The bulk of the project
04

Release & handover

Signed builds, store listing, privacy policy and submission. Then docs, or a maintenance arrangement if you want one.

Final 1–2 weeks
SHEET 05 Questions people actually ask

The awkward ones, answered up front.

Q-01 What does an app cost?
I quote a fixed price after the scope call, never an open-ended hourly rate. The number depends almost entirely on how much you're willing to leave out of version one, which is the main thing we'll talk about on the call. You will not get an invoice you didn't agree to in writing first.
Q-02 How long until it's in the stores?
I scope first releases to a six-to-ten week window, and the exact date goes into the written scope before you pay anything. A rescue starts with a one-week fixed-price audit so neither of us is guessing. Store review adds a few days on Google Play, and can add longer on the App Store.
Q-03 Do you do the design as well?
There was no designer on any of the eight apps above; I drew every screen, icon and store screenshot myself. If you already have a designer or a Figma file I’ll build to that instead, and if you don’t, you’re not blocked waiting for one.
Q-04 iOS as well as Android?
Flutter and React Native both build one codebase for both platforms, and I have taken client apps through submission on both stores. My own eight apps are Android-first because that is where their audience is, not because of a platform limit.
Q-05 Who owns the code?
You do. The work happens in your repository, under your account, with your name on the store listing and your signing keys in your hands from day one. Full IP assignment is written into the contract and completes on final payment. No lock-in, nothing to buy back at the end.
Q-06 What happens after launch?
Your choice. Either a clean handover with documentation so any developer can pick it up, or a monthly arrangement for updates, platform-policy changes and new features. Both stores force breaking changes on you every year, so someone has to own that.
Q-07 You're in Tunisia. How does that work?
Mahdia, on the coast, GMT+1: the same working day as all of Europe, and mornings with the US East Coast. I work in English, French and Arabic. On money: a written agreement, and payment in milestones tied to deliverables rather than one lump sum up front. You can pay by bank transfer, or through Upwork escrow if you would rather have a platform holding the funds. And because the code sits in your repository under your account from the first commit, you keep everything you have paid for even if we stop working together.
Q-08 Can I see the code before I commit?
On the call, yes. I’ll share a screen and walk you through the architecture of any app on this page, including the parts I would do differently now. It is the fastest way for a technical founder to work out whether I am any good.
SHEET 06 Who you'd be working with

Four years inside other people’s platforms taught me what to build on my own.

Angular and TypeScript on the front, Symfony, NestJS, Spring Boot and PostgreSQL behind them: enterprise systems where a bad release costs somebody real money. That's where I learned to care about release pipelines, permissions and the boring parts.

Alongside that I built seventeen apps of my own, eight of them all the way to signed, release-ready builds: Flutter, clean architecture, BLoC and Riverpod, localisation into as many as 26 languages, AdMob and in-app purchases, store listings, privacy policies. Every part of that was me, which is why I know exactly how long each part takes.

So the person on the call is the person who writes the code. I’ve done every part of this job (architecture, UI, store submission) on my own, more than once.

Based
Mahdia, Tunisia · GMT+1
Languages
English · French · Arabic
Mobile
Flutter · React Native · Dart
Web
Angular · TypeScript · RxJS
Backend
NestJS · Symfony · Spring Boot
Data
PostgreSQL · Hive · SQLite
Ships with
GitLab CI · SonarQube
Contract
Direct or via Upwork escrow
SHEET 07 Start here

Tell me what you're building.

Answer these three and I’ll send you a couple of times that work. You’ll leave the call knowing what v1 should actually contain; the written scope, delivery date and fixed price follow within 2–3 days.

02 · Where is it now?
03 · Budget band
Send
I usually answer the same day, and never later than two business days.
Email
snoussimehdi0@gmail.com
Working hours
GMT+1 · overlaps EU all day, US mornings
Availability
Open for new projects
Elsewhere
GitHub · Upwork