An engineering system for a platform that never stops changing
SISOC is the back office of a national social-policy secretariat in Argentina. I lead the team that builds it, and I built the system that lets five people ship to it every week, while its requirements change every week.
- Role
- Technical Lead since Nov 2024 (developer since Jul 2024)
- Team
- 4 developers + me, also as a developer and DevOps
- Stack
- Python, Django, DRF, MySQL, React, TypeScript, Docker, GitHub Actions
- Users
- ~750 active government staff
- Pull requests
- 1,750+ merged since Nov 2024, ~670 of them mine
- Status
- In production - migration in progress
Large changes, fast and cheap, every week
SISOC covers community kitchens, field surveys, admissions, childcare centers, food-assistance and job-training programs, and a 360° view of each citizen record. It is used by staff across provinces and areas: technicians, coordinators, legal, accounting, auditors.
The public agency behind it asks for large changes, delivered fast and cheap. Cheap here means time: we are asked to shorten delivery by spending less of it studying, validating and being careful with decisions. Commitments are often made before engineering has scoped them.
And the ground keeps moving. Requirements change from one week to the next: what was agreed this week can be different the next, often after the work has already started.
What I started from
SISOC grew out of an existing citizen-management system. It was not built to scale: it barely did its job, and it was not stable. It had no tests, no linters, no lower environments, no pull-request culture, no controlled deploys and no documentation. Tasks lived in a WhatsApp group.
The infrastructure is limited and partly owned by another government team. SISOC also consumes external systems it does not control, like the national identity registry. And other systems consume SISOC: a ticketing system, a communications system and three field apps.
What I do, and what the team does
I coordinate priorities with the people who talk to stakeholders, and split the work across four developers and myself. I built the standards and the automations that keep them in place. I review and approve every pull request and every production deploy, and I maintain the infrastructure. I lead architecture decisions and write them down as ADRs.
The team builds features across all modules. They built the three field apps.
SISOC as a transit map
The decisions that hold it together
Make quality automatic, not negotiable
Why - Under constant pressure, anything optional gets skipped. So the standard lives in CI: every pull request runs linters, tests with a 75% coverage gate, architecture checks and secret scanning before I review it.
Trade-off
Pull requests take longer to merge. We accept that in exchange for not discussing quality on every change.
A weekly release train
Why - Stakeholders need a fast pace. Every Thursday a frozen, tagged release goes from QA to staging to production, with my manual approval at the end.
Trade-off
Urgent changes wait for the train, and everyone respects the process we designed, unless a change justifies a hotfix.
Modular monolith before services
Why - We could not stop delivery for a rewrite. First we made the monolith modular: an import-linter ratchet with a baseline, and many small ADRs that each cut one dependency.
Trade-off
Slower than a big-bang split, but the system kept shipping every week.
Per-domain backends in one monorepo
Why - A shared kernel plus one backend per domain, each built as its own image from the commit SHA. The Django core proxies to them, and deploys and rollbacks happen per domain.
Trade-off
Isolation is per process, not per database yet. The proxy is a single point of failure. Both are written down as accepted debt.
React frontends with types from the API
In progressWhy - New screens are React and TypeScript, with types generated from the OpenAPI schema, so frontend and backend can't drift silently.
Trade-off
Two UI stacks coexist: the frontend is being migrated while the Django templates stay in use.
Docs as the source of truth, for people and agents
Why - Specs and ADRs come first, and PR docs and the changelog are generated. AI coding agents work inside the same guardrails as people, and the ADRs record which decisions were mine and which were an agent's recommendation.
Trade-off
Writing first takes time on every change. It is what makes async work possible and agent output reviewable, so saving coding time never costs us control.
The system the team works in today
No before-and-after numbers exist. What can be shown is the system itself: what changed, and what every change has to pass.
Every change to SISOC goes through this
release: every ThursdayWhat I took from it
- Lower environments lie. Real data is different, so migrations get checked before they reach it.
- Whoever deploys needs to be able to recover. Access to backups is part of the deploy, not a favor.
- If a standard isn't automated, pressure erases it.
- Decompose without stopping, and write down the debt you accept.

Let's talk
Software engineer focused on backend: Python, Django and DRF, with React and Next.js on the frontend. I build and maintain production systems with complex business rules and many integrations, and I use AI tools every day without lowering the bar.
- Available now - contractor or full-time
- Fluent English
- Full overlap with US East Coast hours (GMT-3)