GovBR Intranet
Replaced a battalion's Joomla intranet with an Angular SPA on the Brazilian government design system. Still in production.
- Year
- 2023 — 2025
- Role
- Lead developer and system owner
- Stack
- Angular
- Strapi
- govbr-ds
- Express
- Docker
- Nginx
- PostgreSQL

The problem
The unit’s intranet ran on Joomla. Every route change was a full page load, so the most common complaint was simply the wait — people avoided the tool that was supposed to be their default homepage. On the maintenance side, publishing a single page meant fighting a CMS whose complexity had long outgrown what anyone there needed from it.
Around the same time the Brazilian government released a new digital identity standard, gov.br Design System, openly published with genuinely good documentation. That turned “the intranet is slow” into an opportunity to rebuild against a standard rather than invent one.
What I built
A single-page Angular application on the govbr-ds component library, backed by Strapi as a headless CMS, running in Docker behind Nginx.
The deliberate constraint was that the new interface should not feel like a new product. Users had a mental map of where things were; the rewrite kept that map intact and changed what happened underneath. Nobody had to be retrained.
Once the base was solid, the surface grew to cover what the unit actually asked for: online support tickets, a travel log, birthday notices, and live temperature and humidity readings.
Technical decisions
Angular over staying on Joomla. Joomla is a mature CMS, but the routing bottleneck was structural — server-rendered page loads for every navigation. An SPA router removed that class of latency entirely rather than optimising around it. The Angular CLI also meant new components and services cost minutes instead of hours, which matters when you are the only developer.
Strapi as a headless CMS. Publishing had to stay in the hands of non-developers. Strapi gave the communications team a normal editorial interface while the front end stayed a clean consumer of an API, so a content change never required a deploy.
Docker and Nginx. The stack had to be reproducible and restartable by whoever was on duty, not just by me. Containers made the recovery path a documented command instead of institutional memory.
Where it stands
The system is still running in production. It was adopted as a reference implementation by other units, and the design-system-first approach means the next team inherits documented components rather than a bespoke theme.
This repository is a public, sanitised subset. The production deployment contains unit-specific functionality that is not published here.