Mon Test Civique
Designing and shipping a full iOS and Android app single-handedly, from UI design to store release.
- 3 k+
- Downloads
- 5,0 ★
- Store rating
- +20 k€
- Revenue generated
- 0
- Crashes

The context
France Access hired me to build the mobile side of a French civic exam preparation platform. The project was already underway on the web: a backend developer was working on the platform and the API.
My scope covered the entire iOS and Android application. The backend supplied the endpoints step by step as the project progressed, and I integrated them on my side.
One key point: there were no mockups and no brand guidelines. So I owned the whole design side: UI, screen architecture and user flows, on top of the development.

The problem
Preparing for a civic exam takes regular practice, not a single sitting. Candidates needed to revise anywhere, including on their commute, and track their progress over time.
The app also had to cover several exam types (residence permit, resident card, naturalisation) with distinct content, while staying simple for users who are not always comfortable with digital tools.
All of it had to stay in sync with the web platform: someone starting on mobile must find their progress elsewhere.

My technical choices
I chose Flutter for cross-platform. Going native would have meant maintaining two separate codebases for iOS and Android, a cost in development and release time the schedule could not absorb. One codebase, two published platforms.
The rest of the stack followed from a feature-by-feature assessment of what the client wanted to build. Riverpod for state management, a layered architecture to keep business logic away from network calls.
On the design side, I built each screen from the functional requirements: themed interactive quizzes, a rewards system, and real-time progress tracking synced with the web platform.

The challenge
This was my first API integration at this scale in a mobile app. Endpoints arrived progressively, as the backend advanced, which forced me to structure the code to absorb contracts that were not all known upfront.
I spent several days stuck on a single problem, with a deadline running in parallel. That is the part of the job people talk about least.
What I took from it: break the problem into independently testable pieces rather than trying to make the whole thing work at once, and talk to the backend early when the blocker comes from the API contract rather than my own code.

The result
The app is live on the App Store and Google Play Store, rated 5.0/5 with no reported crashes.
The most telling signal comes from the dashboard: most sign-ups now happen through the mobile app rather than the web platform. Mobile has become the product's primary acquisition channel.
The client was satisfied with the result, and the premium subscription model has generated over €20k.
What this project taught me
- 01Designing without mockups means making the calls yourself: every screen is a decision you have to own and justify to the client.
- 02Flutter delivers on cross-platform, provided you structure the code to absorb an API delivered in stages.
- 03Being stuck for days is part of the job. What matters is breaking the problem down and knowing when the blocker is not in your own code.
- 04A well-designed mobile app can become the primary acquisition channel, ahead of the web.