George Wall

Work

Selected work.

I build Roslyn analysers, .NET tools and full-stack systems. Here is a selection, with the public archive below.

11 selected projects · 12 public repos

Main projects

Roslyn analysers and .NET tools.

Most of my open-source work is developer tooling: analysers, source generators and CLIs that catch common mistakes in the editor or CI.

LINQ001 diagnostic

Compile-time safety · EF Core

LinqContraband

A Roslyn analyser for expensive EF Core query shapes. It catches N+1 queries, client-side evaluation and early materialisation while the code is still in the editor.

error fixed LINQ001 Materialising before filtering pulls the whole table into memory. The database does the filtering. The editor flags the expensive shape before review. 1 quick fix available
OrdersQuery.cs Ln 42
db.Orders .ToList() .Where(o => o.Total > 1_000)
db.Orders .Where(o => o.Total > 1_000) .ToList()

Caught before the build. The database does the filtering. The editor flags the expensive shape before review.

diagnostic active 0 errors
Install package GitHub
DILIFETIME001 diagnostic

Compile-time safety · DI

DI Lifetime Analysers

A Roslyn analyser for captive dependencies, leaked scopes and lifetime mismatches. It checks the container graph at compile time and adds no runtime code.

error fixed DILIFETIME001 A singleton captures a scoped dependency and quietly extends its lifetime. The lifetime mismatch is flagged in the editor before it reaches production. 1 quick fix available
ServiceRegistration.cs Ln 18
AddSingleton<ReportService>() AddScoped<AppDbContext>()
AddScoped<ReportService>() AddScoped<AppDbContext>()

Caught before the build. The lifetime mismatch is flagged in the editor before it reaches production.

diagnostic active 0 errors
Install package GitHub
CANCEL001 diagnostic

Compile-time safety · async

CancelCop

Checks that CancellationToken is passed through handlers, EF Core, HTTP and Minimal APIs. The code fixes wire a missing token into the call.

error fixed CANCEL001 A cancellation token reaches the handler, then disappears at the database call. The code fix passes the token through the call chain. 1 quick fix available
OrderHandler.cs Ln 27
Task Handle(CancellationToken ct) => db.SaveChangesAsync();
Task Handle(CancellationToken ct) => db.SaveChangesAsync(ct);

Caught before the build. The code fix passes the token through the call chain.

diagnostic active 0 errors
Install package GitHub
04 selected work

Compile-time safety · mapping

AutoMapper Analyser

Checks AutoMapper profiles for missing and misconfigured maps at build time.

Install package GitHub
05 selected work

Developer tooling · CLI

CPMigrate

Moves a .NET solution to Central Package Management. It checks dependency health, verifies restore equivalence and bisects package updates that fail tests.

Install tool GitHub
06 selected work

Source generation · MVVM

NotifyGen

A source generator for INotifyPropertyChanged. Add [Notify] to a field and it generates the property and change notification code at compile time.

Install package GitHub

Full stack

Across the stack.

I’ve spent more than ten years building fintech systems across React and TypeScript, C# services and calculation engines, Kafka and SQL.

React/TS UI ASP.NET API Kafka events SQL · Redis
src/features/schemes/SchemeGrid.tsx TSX
const { data: schemes = [] } = useSchemesQuery(); return (  <AgGridReact rowData={schemes}    columnDefs={columns} animateRows />);
tsc --strict · 0 errors
The front React and TypeScript for data-heavy UIs, using RTK Query, AG Grid and Recharts.
src/Engine/LiabilityEngine.cs C#
var curve = DiscountCurve.From(market, asOf); var presentValue = scheme.CashFlows.Sum(cf =>    cf.Amount * curve.DiscountFactor(cf.Date));
LinqContraband ✓ · 0 diagnostics
The middle C# calculation engines for liability metrics, discount curves and funding ratios, with repeatable results and an audit trail.
src/Messaging/OutboxRelay.cs C#
await outbox.Enqueue(tradeRebooked, tx, ct);await tx.CommitAsync(ct);// relayed to Kafka after commit
CancelCop ✓ · token propagated
The plumbing .NET services on Kafka, using the transactional outbox, idempotency keys and schema validation.

GitHub

Project archive.

Refreshed from the public GitHub API in your browser. No token required. Snapshot · Aug 2026

DependencyInjection.Lifetime.Analyzers Zero-overhead Roslyn analyser for captive dependencies, leaked scopes and DI lifetime mismatches. C# ★ 10 today LinqContraband Roslyn analyser for EF Core queries: catches N+1 patterns and client-side evaluation before they ship. C# ★ 9 today automapper-analyser Roslyn analyser for AutoMapper maps, catching missing and misconfigured mappings at build time. C# ★ 5 2 days ago CancelCop.Analyzer Roslyn analyser for CancellationToken propagation across handlers, EF Core, HTTP and Minimal APIs. C# ★ 4 today HttpClient.Resilience.Analyzers Roslyn analysers for HttpClient lifetime, outbound resilience, response ownership and safe retries. C# ★ 3 today NotifyGen C# source generator for INotifyPropertyChanged boilerplate. Add [Notify], get the property wiring. C# ★ 2 yesterday AOEOverlay Tauri and TypeScript desktop overlay for Age of Empires IV build orders, with imports, hotkeys and voice coaching. TypeScript ★ 2 2 days ago CQRSPrototype Clean-architecture CQRS reference using MediatR, DDD and the transactional outbox pattern. C# ★ 2 9 months ago CPMigrate CLI for moving .NET solutions to NuGet Central Package Management, with restore-equivalence checks and update bisection. C# ★ 1 today ConfigContraband Roslyn analysers for .NET Options and appsettings, so broken configuration does not wait for deploy day. C# ★ 1 yesterday DuplicatePhotoHandler Fast duplicate-photo finder with a Rust core and a React/Tauri desktop interface. TypeScript 2 days ago aoe4-overlay-rs Rust/Tauri rewrite of FluffyMaguro's AoE4 Overlay - live match overlay, build orders, OBS streaming HTML 2 months ago
main
London · 51.5°N
--:--