About

Engineer first.
Consultant second.

Seven years of production software across fintech, e-commerce, health tech, and SaaS. I've worked at the level of individual commits and at the level of cross-team technical decisions — and I know when each is called for.

Background

How I got here

I started my career as a backend engineer at a payments company, spending three years deep inside high-volume Rails applications and the PostgreSQL schemas that supported them. The scale forced a discipline around database design and query performance that I've carried into every engagement since.

After that, I joined a Go-first infrastructure team building internal tooling for a logistics network. Writing Go every day reshaped how I think about concurrency, binary size, and the joy of deploying a single statically-linked binary. I began reaching for it whenever throughput and operational simplicity mattered more than convention.

My Perl background is unusual but genuinely valuable. I spent over a year embedded with a financial services firm maintaining critical reporting systems written in Perl years before I joined. You learn to read intent in code written by people who are long gone, and to move carefully through systems where the cost of a bug is measured in dollars per second.

On the product engineering side, I've shipped React.js applications for consumer dashboards and React Native apps across iOS and Android. I'm not a front-end specialist, but I understand component architecture, state management trade-offs, and the boundary between the mobile shell and the API layer — which is often where the most interesting problems live.

I moved to independent consulting because it gives me the breadth to keep solving hard problems across different domains. I work with a small number of clients at a time so I can stay genuinely close to the code and the team.

Technical expertise

Depth across the full stack

Organised by domain. Each area reflects production experience, not side-project familiarity.

Backend & APIs

High-throughput API design

REST and event-driven APIs serving millions of requests per day. Rate limiting, idempotency, versioning, and graceful degradation under load.

GoRuby on RailsPostgreSQLRedis

Service decomposition

Extracting bounded contexts from monoliths without the big-bang rewrite. Strangler fig patterns, shared databases, event bridges, and rollback-safe migrations.

RailsGoKafkagRPC

Data pipeline & streaming

Batch-to-stream rewrites, event sourcing, CQRS, and real-time aggregation. Built for observability from day one.

GoKafkaPostgresTimescale

Legacy system stewardship

Critical Perl systems, aging Rails apps with no documentation. Characterisation tests, incremental refactoring, and forward-compatible migrations.

PerlRuby on Rails
Mobile & Frontend

React Native at scale

Cross-platform mobile architecture: JS/native bridge management, performance profiling, OTA updates, and native module integration for iOS and Android.

React NativeExpoiOSAndroid

React.js application architecture

Component design systems, state management strategy (Context, Zustand, Redux — and when to use each), SSR, and front-end performance budgets.

React.jsNext.jsTypeScript
Infrastructure & DevOps

Deployment & observability

Container orchestration, CI/CD pipeline design, structured logging, distributed tracing, and on-call runbook culture.

DockerKubernetesGitHub ActionsPrometheusDatadog

Database performance

Query analysis, index strategy, vacuuming and bloat management in PostgreSQL, connection pooling, and read-replica routing.

PostgreSQLPgBouncerRedis

Interested in working together?

See how I structure engagements and what I can do for your team.

My approach Get in touch