The platform is in production, serving candidates, companies and municipal staff through three portals. It holds 99 internship positions from 60 companies and 310 applications, and 62 placements have been confirmed on it — 60 of them still standing. Before each release I run a smoke-test suite against the live API; before the biggest one I audited the whole platform and fixed everything I found, because nobody else was going to. That audit is fig. 3, recounted from its own diff.
Those figures have a second source, which is the only reason to believe them. The council's jury received 60 entity applications and admitted 55, offering 90 positions; the five it excluded account for the nine-position difference, and it names them. Its final allocation, signed on 26 May, calls the placements the result of “o processo de matching realizado em plataforma digital própria do Programa” and fills the 60 places the executive approved on 17 March. The database says 60 active placements. Neither document mentions me — they are the council's account of its own programme, and they were written without reference to this page.
The stack is deliberately boring: Express, Prisma, PostgreSQL, a React SPA, and a shared types package so the API contract is one set of Zod schemas consumed by both sides. Boring bought me speed as a solo developer — every hour spent fighting a clever framework is an hour the council doesn't get.