Compile-time safety · EF Core
LinqContraband
A Roslyn analyser that reads your LINQ the way the database will. N+1 queries and client-side evaluation get caught in the editor, not after a slow page has annoyed everyone.
Full-stack engineer · 10+ years in fintech
I’m George — a full-stack engineer who builds the whole thing: React/TypeScript frontends, .NET back ends and iOS apps — plus the Roslyn analysers that move a failure from a late-night incident to a red squiggle in your editor.
var recent = db.Orders
.ToList()
.Where(o => o.Total > 1_000)
.OrderByDescending(o => o.Date); .ToList() ⏎ In this issue
A short index of recent work, with the rest tucked underneath.
Selected work
Most of the open-source work sits just before the mess: analysers, source generators and CLIs that make bad code complain early, where it is still cheap to fix.
Compile-time safety · EF Core
A Roslyn analyser that reads your LINQ the way the database will. N+1 queries and client-side evaluation get caught in the editor, not after a slow page has annoyed everyone.
Compile-time safety · DI
Captive dependencies, leaked scopes, lifetime mismatches: the bugs that look fine in tests and then embarrass you under load. This catches them while you type, with zero runtime overhead.
Compile-time safety · mapping
AutoMapper’s convenience hides its sharpest edge: the mapping you forgot. This flags missing and misconfigured maps at build, before they become a runtime shrug.
Also on the bench
Compile-time safety · config
Broken appsettings should not be a deploy-time surprise. Analysers for the .NET Options pattern that catch misbound configuration before it ships.
Reference architecture
A clean-architecture CQRS reference: MediatR, DDD, transactional outbox. The patterns that keep enterprise .NET honest and testable.
Desktop · React + Tauri
A Tauri + TypeScript desktop overlay for live Age of Empires IV match data: web-built, native-weight.
Desktop · Rust + React
A Rust + Tauri + React desktop app that hashes thousands of photos a second to clean up duplicate libraries: systems-language core, web UI on top.
The range
Ten years in fintech buys the whole map. The same person tuning the grid render also wrote the calculation engine underneath it — and the Kafka consumer feeding them both.
const { data: schemes = [] } = useSchemesQuery(); return ( <AgGridReact rowData={schemes} columnDefs={columns} animateRows />); var curve = DiscountCurve.From(market, asOf); var presentValue = scheme.CashFlows.Sum(cf => cf.Amount * curve.DiscountFactor(cf.Date)); await outbox.Enqueue(tradeRebooked, tx, ct);await tx.CommitAsync(ct);// relayed to Kafka after commit iOS games
Shipped App Store games first, private iOS prototypes after that. This is the product end of the work: screenshots, store copy, Game Center, monetisation, release notes, support pages, and all the dull bits between “it runs” and “someone can actually download it”.
Shipped App Store iOS games
Shipped iOS game · Match-3
My match-3 habit turned into a released iPhone game: hand-built boards, big cascades, no ad sludge, and a starlit garden that gives earned stars somewhere to go.
Shipped iOS game · Strategy
A small space strategy game about expanding too far, holding the frontier, and resetting a bit wiser. Fleets, research, offline progress, Game Center, the whole App Store checklist.
Private iOS prototypes
Private iOS build · Puzzle
A private prototype for the commute-puzzle part of my brain: tap the buses, load the matching passengers, and stop the station seizing up before it all goes sideways.
The archive
This list reads the public GitHub API in your browser. No server, no token. Snapshot · Jun 2026
No repositories in this filter.
About
I’m George, a full-stack engineer with ten years in London fintech — calculation engines that price pension liabilities, React/TypeScript frontends built from scratch, and the engineering standards that keep big teams shipping. Correctness really matters in that world, and it’s shaped everything I build.
I work the whole stack by preference, not necessity: the Kafka consumer, the C# engine it feeds, the React grid that makes the numbers legible. And I’m drawn to the unglamorous infrastructure of quality — the analyser that flags a captive dependency, the generator that deletes a thousand lines of boilerplate, the CLI that moves a solution without making a mess.
Good software fails loudly, early, and somewhere cheap to fix. I spend my time moving the failure as close to the keyboard as it’ll go.
Across .NET, TypeScript and Swift, the through-line is the same: move the surprise earlier, make it obvious, and keep production out of it.
Working with