Selected work
Rescuing a stalled rewrite
A restaurant POS platform mid-way through a Ruby-to-.NET rewrite, weeks before its release date, with no
docs, hardcoded credentials, no foreign keys and nobody who could explain the business logic. I got the date
moved to sort out requirements with the client, took over as backend lead, re-architected the backend into a
modular monolith, delivered multi-tenancy and Auth0, and hired an engineer to stabilize the team.
Brought to release readiness for a restaurant pilot
Dashboards from 20 seconds to 1
Occupancy dashboards for an office-space analytics product were taking 20 seconds over a few million sensor
readings. The problem was what we stored, not how we queried it: I dropped the data the dashboards never
needed and added the indexes they did.
20 s → 1 s response time
Halving the SMS bill
Report notifications on an employee survey platform went out as 2–3 SMS segments each, because of full names,
untrimmed titles and raw S3 links. I shortened the text and built a small base62 URL shortener, so every
message fits in one segment.
~50–60% lower SMS cost
Making AI-written code safe to ship
On the fintech product, agents write most of the code, so the rules live where an agent can't skip them:
module boundaries enforced by project references, banned APIs, and analyzers, including my own ModelRules
and TypeRules, that break the build. Architecture guides, a glossary and ADRs give the agent context, and I
review every change.
Backend, web and admin apps built by one engineer
Open source
Libraries that grew out of conventions I kept enforcing by hand in code reviews.
Your team's conventions, enforced on the EF Core model. If an entity breaks one, the model fails
to build, at startup or in a unit test. 14 rules plus DDD aggregate boundaries,
EF Core 8–10, tested on PostgreSQL, SQL Server, SQLite and MySQL.
EF Core
NuGet
Roslyn analyzers for the shape of a type, based on what it inherits or implements. Endpoints sealed
and internal, a dedicated interface per handler, entities without public setters, immutable value
objects. Configured in .editorconfig, reported while you type.
Roslyn
NuGet
ReDoc API docs for ASP.NET Core: a dark theme and a document picker for the Swashbuckle and
Redoc.AspNetCore pages you already serve, or a standalone ReDoc 3 host with per-document
authorization, a strict CSP and no third-party requests.
ASP.NET Core
NuGet