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 (my own TypeRules included) that
break the build, and my own ModelRules guarding the EF Core model. 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 real problems on production projects.
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
A strict, copy-able .NET setup: analyzers, style rules, type-shape rules and banned APIs that fail the
build instead of waiting for code review. Built for humans and AI agents alike, with the rules also
written out for the agent.
.NET 10 · Roslyn
Source