Volver a proyectos
EdTech / GovTech2026Solo, from design to launch

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 navigationLearning outcomes with filters and CSV importExam question bank linked to qualifications

Management dashboard with stats and role-based navigation

4
Roles, each with its own panel
Intake → certificate
The whole exam lifecycle in one system
Zero data loss
Exam survives a dropped connection

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.

Flutter WebDartSupabasePostgreSQLClean ArchitectureBLoCFirebase HostingAzure App Insights

Arquitectura

Capas del sistema

Web
  • 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)
Backend
  • 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.

Hablemos