Senior engineer. 6 years building production systems in Go and TypeScript on AWS.
I take systems on end-to-end, not in pieces. By the time I leave a codebase I've touched its schema, its deploys, its identity layer and its on-call playbook. I write the decision before the code. The alternatives we rejected. The cost we're choosing to pay later.
I work on the engineering side of AI. Retrieval, evaluation, guardrails, cost. Calling the API is the easy part. Knowing whether the answer is grounded, and what it cost, isn't. My guardrails are code. A rule the model can ignore isn't a rule.
Right now that's Open Finance, in a regulated Brazilian fintech. Before that: two years on a Belgium-based multi-tenant SaaS, a licensed real-money game platform as the only engineer, a corporate travel platform for an airline, and a SaaS of my own.
// C1 English. 6 years remote with EU, US and Brazilian teams. Based in Brazil.
I build the AI systems that my own product and my daily work run on. Cortex is an LLM assistant for adults with ADHD that I design, build and operate end to end. Behind my work sits a multi-agent system that runs my day, my finances and my meetings, ships reviewed code, and remembers every decision I make. Both follow one method: the design is written before the code, every prompt change is measured, and the rules that matter are enforced by code.
Cortex, my own AI product (2026 to present). An assistant for adults with ADHD that brings the day's plan to the person at the moment they need to act, now in testing with people with ADHD. It takes the first move, offers one named thing instead of a list, and writes nothing until the person taps. It rests on Barkley's finding that ADHD is not about knowing what to do, it is about doing it without someone carrying the load. I run it end to end, and merge to main is a deploy. TypeScript on Cloudflare Workers, Postgres, models behind one gateway.
- Structured output as a contract. The assistant can only pick from a closed set of actions, so an invented action never reaches the product. A strict JSON schema is enforced by the provider and validated again after parsing, and a retry names the error.
- The model proposes, the code applies. The assistant never changes anyone's data on its own say. Only deterministic code writes, every id the model returns is checked against current state, a single write gets an undo, and a batch asks for one tap with the count.
- Proactive by design. Cortex reaches out at the person's hour instead of waiting to be opened, and escalates when a task keeps getting refused. A scheduled beat decides who to nudge, reasoning is on for it and off for live conversation, and a per-request deadline cancels a slow model call so the person always gets an answer.
- Memory the person can audit. Every fact carries its provenance (observed, told or inferred), only confirmed facts reach the prompt as fact, and the person can see and delete everything stored about them. A cheap filter, an LLM judge (fail-closed, isolated) and a grounding check guard every write.
- Guards that fail safe. Every place where code decides from free text was audited for what a miss does, and the unsafe ones were rebuilt so a miss stays silent instead of writing. Replies about state are checked by meaning, not by word lists. The model may veto, never aim: it extracts into typed fields and the code validates.
- Premise reviews. A product rule that keeps causing patches is rewritten before more code is written. Rules live in a numbered decisions log, a product critic agent classifies every finding, and a counter flags a rule hit three times in two weeks. The first pass amended four rules and retired six.
- Prompts ship with a measurement. No prompt or scoring change merges without a fresh result. A prompt lock pins the hash of the system prompt and of the scoring rules to the median of several bench runs in CI, and variants run as A/B on the same cases with the control beside them. The conversation model was chosen by measuring latency and schema support on real calls.
- Red-teamed write path. The path that writes to a person's profile is attacked, not just the reply. Hand-written prompt injection and the garak scanner run through the real write path and block the PR on a repeated breach, with the false-refusal rate measured beside violations. One finding became a grounding rule in code.
- Every call traced, exact cost, reproducible evals. Every model call is traced with route, tokens, latency and the exact cost the API charged, so a bill or a slow reply always has a cause. Benchmarks pin provider, parameters and seed, and check the key's remaining budget before spending.
- Retrieval over my own notes. I ask my notes a question and get the answer with file and line. A Python indexer builds local multilingual embeddings on CPU with no API call, search fuses vector and keyword by best rank, and a temporal knowledge graph on SQLite adds entities and superseded rules. A gold set scored by hit@k and MRR picks the default search.
- Day Driver. My day runs through an operating layer built for ADHD. I dump everything in my head, it asks only what it must, and it gives me one action at a time with a time-box, priority anchored on urgency, and a morning seed from my active fronts. Commitments live in a durable task file with a duplicate guard, and due tasks reach my phone as a push, once per task per day.
- Finance system with bank integration. I stopped typing my expenses. A Python pipeline pulls consented bank accounts through an Open Finance aggregator, sorts every transaction into exactly one bucket with an assert that the totals close, and feeds my cash-flow spreadsheet.
- Meetings that leave decisions behind. A recorded call becomes decisions and tasks, not just a transcript. Mic and system audio are captured as two tracks so speakers separate by channel, then transcribed in chunks with retry. The agent writes the decisions on top and proposes only work commitments with a deadline as tasks, which I confirm.
- Daily English drill with a mistake log. I produce the sentence first, the agent corrects the real error toward natural US phrasing, and a persistent log resurfaces my recurring mistakes as a self-quiz before any new material.
- Job-search bot. It watches job boards and sends me only what fits. Filters, triage and score are deterministic rules backtested against stored postings, and the model only writes the one-line fit summary.
- Ops hub with typed agent returns. Every agent, local or remote, reports into one inbox, and I see only what needs me. Each return ends with two machine-read lines: a JSON object with kind and the decision needed, and the concepts touched. A versioned rule set sorts urgent, batch and silent, and an answer to a stale revision is refused.
- Multi-agent review. Nothing merges on an agent's own word. An executor builds in its own worktree, then a reviewer, a product critic and a legibility pass look at it, and each new head gets a delta review. Tests are attacked by mutation, and a hook denies the merge until the artifacts cover the current commit.
- Hooks and playbooks. The rules that matter cannot be forgotten, because code enforces them and each task gets its own. Hooks refuse a bad edit at write time, hold tracker writes for my ok and deny a merge without a review for the current commit, and a hook injects the playbook for the task it detects in my prompt.
- Context rotation and model routing. Long sessions stay sharp and cheap. A handoff generated by code starts a clean session past a context threshold or when a prompt cache has gone cold, and each task runs on the cheapest model that can do it, pinned per agent: mechanical work on the small model, building on the mid tier, judgment on the top tier.
Regulated Brazilian fintech. Open Finance data platform, TypeScript and NestJS on AWS and Kubernetes. I led the design of the Open Finance data cache end to end and built the team's AI harness.
- Designed and built the Open Finance data cache, presented to the fintech's Open Finance board: customers' banking data is collected on a schedule and served from a read model, so a screen never spends the customer's regulatory call quota. CQRS on ingestion, append-only S3 for audit, Aurora PostgreSQL for serving, NestJS workers on Kubernetes.
- Treated the cache as a quota shield, not a speed layer. The regulator caps statement reads per account per month (8 for a date range, 240 for the recent window), so a miss returns empty and never calls the bank. I found my own design assumed the wrong ceiling before anything ran, moved the hot path to the right endpoint, and corrected the documents at the source.
- Simulated the deletion window before switching it on: a fake clock, a scripted bank, one collection per day, every scenario with the flag off and on. The simulation caught that a truncated page read counts as complete, so two truncated reads in a row would mark a live transaction as deleted. It became a precondition of the flag.
- Closed the boundary between domain libraries in the modular monolith: 66 imports reached into other libraries' internals and a dependency cycle was held together by forwardRef. Public API per library, a port for the inverted dependency, and lint rules as a fitness function so it can't come back.
- Made collection safe across workers and quota: lease-based work distribution with write fencing, call budget reserved before the call, failure on its own backoff curve instead of the success cadence, terminal state for revoked consents.
- Got data integrity without a transaction on object storage: a collection is written whole or not at all, the pointer only advances after the data lands, every unique key column is non-null, keyset pagination with an explicit tiebreaker.
- Designed the modular monolith that replaced two legacy backends by Strangler Fig with contract parity, one database per domain through named connections.
- Found the CI failures the team read as noise were pods killed by memory limits before a single test ran, and fixed the job limits by measurement. Added tag-per-commit deploys to the staging cluster so "ready" means proven on the pod.
- Ran the team's security review on payment, enrollment and consent flows: authorization scope from the token's own claims, never from an id in the URL. Every fix proven by mutation testing. Every design in C4 and an ADR before code.
TypeScript · NestJS · MongoDB · Aurora PostgreSQL · AWS S3 · IAM · KMS · BullMQ · Redis · Keycloak · Kubernetes · GitLab CI · Open Finance · Pix
Software consultancy based in Belgium, clients in Europe and the US.
A Belgium-based salon-management multi-tenant SaaS. Go backend, two Next.js frontends and the AWS infrastructure, PostgreSQL with PostGIS. Two years on this platform, from an empty repository to the features the business runs on.
- Designed the Go backend behind the salons' back office and storefront: ports and adapters, two OpenAPI-contracted APIs generated from code and drift-gated in CI, TypeScript types generated from the same contract so a DTO change breaks the frontend at compile time.
- Built the online booking customers use: an availability engine over staff, services and opening hours, recurring appointments in the tenant's timezone, a waitlist, and advisory locks so two people can't book the same slot.
- Automated invoicing for every salon: an online order becomes an invoice in the accounting ERP with no manual step. Webhook acknowledged fast and processed from a queue, idempotency by the state of the destination, dead-letter queues with alarms.
- Kept the ERP's OAuth token alive in production: rotation with compare-and-swap on DynamoDB so two refreshers can't break the chain, a circuit breaker that separates a terminal refusal from an ambiguous one, and a stop-then-start deploy so only one writer ever holds the token.
- Integrated four platforms behind the same boundary: the accounting ERP, an e-commerce platform migration, an identity provider synced by webhook, and a reviews source cached in the database. Plus a self-healing monitor that re-enables webhooks the commerce platform silently disables.
- Kept every salon's data isolated and erasable on request: shared-schema multi-tenancy with fail-closed per-tenant RBAC, and GDPR Article 17 erasure by transactional anonymisation.
- Tuned what was slow in production: a count query carrying five joins that never changed the count, cache invalidation moved from KEYS to SCAN, cursor pagination where offset skipped rows.
- Provisioned and operated the platform as code across three environments in two AWS regions: OpenTofu with plans reviewed in pull requests, autoscaled ECS Fargate, Go Lambdas on a custom runtime, CI/CD on OIDC-federated credentials, anomaly-detection alarms on the production database, Sentry with fingerprints.
- Put AI into the team's CI: automated code review on every pull request and end-to-end test agents on Playwright.
A licensed real-money game platform (online backgammon on web and Telegram). NestJS, PostgreSQL, React and Phaser/WebGL on AWS, as the only engineer, working directly with the client.
- Built card and crypto payment rails from zero, on ePay (card payment gateway) and Calypso (crypto payment gateway): the provider's unsigned callback only triggers a server-side check, credits land exactly once under concurrent webhooks (proven by the database sequence, not by logs), a scheduled sweep reconciles pending payments, and crypto payouts run on the production gateway.
- Measured the schema rollback on the money table in both directions before deploying it, so the rollback door was a deploy decision, not a risk.
- Implemented the player protection the gaming licence requires: rolling-window deposit limits with cooling-off, a single open checkout per player so concurrent checkouts can't breach the cap, session limits with forced logout, irrevocable self-exclusion, and withdrawals gated on KYC with device fraud signals.
- Built the KYC and fraud-detection integrations from scratch, on Shufti Pro (identity verification) and CrossClassify (device and behavioral fraud detection), and read the fraud vendor's API contract before a scoping meeting to show the risk model had to be ours, not configuration.
- Closed an account-takeover path in a sign-in flow that had already passed review, by inverting who may assert identity and adding proof of possession in the PKCE pattern.
- Audited every player-reachable handler for ownership checks, found the ones that forgot, and replaced per-handler checks with default-deny by route metadata. Revocation checked on every request and WebSocket, so a blocked player loses access at once, inside live games too.
- Diagnosed a white screen on iOS Safari nobody could reproduce: an instrumentation probe counted WebGL contexts and found the engine recreated on every route. Fixed with a single persistent game instance, validated by the same probe.
Go · TypeScript · NestJS · PostgreSQL/PostGIS · Redis/Valkey · Socket.IO · React · Next.js · Phaser · AWS (ECS Fargate, Lambda, SQS, DynamoDB) · Terraform/OpenTofu · Atlantis · GitHub Actions · Huma · Chi · Casbin
Allocated to Smiles (Gol Airlines), on its corporate travel platform. Technical reference for the project: architecture documents and a design review per feature.
- Serverless event-driven architecture (Lambda, SQS, EventBridge, Step Functions, CloudFormation) · corporate travel platform
- Multi-tenant authentication with Auth0 and per-tenant RBAC · corporate travel platform
- Single-table DynamoDB with hierarchical composite keys · permissions, roles and tenant hierarchy
- Multi-level approval workflow · corporate travel requests
- GDS integration (Sabre) · flight and hotel reservations
- Architecture review per feature, correcting serverless function granularity by domain boundary · corporate travel platform
- Onboarding automation with a secrets vault (Python Slack bot + 1Password) · Enkel TI internal onboarding · cut onboarding time 40%
TypeScript · Python · AWS (Lambda, DynamoDB, EventBridge, SNS, CloudFormation) · Auth0 · Serverless
- Software Engineer · Sambatech · Sep 2021 – Jul 2022 · multi-tenant learning platforms, TypeScript, React and PostgreSQL.
- Software Engineer · Claranet Brasil · Feb 2021 – Sep 2021 · client and reseller portals on Node and React, in a two-developer team.
- Front-end Developer · SharePrime · Jul 2020 – Jan 2021 · React intranet.
The chat below is retrieval, not a prompt with my CV pasted in. Content is chunked, embedded and stored in a vector index, and a question retrieves the relevant pieces before the model answers. Runs entirely on Cloudflare: Pages Functions, Workers AI for embeddings and generation, Vectorize for the index. Ask it about the Open Finance cache or the payment rails. It answers from the same notes I'd defend in an interview.
Market analysis for World of Warcraft players, built and run by me: Battle.net OAuth2 written from scratch, session tokens stored as hashes, Prometheus and Grafana provisioned as code, Telegram alerts. A custom exporter cut scrape latency from roughly 14s to roughly 3s.
Built with my Cyrex team: a Slack bot that turns a team's messy conversation into a ready Jira ticket, grounded in the team's own Slack history by semantic retrieval, with a human approving every ticket. Retrieval started on Pinecone and moved to MongoDB Atlas Vector Search to drop a dependency.
dAIvid: Slack/Jira workflow bot with human review and semantic retrieval over Slack history on MongoDB Atlas Vector Search.
Python Slack bot on the 1Password API that delivers each new hire's credentials at Enkel TI. The only engineer to get the 1Password integration working.
Developed a build generation tool in Go and GitHub Actions, automating NFS scans and release scheduling for Avalanche Studios.
- Structured output and schema-constrained generation
- Hybrid retrieval (BM25 + vector)
- pgvector (HNSW), Cloudflare Vectorize, MongoDB Atlas Vector Search
- Evals: golden sets, prompt lock, LLM-as-judge, mutation testing
- Prompt injection defense, red teaming (garak)
- Cost and latency tracing per model call
- Multi-agent workflows, agent harnesses, MCP
- OpenRouter / LangGraph
- Go
- TypeScript
- Node.js
- NestJS
- Chi / Huma / Hono
- REST
- OpenAPI
- GraphQL
- React
- Next.js
- Astro
- Tailwind CSS
- React Admin
- Playwright
- Cypress
- Vitest
- Jest
- Testify
- TDD
- Mutation testing
- Contract tests against real infrastructure
- AWS (Lambda, ECS Fargate, SQS, SNS, S3, EventBridge, DynamoDB, RDS/Aurora, IAM, KMS, CloudWatch)
- Kubernetes (application side)
- Cloudflare Workers
- Terraform / OpenTofu
- Atlantis
- CloudFormation
- Docker
- GitHub Actions
- GitLab CI
- PostgreSQL (PostGIS)
- Aurora
- SQLite
- DynamoDB
- MongoDB
- Redis / Valkey
- pgvector
- OAuth2 / OIDC
- Auth0
- Clerk
- Keycloak
- Casbin (RBAC)
- AWS IAM
- PKCE
- Sentry
- CloudWatch
- Prometheus
- Grafana
- Structured logging
- Architecture drawing before code (C4)
- ADRs
- Event-driven architecture
- Ports and adapters
- Modular monolith
- Serverless
- Infrastructure as code
Ask about the Open Finance cache, the payment rails, Cortex, or how I work with agents. Type clear to reset.