Work
Mindz is a multi-tenant SaaS for online courses and membership communities. Checkout, video hosting, email marketing, affiliate tracking, comments, gamification — every surface a creator needs to run a paid course, all wired into the same Django monolith. I joined in 2022 and stayed until early 2026. What follows is the work I'm proudest of, ordered by how technically interesting it ended up being.
Migrating the design system with 40 Claude Code agents
The platform had been on Fomantic UI for years. The product team had decided to move to Vuexy for a year and a half, but nobody had time to do the actual migration: 150+ pages, every one of them stitched together with Django templates and inline jQuery. The estimate kept landing somewhere between three and five months of pair work.
I orchestrated it in a week with Claude Code. Ten lead agents, four sub-agents each,
forty agents working in parallel across isolated git worktrees. Each lead owned a slice
of the app — checkout, lessons, members, affiliate, etc. — and a hierarchical
CLAUDE.md kept all of them on the same component conventions.
The unglamorous numbers: about 82% of the PRs went through with light review. The other 18% needed real human rewrites, almost always on the pages that mixed legacy jQuery with Vue islands. Knowing where the orchestration would fail was more important than how fast the easy cases moved.
RBAC to ABAC
The authorization model was a flat role table that had outgrown itself. Course owners had a different permission shape from co-owners, who were different from affiliates, who were different from white-label resellers, who shared some-but-not-all permissions with platform admins. Every new product surface forced a new role.
I led the refactor to attribute-based access control. Subjects, resources, actions,
and an environment dictionary — checked through a single policy engine instead of
hand-rolled per-view if user.role == ... branches. Migrating without
breaking anyone meant running ABAC in shadow mode against the existing RBAC checks
for two weeks before flipping the switch. Zero authorization regressions in production.
Multi-DB router for database-per-tenant
Mindz uses one MySQL database per tenant for blast-radius and compliance reasons. That decision is great until a single user needs to log in once and switch between multiple platforms they own or co-manage. I built the Django database router and the session-level tenant context that makes the switch invisible to the application code.
Most of the difficulty was in the unglamorous edges: cross-DB ORM joins (don't), migrations across N databases without taking down the platform, and keeping the test suite honest with factories that respect the active connection.
Server-side OAuth2
Customers embed the course player as an iframe inside their own apps. That meant we had to be the OAuth2 server, not just a client — issuing tokens, rotating client credentials without locking customers out, and keeping the audit trail clean enough that a legal review could trace any token back to the request that issued it.
Smaller things I'm still proud of
A new version of the platform's private API; a library of reusable Vue components that the front-end team adopted as the default; systematic N+1 hunts that took the slowest dashboards from twelve seconds to under a second; a custom n8n node that lets non-engineers wire Mindz events into the rest of their stack without me being in the loop.
Before Mindz: Frutap, age 17
My first job was as a Jovem Aprendiz in the administrative wing of Frutap, a yogurt and dairy company in the interior of São Paulo. I was supposed to file invoices. Instead, I taught myself enough Python to build a Naive Bayes classifier that did the categorization for me — and with better accuracy than the spreadsheet I was replacing. They moved me to the technical side and I never looked back.