AI & Data Engineer · I build production AI systems for legal and regulated documents that non-technical people actually use.
Currently the first and only in-house engineer at a 40-person law firm in Brazil, where I own the AI and automation stack end to end: LLM pipelines over court and tax documents, a deadline-control pipeline, an AI-assisted intake flow in production, and the data layer behind the firm's dashboards.
Before that: two years administering state-wide government databases and building the analytics over ~1,000 public schools and 500,000+ students.
🎓 BSc Computer Science, PUC Goiás (Dec 2026) · degree recognised in Germany (anabin H+) 🌍 Relocating to Europe in 2027 · open to roles with visa sponsorship 🔗 LinkedIn · RenavePro, my own SaaS
Python TypeScript SQL Next.js React PostgreSQL SQLite AWS Docker Claude API Microsoft Graph GitHub Actions
| Project | What it is | Stack |
|---|---|---|
| legal-intake-triage | The front door of a law firm's practice areas: e-mail and form intake, deterministic filters and deduplication, one Claude call that prepares a decision package with the rules re-applied in code, a card a person approves in the demand's own thread, and only then the task, the record and the reply. Two closing paths, an adjustment-rate dashboard, an SLA matrix from the board's history. In production in two areas (originally on Power Automate); rebuilt as code with an offline demo; 49 tests. | Python · FastAPI · Microsoft Graph · Claude API |
| case-diagnostics | Strategic diagnosis of a Brazilian civil case file in four blocks. Two model calls read the file (a prose map, then a structured diagnosis where every thesis quotes an anchor); deterministic grounding rules then verify each thesis against the file and discard, with the reason shown, what the file does not support. Delivered as a technical assessment for a litigation team; evaluation with planted hallucinations, 74 tests. | TypeScript · Next.js · Claude API |
| settlement-reminder-pipeline | Daily pipeline that registers court settlements from a lawyer's notice e-mail, reminds and collects the paying client on business days, settles installments from receipts read by an LLM and matched by amount, and escalates to a human. Idempotent in SQLite; never collects from someone who may have paid. In production at a law firm's controllership; 227 tests. | Python · Microsoft Graph · SQLite · Claude API |
| court-debt-calculator | Deterministic engine for updating court-ordered debts (monetary adjustment, interest timeline, deductions, fees, enforcement surcharges), validated to the cent against public court calculators, with an API, LLM parameter extraction for a lawyer to review and a review UI that prints a neutral PDF statement. Delivered to a litigation team; 185 tests over 14 reference cases. | Python · FastAPI · Next.js · Claude API |
| tax-settlement-analytics | Analytics on 1,134 public tax-settlement terms extracted with an LLM into a versioned dataset, plus a client-side simulator that checks a proposal against the law and against what the treasury has actually accepted. In production at a tax team. | Python · Next.js · Claude API (Files API, Batches) |
| judgment-summary-pipeline | Turns a backlog of Brazilian court decisions into one house-style summary per case in a client's spreadsheet. Documents are found across an untidy shared drive by three join keys and cut down to the part that decides the matter; two model calls read them over the Message Batches API, the second seeing only the first's output; then a free deterministic gate and a fidelity auditor each refuse work, and the auditor can only demote. Written to a copy, with three guards on reviewer-approved cells and a cell-by-cell diff to prove it. Fidelity and parity harnesses measure it against the rows a lawyer already approved; 204 tests. | TypeScript · Node 24 · Claude API (Batches, caching) · ExcelJS |
| whatsapp-cloud-api-client | A Python client for the Groups API of Meta's WhatsApp Cloud API, extracted from a production customer-messaging system. Documented limits checked before the request is built, idempotent group creation with a confirm-before-trust index, aggregation-aware webhook parsing, and a dry-run transport that reads from the live API while recording every withheld write. Where Meta's documentation is silent the client says so instead of guessing: the participant cap every vendor page states is not in any Meta page, and this one does not encode it. 151 offline tests. | Python · httpx · Meta Graph API |
| mtls-pkcs12-agent | Mutual-TLS HTTPS agents in Node from a PKCS#12 certificate, extracted from a production integration with a government API. It opens the files Node itself refuses — OpenSSL 3 moved the older PKCS#12 encryption into a legacy provider it will not load, which certificate authorities were still exporting — and never writes the private key to disk. Refuses an expired certificate and names the date; keeps server verification on, where the original disabled it. 61 offline tests on generated certificates. | TypeScript · Node 24 · node-forge |
| legal-llm-evals | An evaluation harness with two rules enforced in code rather than left as conventions: no success rate is printed without its confidence interval, and no model grader's score is printed without that grader's calibration against human labels. On the shipped set a plausible model judge reports 85% for a system people score at 53.3% — it agrees with them 62% of the time and its kappa is 0.25. Holdout sets, paired McNemar comparison, and a warning when the grader used may be blind to whatever changed. Wilson, Cohen, Fleiss and an exact binomial in three hundred and fifty lines with zero runtime dependencies; 73 offline tests. | Python · no runtime dependencies |
| postgres-rls-multitenant-starter | Multi-tenant isolation enforced by PostgreSQL rather than by application code, extracted from a CRM where the same mechanism protects 29 tables. The four guarantees are proven as an unprivileged role — a superuser bypasses row-level security, so the test refuses to run as one — and the four ways to get it wrong are reproduced by scripts that assert the hole exists, not described in comments. One claim I made turned out to be false and the assertion caught it. | PostgreSQL 18 · TypeScript · Docker |
| court-deadline-triage | Daily triage of court gazette publications: a model classifies the deadline type, a deterministic engine computes the due date over versioned court calendars, a lawyer confirms. Pilot; 161 tests with hand-computed golden cases. | Python · Claude API · SQLite |
| court-notice-monitor | Read-only daily sweep of the electronic judicial domicile: lists, triages and alerts, and is built so it cannot acknowledge service. In production for a law firm. | Python · SQLite · Microsoft Graph |
| eu-job-pipeline | Multi-source European job ingestion with rule-based and LLM fit scoring, a golden-set evaluation and an offline demo mode. | Python · Claude API · SQLite |
Three more systems are written up rather than published, in portfolio: a law-firm CRM whose tenancy is enforced by Postgres row-level security rather than by the application, a SaaS over a certificate-only federal API, and a legal-notice pipeline whose headline result is the 116 letters of 284 that it refused to sign. Each one says what is wrong with it as well as what is right, and explains why a sanitised repository would have been the worse artefact.
Next up: live demos with screenshots for each README.
- I run discovery with the people who will use the thing, then decide the architecture, then build it, then train them.
- I make trade-offs explicit: moved a document pipeline from an agentic loop to the Batches API, which bills at half price, and put the long identical prompts in cached blocks, where reads bill at a tenth; each README says what a decision cost, in dollars, from the usage the run reported.
- Legal rules are code, not prompts: every deadline, discount cap and threshold is deterministic and has a hand-computed test.
- I use AI coding tools daily and treat their output like a junior's pull request: reviewed, tested and validated against a schema before it ships. Every repository documents what was generated and what I changed.
Most of my production work is under employer or client agreements. The repositories here are rebranded, anonymised versions of those systems, running on fictional or public data in demo mode: the architecture and the decisions are real, the private data is not.