OpoSAS: studying for civil service exams with Flutter
Preparing for a civil service exam is a long, demanding process. Months — sometimes years — of studying for a single exam that can define your career. In the case of the SAS (Servicio Andaluz de Salud), categories like TCAE or Celador have extensive syllabuses and high competition. And most of the available tools are downloaded PDFs, homemade spreadsheets, or web platforms that barely work on mobile.
OpoSAS started as a personal project to help my partner prepare for her exams. What was meant to be a simple app kept growing, I saw the potential, and decided to launch it.
What the app does
The strong point of OpoSAS is the test-taking experience. You can choose between different modes: full exam simulations, tests on specific topics, tests on parts of the syllabus, or tests focused on the questions you’ve gotten wrong the most. It also has a complete statistics dashboard to track your progress and see where you need to focus.
Other notable features:
- Favorite questions — bookmark any question to review later, all in one place.
- Per-question notes — add personal annotations directly to any question.
- AI assistant — a chat interface for resolving doubts without leaving the app.
- Guest mode — try the app without creating an account.
The app has two tiers: free with ads and Premium. Premium users get full access to all exams, a higher AI quota, and extra features. Subscriptions go through RevenueCat, which abstracts the purchase flow for both App Store and Play Store.
The technology
OpoSAS is built with Flutter, so iOS and Android share the same codebase. The architecture follows strict Clean Architecture: four layers (Presentation, Application, Domain, Infrastructure) with dependencies always pointing inward.
For state management, only Bloc. No Provider, no Riverpod. Dependency injection is manual — no get_it — which forces you to be explicit about what each component needs.
The backend runs on Supabase (PostgreSQL with versioned migrations). I use feature flags to control features in production without touching the code — for example, giving new users 30 days of Premium for free.
It’s a monorepo with several packages shared between the user app and the admin app: the API SDK, domain models, a component gallery, repositories…
100% of the code has test coverage, across all shared packages and both apps. I combine unit tests, widget tests, and golden tests with Alchemist. End-to-end flows run with Maestro, which lets me validate critical user journeys on a real device.
The admin app
OpoSAS also has a separate admin app, also in Flutter. From there I manage questions, gift codes, user statistics, and platform configuration. Having everything in the same monorepo makes sharing code between both apps straightforward.
Where to download it
Available for iOS and Android at oposas.xyz. If you’re preparing for SAS exams, you can download it directly on Google Play or the App Store and try it without an account using guest mode.