Online exams and automated certification
Problema
The foundation issues officially recognized professional qualifications, and the whole process ran on an older system whose source code the foundation didn't have access to. That meant no other developer could extend it or even fix its bugs. On top of that, contact with the one developer responsible had broken off. The system was unstable and full of errors no one was left to repair. The foundation needed two things: a system rebuilt from the ground up, and someone to look after it after launch, a developer they could actually reach.
Solución
I built a system that carries this process end to end in one place. The center registers an exam in the app, the foundation approves it, the examiner runs it, the candidate takes it in the browser, and the certificate with its registry number generates itself as a print-ready PDF. Everyone sees only what concerns them: the center its own exams, the examiner their own dates, the foundation everything.
An exam isn't built from scratch every time. The system holds exam templates, a question bank and learning outcomes. The foundation assembles an exam from existing pieces, and every question is linked to a specific learning outcome, so it's clear the exam checks exactly what the qualification requires.
Exam time is watched by the system, not the candidate's computer. If someone's internet drops mid-exam, they come back and keep writing, and the answers don't get lost. When time runs out, the exam ends on its own. During the test phase I had a live view of everything happening in the app, so I fixed bugs before anyone got around to reporting them.
I did the whole thing alone: I designed the UX/UI at the client's request, wrote the code and deployed the system.
En producción
Pantallas de la app
Algunas capturas del producto en vivo. Los pies de foto te dicen qué estás viendo.



Management dashboard with stats and role-based navigation
Qué hace
Capacidades clave
End-to-end exam flow
From a center registering an exam, through foundation approval and the examiner running it, to the candidate sitting it in the browser, all in one place.
Resilient, tamper-proof exams
A dropped connection doesn't lose answers, and the timer runs on the server so the clock can't be gamed from the candidate's machine.
Exams built from reusable blocks
Templates, a question bank and learning outcomes; every question is mapped to an outcome, so the exam provably checks what the qualification requires.
Automated numbered certificates
On passing, a print-ready PDF certificate with its registry number generates itself, no manual paperwork.
Role-based access
Four roles with separate views: the center sees only its own exams, the examiner only their dates, the candidate only their own exam, and the foundation the whole picture.
Data isolated per organization
Each body's data is fully separated and secured, with row-level isolation in the database.
Stack técnico
Tecnologías principales
Los paquetes e integraciones concretos están listados más abajo.
Arquitectura
Capas del sistema
- Flutter Web on Clean Architecture
- Role-based panels: foundation, validation center, examiner, candidate
- Server-authoritative exam timer with disconnect & rejoin
- Responsive, deployed on Firebase Hosting (no-cache, PWA off)
- PostgreSQL with row-level security on every table
- SECURITY DEFINER RPCs to break RLS recursion & scope by role
- Deno edge functions for transactional e-mail (Resend)
- pg_cron: auto-close expired exams, keep-warm jobs
- Gapless year-scoped certificate numbering
Librerías
Paquetes clave
- flutter_blocCubit state management
- freezedimmutable entities & states
- dartzEither<Failure, T> error handling
- get_it + injectabledependency injection
- go_routerrole-based routing & guards
- pdf + printingprint-ready certificate generation
Integraciones
Servicios externos
- SupabasePostgres, Auth, Storage, Edge Functions
- Resendtransactional e-mail (invites, accounts)
- Azure Application Insightslive metrics, errors, dependencies
- Firebasehosting + GA4 product analytics
- Sentryerror tracking with breadcrumbs
¿Estás construyendo algo parecido?
Escribe unas líneas sobre el proyecto y te respondo con notas concretas y la fecha en que puedo empezar.