Back to achievements

Google Summer of Code 2026 x UN-OICT

GSoC x United nations · 2026

Google Summer of Code 2026 x UN-OICT

Selected as a GSoC 2026 contributor under the United Nations Office of Information and Communications Technology, contributing to the FireForm project

Worked on FireForm through Google Summer of Code 2026 with the United Nations Office of Information and Communications Technology (UN-OICT), mentored by Marc Vergés and Vincent Harkins. FireForm is a recognised United Nations Digital Public Good, backed by Salesforce.

FireForm lets a firefighter describe an incident once, by voice or by typing, instead of refilling it into a separate form for every agency it has to go to. The whole pipeline, model included, runs locally, so incident data never leaves the building.

I worked on the backend for the summer, starting from an API contract agreed on before any code was written against it, as the project was in its very early stages. Incidents extract into one shared schema that every agency form maps into, through a local model that validates its own output and tracks whatever it could not confidently fill, so it can be corrected later. Once that data exists, generating every agency's form from it is fast. Alongside the pipeline I split the project into a backend and a separate client repository, moved it onto a production grade database, and moved extraction and form generation to background jobs.

Full write-up, with every pull request and the architecture diagrams: FireForm: Google Summer of Code 2026 final report.


The discussions behind it

Most of the work started as a written proposal, got a round of review, and only then became code. Some of these I opened, some were opened by others and settled in the thread.

  • The FireForm API contract: settle the API as an OpenAPI document kept in the repository, before there is a backend to describe. Phase one drops auth and multi-agency.
  • Splitting the repository: two repositories instead of one, a layered package on the backend, and the desktop client moved out on its own.
  • Canonical schema against template-driven extraction: both approaches carry a schema, so the real question is whether it is shared or scattered. Laid the two pipelines side by side, and showed grouped extraction was the version worth testing, backed by what actually fits on the hardware departments have.
  • Locking the incident contract: separated the extracted document from the stored tracking row. Both names were in the codebase meaning different things.
  • SQLite to PostgreSQL: Postgres in the development compose, and the production database outside Docker where backups and replication actually exist.
  • API versioning: a config prefix rather than a v1/ folder, a flat route tree, one import pattern.
  • Auto-syncing issues across repositories: argued against building it. Duplication was the real problem, and cross-repository references solve that with nothing left to maintain.
  • A FireForm CLI: one copy-paste install for a department that wants to run FireForm rather than contribute to it. Green lit, and parked as future work.

Highlights

  • Restructured the backend into one layered package with routes, services, repositories and database access, plus setup and structure docs for new contributors.
  • Built the extraction layer end to end, including manual corrections with an audit trail on every changed value, and a readiness view so a responder sees which forms are fillable before picking one.
  • Built the template registry and form generation. A template is a blank PDF plus boxes, each declaring where its value comes from. Uploading a PDF returns detected boxes with ranked suggestions, and only confident ones get applied.
  • Made the model provider swappable behind one module, local or hosted, with a hard stop against sending incident data off site by accident.
  • Moved the platform onto production footing: a production grade database, background jobs, real migrations, separate development and production Docker setups, and a lint gate in CI.
  • Cut the development loop from minutes to seconds. A dependency change used to cost about 1 minute 48 seconds to restart. It now costs roughly 3 seconds.
  • Set up the project's Discord community so contributors and maintainers had somewhere to coordinate and onboard newcomers.

The numbers

56+ pull requests and 58+ issues across both repositories, and second by commits on FireForm behind the maintainer. Most of the issues are epics broken into one issue per layer, so anyone in the organisation could pick a piece up.

Gallery

Google Summer of Code 2026 x UN-OICT
Google Summer of Code 2026 x UN-OICT