Skip to content
Igor Bahia
PT

Igor BahiaFull stack software engineer

Open to conversations

A good system is one that doesn't go down.

I'm Igor Bahia, a full stack software engineer based in Salvador, Brazil. I spent eight years in an oil terminal before moving into code — first taking pumps apart, later deciding when thousands of assets were allowed to stop. I brought the standard with me.

Today I modernize power-sector platforms at Lactec: new interfaces on top of legacy systems, .NET and Python backends, and integration with Landis+Gyr's Smart Grid ecosystem.

since 2008
in critical environments
since 2022
writing software
3 stacks
node · python · .net
GDG
organizer in salvador
01About

From centrifugal pumps to deploys

I started at nineteen as a mechanic's assistant at an oil terminal in Madre de Deus, taking multistage centrifugal pumps and reciprocating compressors apart. Then I moved into planning: I decided, years in advance, when thousands of assets would stop — and I answered for it when the math didn't hold.

Nobody gets hurt when a button is misaligned. But the logic is the same on both sides: either you design for failure, or failure finds you at 3am on a Sunday. I moved into software in 2022, and that's the one thing I carried over intact from the plant floor.

In practice: I think about logs, timeouts and error paths before I think about animation. I like legacy systems — that's where the real problem lives, and where you get to prove that engineering isn't rewriting everything from scratch. Outside of code, I help organize the Google Developer Group in Salvador. And when my head jams, the fix is surfing or running.

Igor Bahia
Igor Bahia, Salvador — Brazil
02Path

Eighteen years around things that can't stop

Two careers, one standard. Listed from the most recent back to where it started.

  1. Lactec

    current

    IT systems analyst · Salvador, Brazil

    May 2024 — now

    Modernizing critical power-sector platforms — the legacy ones nobody is allowed to turn off.

    • I build new Next.js, React and TypeScript interfaces decoupled from legacy systems, so the front end can evolve without waiting on a backend rewrite.
    • I develop and maintain C#/.NET and Python (Django/DRF) backends, with REST APIs, federated auth through Keycloak/JWT, and integration between services that were never designed to talk to each other.
    • I work on Landis+Gyr Smart Grid projects — AMI, RF Mesh and DLMS/COSEM — alongside multinational teams, on applications running in production outside Brazil.
    • I dig into incidents: logs, payloads, integration flows, and the annoying question of "why does this only break in production?". Jenkins pipelines, troubleshooting across SQL Server, Oracle and PostgreSQL.
    • Next.js
    • React
    • TypeScript
    • C#/.NET
    • Python
    • Django/DRF
    • Keycloak
    • Docker
    • Jenkins
    • Smart Grid
  2. Cubos Academy

    Full stack developer · Salvador, Brazil

    Sep 2023 — Feb 2024

    Traceability and logistics monitoring for a large-scale environmental operation.

    • Full stack with React, Node.js, TypeScript, Fastify, Prisma and PostgreSQL: REST API, JWT auth, typed validation with Zod, Docker in the environment.
    • The system tracked the recycling operation of Salvador's Carnival — field data arriving from many points at once, with people waiting on the numbers at the other end.
    • The operation handled around 140 tonnes of waste and thousands of waste pickers, and was presented at Climate Week NYC.
    • React
    • Node.js
    • TypeScript
    • Fastify
    • Prisma
    • PostgreSQL
    • Zod
    • Docker
  3. Transpetro — Petrobras

    Industrial planning & maintenance · Madre de Deus & Camaçari, Brazil

    2008 — 2016

    Eight years at an oil terminal: from pipe wrench to planning shutdowns of critical assets.

    • Mechanical maintenance on multistage centrifugal pumps, reciprocating compressors, electric and diesel engines, and marine loading arms.
    • Later, maintenance planning and scheduling through SAP/R3: shutdown windows defined years ahead, availability analysis and critical spares.
    • This is where I learned that traceability isn't audit decoration: it's what separates "we know what happened" from "we think that's what happened".
    • SAP/R3
    • Confiabilidade
    • Gestão de ativos
    • Manutenção preditiva

Education

  • 2022 — 2025

    Systems Analysis & Development

    Universidade Salvador

  • 2022 — 2023

    Software development

    Cubos Academy

  • 2010 — 2011

    Mechanical technician

    Centro de Formação Técnica da Bahia

03Work

What I can show you

