Three bare-metal servers where any single one can die without taking the ERP down. Automatic database failover, floating entry point, shared sessions.
- PostgreSQL
- Patroni
- etcd
- Keepalived
- Docker Swarm
- Traefik
- MinIO
I work on Odoo ERP backends and the PostgreSQL infrastructure underneath them. Custom modules for order-to-cash, procure-to-pay and manufacturing, the middleware that keeps the ERP in sync with the systems around it, and the database and server work that keeps a distribution network of more than a hundred instances serving.
What I keep coming back to: why a query is slow, how a cluster behaves when a machine dies, and which manual server task should stop being manual. Currently learning Go.
Three bare-metal servers where any single one can die without taking the ERP down. Automatic database failover, floating entry point, shared sessions.
One command operates every instance across all production servers, replacing work that used to be done by hand on each server.
Checks out of band whether ERP records are actually correct, independently of whatever system wrote them, and repairs a known class of corruption.
Three paper-and-Word processes turned into one system: partner onboarding, distributor agreements, and internal memos.
A full Odoo 16 system for a factory, covering manufacturing orders, waste tolerance, conversion cost, repacking, and cost structure reporting.
Rebuilding a business unit's operations on Odoo 16 after moving off Microsoft Dynamics AX, one workflow at a time.
Work across the systems distributors run on: a live view of field activity, exports finance needed, and the containers they all run in.
Computes accounts-receivable aging per customer, sends each one their own WhatsApp reminder, and keeps an audit trail of what went out to whom.
Field visits from every distributor instance stream through middleware into one live dashboard, with each instance kept isolated from the others.
An ORM-level Redis layer in front of the auth table, cutting the repeated lookups every external API call was making.
Cut database CPU by around 80% at peak by caching Odoo read paths in Redis and rebuilding the indexes behind the slowest queries.
Field visit photos and inventory checks served from Redis instead of hitting the filestore on every read.
Rebuilt the partner and staging models behind customer sync, adding guards against malformed external references and alerts when a record fails to reach the systems downstream.
The work that does not have a card of its own, from a single field on a form to a whole document flow. One line each.
Software Engineer, Backend
Internship, then Freelance Developer
Something I would like to share, since it is the part people rarely see. Across this many systems the hard part stopped being the code a while ago. It is holding the context: what a system does, why it was built that way, and what was already tried. So I built a setup for that instead of relying on memory.
Five notes, always the same five, so I never have to remember where something was written down.
Projects/
└── erp-customer-staging-rework/
├── erp-customer-staging-rework.md scope, sessions, related work
├── overview.md what it is, key files, architecture
├── current-state.md status, what is done, what is next
├── decisions.md each decision and why
└── commands.md commands that reproduce the workDecisions carry their reasons, because six months later the reason is the part you have lost. Commands are there so a claim can be checked rather than trusted.
erp-core/
├── CLAUDE.md how this codebase is built, what not to do
├── .claude/docs/ repo-side memory, close to the code
└── graphify-out/ the codebase indexed as a knowledge graphThe rules live next to the code and are reviewed like code, so a change follows the architecture already there rather than a generic best practice.
/resume-workstream x loads the notes, so the session starts knowing the state instead of being told it./update-workstream x writes the state back, so the next session starts where this one ended.What that habit looks like after a while. Every note is a point, every link a reference between them.