Gonzalo Martin PerezAI Software Engineer

Case study · Jan – Dec 2025

Filomena — A health-sciences exam platform five institutions run on

A legacy CakePHP and jQuery monolith, rebuilt as an API-first platform that now runs high-stakes exams for five Argentine national institutions.

  • PHP
  • Laravel
  • React
  • Next.js
  • TypeScript
  • MySQL
  • Redis
  • Docker
  • GitHub Actions
  • Prometheus
  • Grafana
  • 5

    institutions in production

    UNS, UNRN, UNC, UNVM and FAMFyG.

  • 1,000+

    simultaneous users

    Observed in production with complete data consistency, not a synthetic benchmark.

  • <300 ms

    critical endpoints

    Average latency, through SQL tuning, Redis caching and queues.

  • 10 / 10

    final year project

    Graded at Universidad Nacional del Sur.

The problem

Health-sciences degrees assess students through large, high-stakes written exams. Filomena's first version was a CakePHP and jQuery monolith built for a single institution, and it was showing every symptom of that: it degraded under concurrent load, exam delivery was sequential, access control was enforced inconsistently, and adding an institution meant writing code.

There was no monitoring, so problems surfaced as reports from people sitting an exam. For an application where a slow response during a timed assessment is an academic problem and not just a technical one, that was the constraint that mattered most.

Who it is for

Three roles with genuinely different needs. Administrators configure institutions, courses and schedules. Evaluators author questions and review results. Students sit the exams — and must remain anonymous to the evaluator grading them.

Those roles are not mutually exclusive. A professor can be an evaluator in one course and an administrator in another, which is why role handling had to be multi-role from the start rather than a single field on a user.

My role

Built by a three-person team. I was the principal author and contributor across architecture, backend, frontend, infrastructure, security, observability and coordination. The platform is a team achievement.

Filomena was built by a three-person team as our final year project at Universidad Nacional del Sur, and the product is a team achievement. I was the principal author and contributor: architecture, backend, frontend, infrastructure, security, observability, and coordinating the work.

I say principal contributor rather than sole author deliberately. The public repositories are a snapshot published as portfolio evidence — they are not a commit history that proves who wrote which line, and I would not present them as one.

The approach

Rather than refactor inside the monolith, we separated it into a Laravel REST API and a Next.js, React and TypeScript frontend. The decisive reason was not modernity: it was that a single API contract let us make the multi-institution model configuration rather than code, and gave concurrency a single place to be correct.

Performance work was concentrated where exams actually touch the system — question retrieval, session state, result submission. SQL tuning and index design came first, Redis caching second, and anything that did not need to happen during the request, such as generating result reports, was pushed onto a queue.

Architecture

Request path from the browser down, after the rebuild.

  1. ClientNext.js, React and TypeScript, serving administrators, evaluators and students.
  2. APIA Laravel REST API as the single contract for every client.
  3. DataMySQL, with index design and query tuning on the exam paths.
  4. Cache and queuesRedis for caching and for asynchronous work.
  5. ObservabilityPrometheus and Grafana over the database, queues and workers.
  6. DeliveryDocker images built and deployed through GitHub Actions.

The product itself

A walkthrough of the interface, from signing in to operating a running exam. These are captures from a demonstration instance, not from any institution's live data.

Engineering decisions

Pseudonymity as a data-model property

Students are pseudonymous to evaluators — the mapping exists, it is simply not theirs to see. That is enforced in the data model and the API rather than hidden in the interface, because a privacy rule implemented in a view is a privacy rule that leaks the first time someone adds an endpoint.

Isolation per institution

Each institution manages its own courses, evaluators, students, exams and schedules, with data isolated between them. This is what turned onboarding a new institution from development work into configuration.

Role checks on both sides

Role-based access control is enforced in the API and reflected in the frontend. The frontend copy exists for usability; the API copy is the one that is actually load bearing.

Monitoring before it was needed

Prometheus and Grafana went in alongside the rebuild rather than after the first incident, covering the database, Redis, queues and workers, with structured logging and health checks.

What changed

The first version compared with the platform now in production.
AspectBeforeAfter
ArchitectureCakePHP and jQuery monolithLaravel REST API with a Next.js frontend
ConcurrencySequential, single-institution delivery1,000+ simultaneous users, observed in production
LatencyDegraded under concurrent loadCritical endpoints below 300 ms on average
OnboardingRequired development workConfiguration, in minutes
Access controlInconsistently enforcedMulti-role RBAC across API and frontend
ObservabilityNonePrometheus and Grafana

How we worked

Agile practices with Trello, from requirements through to production. Three people, an academic deadline, and real institutions already depending on the previous version — so the work was ordered by what would break first, not by what was most interesting.

Deployments ran on Docker images built through GitHub Actions, observed at under fifteen minutes end to end. The public repositories are published snapshots and do not include that pipeline configuration.

Where it stands

Filomena is active at five Argentine national institutions: UNS, UNRN, UNC, UNVM and FAMFyG. It handled 1,000+ simultaneous users in production with complete data consistency, and kept critical endpoints below 300 ms on average.

These figures come from deployed operation, not from a benchmark harness in the repository. The project was graded 10/10 as a final year project at Universidad Nacional del Sur, and received interviews, university coverage and mentions from academic authorities — editorial recognition rather than a formally named award.

What I would do differently

The test suite is the honest weak point. We validated behaviour through deployed operation and load validation, and the public snapshots ship framework smoke tests rather than a real suite. On a system where a defect interrupts an exam in progress, the concurrency and permission paths deserved automated coverage, and building it under an academic deadline was the wrong tradeoff to make twice.

I would also have written down the measurement conditions at the time. The performance numbers are real, but reconstructing exactly how each was observed, months later, is harder than it should have been — and a figure you cannot qualify is a figure you should be careful about repeating.

Evidence

The repositories are published snapshots kept as portfolio evidence. They are not a commit history of the original development, and I do not present them as proof of who wrote which line.