What I do at Lactec doesn't fit here: it's client code, in power systems, under agreement. What's below is the lab — personal projects where I test an idea or a tool before taking it somewhere that matters. They're honest about what they are.

  • Malha

    Jul 2026

    A choropleth of Brazil's 5,570 municipalities that draws the same indicator through all five classification methods at once. Where the breaks fall changes the conclusion more than any other decision on the map, and almost no published map reveals which choice was made. It also computes local Moran's I, with neighborhoods extracted from the topology and multiple-comparison correction.

    Natural-breaks classification is the exact global optimum in O(k·n·log n): 5,570 municipalities in 2.7 ms against 354.8 ms for the quadratic version, which stays in the repo without serving the app — it exists to prove the fast one reaches the same cost. The /validacao page reruns that proof in the browser, over the data in production.

    • Next.js
    • TypeScript
    • MapLibre GL
    • TopoJSON
    • Jenks
    • Moran's I
  • Refract

    Jul 2026

    Surf forecasting computed per break, not per beach. The public swell grid is 8 km wide and returns identical numbers for neighboring breaks, so the difference between them comes from a physical model: dispersion, shoaling, Snell refraction and breaking depth, plus tide predicted by summing harmonic constituents.

    The score never stands alone: it comes broken into the six factors that produced it, each with its measured quantity, and every break parameter declares whether it was measured or estimated. The predicted tide matches the Brazilian Navy's table within 21 mm, and the model's invariants are checked over a thousand generated cases per run.

    • Next.js
    • TypeScript
    • Wave physics
    • Harmonic tide
    • fast-check
    • Zod
  • Ledgerline

    May–Jun 2026

    A bitemporal energy-billing engine: it ingests readings idempotently and out of order, prices them against a versioned ANEEL tariff (period, flag, moving holiday) and posts to a double-entry ledger that always sums to zero. It keeps history on two axes — valid_time × transaction_time — reproducing any invoice exactly as it was known on any date.

    The money invariant doesn't live in a code branch: Postgres rejects an overlapping bitemporal assertion with an EXCLUDE gist, and the zero-sum ledger is proven by property over thousands of scrambled sequences — not claimed.

    • Next.js
    • TypeScript
    • PostgreSQL
    • Bitemporal
    • Double-entry
    • fast-check
  • MeshVigil

    Mar–Apr 2026

    An AMI mesh-network simulator with an observability console: meters routing through collectors up to a head-end, live mesh reconvergence, chaos injection and an SLA panel. At its core, a real DLMS/COSEM codec — HDLC, APDUs, OBIS codes — that encodes every reading to bytes and decodes it back.

    The whole simulation runs in the browser, on purpose: no backend to time out, free to host on Vercel, and the mesh reconverges in front of you when you kill a collector. It's how I brought what I do in the power sector into something you can open and break.

    • Next.js
    • TypeScript
    • Zustand
    • DLMS/COSEM
    • OpenTelemetry
    • Vitest
  • CritPath

    Jan–Feb 2026

    A maintenance-shutdown optimizer modeled as RCPSP: thousands of orders, precedences, limited crews and a fixed window. The solver — serial SGS with simulated annealing — compiles to WebAssembly and runs in a Web Worker, on the client. It imports SAP PM exports (IW39/IW49), computes the critical path, date risk via Monte Carlo, and measures its gap against the PSPLIB dataset, which has proven optima.

    I spent years planning maintenance shutdowns in SAP, deciding months ahead when each asset would stop. CritPath is that problem turned into a solver: it reads the same SAP export I used and optimizes the schedule — with the gap measured against proven optima, not claimed.

    • Next.js
    • TypeScript
    • WebAssembly
    • RCPSP
    • Monte Carlo
    • Web Workers
  • Auscult

    Nov–Dec 2025

    In-browser vibration diagnostics for rotating machinery: windowed FFT, Hilbert envelope, and bearing defect frequencies (BPFO, BPFI, BSF) computed from geometry. A rule engine names the fault — outer race, misalignment, looseness — with severity graded by ISO 20816.

    I spent years in the refinery diagnosing bearings through vibration analysis. Auscult is that knowledge turned into code: all the signal processing runs in the browser, and the detector is validated against Case Western's bearing dataset — including the cases where it gets it wrong.

    • Next.js
    • TypeScript
    • DSP
    • FFT
    • ISO 20816
    • Vitest
  • Pricetime

    Sep–Oct 2025

    An order-book matching engine — the core of an exchange. It matches buy and sell orders by price-time priority, supports limit, market, IOC, FOK, cancel and replace, and records every trade via event sourcing, with bit-for-bit deterministic replay from a single seed.

    In a system that moves money, correctness is the feature. Every invariant — cash and shares conserved, the book never crossed, no one jumping the queue — is proven by property testing over thousands of random order flows, and checked live on screen. Proven, not promised.

    • Next.js
    • TypeScript
    • Matching Engine
    • Event Sourcing
    • fast-check
04Stack

Tools are a means, not an identity

I use whatever solves the team's problem. These are the ones I currently know well enough to answer for what I write.

Front end
TypeScriptReactNext.jsTailwindSSR
Back end
Node.jsFastifyExpressPythonDjango/DRFC#.NET
Data
PostgreSQLSQL ServerOraclePrisma
Infra & integration
DockerJenkinsKeycloakJWTAPIs RESTVercel
Domain
Smart GridAMIDLMS/COSEMRF MeshObservabilidadeSistemas distribuídos
05Contact

Let's talk

The fastest way to reach me is LinkedIn — that's where I actually reply. If it's about a role, send the problem's context along: what breaks today, what needs to exist, and what's already been tried. That saves about two meetings.

remote or hybridopen to conversations