Decision records
Ten records. Each shows what was written, the result once applied; open one for what was proposed (context) and agreed (decision). Employers are described by system, never by name.
Agreed, then written.
The first screen is the cluster. The leader, n1, sits at the top of my portrait; each line ties a follower node in the portrait to the result it has committed. My avatar's particles replicate through the leader, and when the last batch commits the log is applied and my face opens. I built Raft and Multi-Raft myself, in Rust.
Ten records. Each shows what was written, the result once applied; open one for what was proposed (context) and agreed (decision). Employers are described by system, never by name.
In Raft, time is cut into terms and each term has at most one leader. My career reads the same way: seven terms since 2017, each led by one role. Domains only, no employer names.
The tick at the start of each bar marks the election: the change of role that opened the term.
What I work with, as the state every node applies. A node only shows a row once entry 04 has reached it. Stop a node here and its column falls behind; restart it and the leader backfills it.
| Group | n1 | n2 | n3 | n4 | n5 | Applied value |
|---|
Concept. “Agreed, then written”: I built Raft from the storage engine up, so the page is a five-node replicated log and nothing on it counts until a majority has it.
First screen. The cluster itself: the leader at the top of my portrait, four followers around it, each holding a committed result, joined by the lines entries travel along.
Reading is proposing. Each section is a log entry; reaching it makes the leader append it, followers acknowledge, and on three of five it commits. The rail (term, commit index, nodes, log) is the navigation; roles read as leader terms.
The avatar as state. Committed entries are applied to a state machine, and my avatar is that state: one band per entry in the rail, complete at the close.
Failure as a control. Stop the leader and a new one is elected; stop three nodes and nothing commits until one returns.
Type and colour. Anybody carries the protocol, its headings narrowing from width 150 to 100 as they commit; Literata carries what is written. Terracotta marks only the leader and what is in flight; settled things are ink.
Motion and access. Only replication moves; the portrait plays one term and holds; Pause stops everything; reduced motion shows every entry committed; every state is written in words.
Senior backend & platform engineer · Porto, Portugal
I build platforms that hold up in production: moving fleets to the cloud, turning batch into event streams, and, on my own time, execution platforms and safety tooling for coding agents.
Open to senior backend or platform roles, remote or hybrid
Nine years in production (since 2017)
Compute cost fell by ~70% across 200+ instances.
~70% lower compute cost — 200+ instances moved from on-prem and edge sites to cloud local zones, with autoscaling
200+ instances migrated — with autoscaling, for live sporting-event peaks
Context. A real-time platform for live sporting events ran its workloads on on-prem and edge environments.
Decision. Lead the infrastructure modernization: migrate the workloads to cloud local zones and enable autoscaling, with multi-region load tests before peak events.
Stack. Cloud local zones · Autoscaling · Go · Python · Locust
Processing success rose from 60% to 90%+.
60% → 90%+ processing success — payment settlement moved from batch to event streams with change data capture
Context. A legacy payment and settlement platform ran as batch processing on a monolith.
Decision. Move the core components to Java and Go, replace batch with streaming and change data capture, containerize on Kubernetes, and centralize logs and dashboards for the SLAs.
Stack. Java · Go · Streaming · CDC · Kubernetes
A changed worktree is a new job, never a silent retry; a worktree without a data class never leaves the machine.
Context. Builds and coding-agent jobs start on a workstation but need the CPU, isolation and uptime of a remote fleet, without leaking a private worktree or losing work halfway.
Decision. A local daemon with a socket API and a written durability contract; content-hash sync so a job runs on exactly the bytes submitted; recovery bound to that content; a versioned accounting ledger; gVisor sandboxes on VPS runners behind a data-class gate.
Stack. Go · Rust · gVisor
A failure-injection suite on a KVM host (kill mid-create, simulated reboot, duplicate RPCs, kill points 0–50 ms, a leak counter) and 23 security probes on a 22-item adversarial matrix. An unimplemented check reports SKIP, never PASS. Proposed upstream as OpenShell#4351.
Context. Can Firecracker microVMs, with the jailer, back an open-source agent sandbox runtime (OpenShell) through the whole lifecycle, and stay correct when things crash?
Decision. A compute driver with its own guest kernel, images from a verified catalog, reclamation of the previous run's VMs at start-up, and a guest flush before Stop.
Stack. Go · Firecracker · KVM
Far less to operate; contribution rules now refuse new routers, schedulers and dashboards.
Context. My agent-workflow repository had grown a router, a scheduler, a coordinator hierarchy, a provider dispatcher and a dashboard in front of three coding-agent clients.
Decision. Retire it (19 October 2026). Each client runs natively; the repository keeps shared skills, a small configuration, standalone safety tools and 26 dated decision records.
Stack. Python · Bash
Documented as a tripwire, not a sandbox, so nobody mistakes it for isolation.
Context. Coding agents run shell commands in real repositories from three clients with three hook systems; secrets once reached a model through process arguments.
Decision. One command-safety hook for all three clients; output redaction; long-lived credentials kept out of worker reach; a missing safety dependency refuses instead of being caught and allowed.
Stack. Python
A lab's user id stays reserved until its cleanup has succeeded; CA rotation cannot be bypassed by session resumption.
Context. A course platform gives every learner a disposable lab machine, created and destroyed constantly by many people at once.
Decision. A microVM lab runtime with a chaos test that kills VMs mid-session; idempotent resets by key; mutual TLS on a control-plane CA with reload without restart; pinned keyless signing that fails closed.
Stack. Go · Kotlin · protobuf
Built layer by layer as a study; each phase is a commit history.
Context. The fastest way to understand a distributed database is to build its layers in order and see where each guarantee comes from.
Decision. Disk manager, buffer pool, B+ tree, heap file and write-ahead log; SQL parser, planner and Volcano executor; 2PL then MVCC; Raft, Multi-Raft with range sharding, Percolator-style transactions, SSI with hybrid logical clocks, an S3 backend and the PostgreSQL wire protocol.
Stack. Rust
The extension never fills a form the owner did not approve.
Context. A personal job-search tool runs on several desktops plus a browser extension; data must sync without a central source of truth.
Decision. Tombstones pruned only once every active desktop has applied them; fill tokens signed on the desktop with a P-256 key from the OS keyring; an encrypted vault export; an LLM judge measured against blind readings.
Stack. Go · Rust
Switching on a directory change went from about 3.8 s to about 0.5 s.
3.8 s → 0.5 s directory switch — gitshift identity switch on directory change, release v2.1.x
Context. Several GitHub and GitLab accounts on one machine means juggling keys, identities and signing by hand.
Decision. One command switches Git author, SSH key, commit signing and the GitHub CLI account, by alias or automatically by directory; releases through GoReleaser and a Homebrew tap.
Stack. Go · GoReleaser · Homebrew
2025–2026 · Cloud contact-centre platform
Load tests to inform cost optimization and Kubernetes autoscaling; graceful shutdown and connection draining in a shared Helm chart; CI repaired with quality gates; codebase rules for agentic coding, shared with the team.
2023–2025 · Real-time platform for live sporting events
Led the move of on-prem and edge workloads to cloud local zones with autoscaling (AC-001); real-time, event-driven services on serverless and containers; Go and Python automation; Locust multi-region load tests for peak events; CI/CD across GoCD, GitHub Actions, Jenkins, Buildkite, Ansible and Packer; metrics, logs, traces and alerts.
2022–2023 · Payment and settlement platform (consulting)
Led the modernization of a legacy payment and settlement platform to event-driven streaming and CDC (AC-002).
2021–2022 · E-commerce marketplace, several countries
Backend services in Go, Java, Node.js and Groovy for post-purchase and payment workflows; faster claim and dispute resolution.
2019–2021 · Core banking, Brazil
Monoliths and mainframe-based systems modernized into Java and Spring microservices; migration of microservices to the public cloud under regulatory SLAs.
2018–2019 · Fintech CRM
Real-time CRM features integrated with banking services such as loans, OTP and account management.
2017–2018 · Software house
CRM and warehouse management systems in PHP and JavaScript.
Watch and approve agent sessions from any device: a Rust core over UniFFI, pairing scopes bound to the consumed token.
Rust
Eleven on-heap versus off-heap lock-free scenarios with JMH, and 13 serialization frameworks behind one endpoint. Numbers not quoted until re-run with raw output.
Java · JMH
Federation 2 across Java, Go and TypeScript subgraphs, gRPC between services, SLO burn-rate dashboards.
Java · Go · TypeScript · gRPC
A management system for tutoring schools: live lessons with recording and consent, TOTP and lockout, a finance ledger ported to Go and checked by replaying a shared corpus.
TypeScript · Go · PostgreSQL
An LLM pipeline that writes and checks engineering lessons, with an independent critic that excludes the author.
Python
An engine for animated technical diagrams: a ThorVG WASM renderer and performance budgets in CI.
TypeScript
A Linux studio for recording and editing technical videos, with cuts snapped to silence.
Rust
Reusable GitHub Actions for Java teams: a Java 11 to 25 matrix, security scanning and SBOMs.
GitHub Actions
Firecracker compute driver proposal, from AC-004 (open source). · open
A gateway reporting "database is locked" under two concurrent clients. · open
SSH OAuth forwarding, pairing-offer rotation without restart, security events, isolation from external agent config. · 9 open, 1 closed
Tech.ish Thoughts, a collaborative tech blog and GitHub organization (actors, JVM serialization and off-heap work, reusable CI, gitshift).
The Actor Model, at a DevOps community meetup in Porto.
Mentors Brazilians entering software engineering through an NGO.
Associate's degree, Systems Analysis and Development (2016–2018).
Portuguese (native), English (full professional, C2), Spanish (limited working).