Work
Systems that had to work on Monday morning.
A selection of engagements. Client names are withheld where the work is under agreement — details on request, and references available for serious enquiries.
2025—2026B2B distribution platformWholesale & distribution
A multi-tenant ordering platform, built with AI in months not years
- The problem
- A distributor needed to serve many customer organisations from one platform — each with their own users, branches, catalogues and pricing — while a single person might legitimately hold different roles in two different accounts. Orders were arriving by phone and email and being re-keyed by hand.
- The approach
- A layered .NET application behind a Next.js front end. Tenant isolation is enforced at the data layer by global query filters rather than by developer discipline, so a forgotten WHERE clause cannot leak another customer's data. Login resolves the tenant from the subdomain, which avoids revealing which accounts a given email belongs to. Platform administrators can enter any account for support, but the issued token is deliberately downgraded to read-only — support can see everything and change nothing.
- The outcome
- Order entry moved to self-service, re-keying errors disappeared, and onboarding a new customer organisation became a configuration screen rather than a two-week project. Delivered by one engineer with AI-assisted implementation and a written design record for every major decision.
Engineering highlights
- Tenant isolation via EF Core global query filters
- Subdomain tenant resolution with multi-account identity handling
- Read-only platform-admin impersonation with full audit trail
- Account suspension with automatic expiry and audit logging
- Passwordless login via time-limited one-time codes
- Bulk CSV user import with row-level validation and collision detection
Stack
.NETEntity Framework CoreAzure SQLNext.jsReactTypeScriptTailwind CSS
2025—2026Platform operations teamSoftware
An operations console the support team stopped dreading
- The problem
- Support staff needed a developer to answer routine customer questions, and every internal screen behaved differently from the last — so every new hire learned six interfaces instead of one.
- The approach
- A single admin console built to one documented table standard: cumulative multi-column sorting with priority indicators, per-column filters in the Excel idiom, CSV export and a consistent detail panel on every list. Behind it, user administration across accounts — enable and disable, unlock, reset passwords — with every administrative action written to an audit log.
- The outcome
- Routine support requests stopped reaching engineering, and a new support hire became productive in a day rather than a fortnight. The table standard is now a written convention that every future screen follows.
Engineering highlights
- One documented table pattern reused across every list screen
- Cumulative multi-column sort with visible priority badges
- Per-column filtering with active-filter indicators
- Cross-account user administration with audit logging
- Slide-in detail panels consistent across entities
Stack
Next.jsReactTypeScriptTailwind CSSshadcn/ui
2026Existing production systemModernisation
From secrets-in-config to a tested, hardened deployment
- The problem
- A live application kept its database connection string and signing key in a configuration file committed to source control, had no automated tests, and had no check preventing a deactivated customer's users from continuing to log in.
- The approach
- Secrets were moved out of configuration into managed secret storage. Unit and integration test projects were introduced with a test host and authentication helpers, so behaviour could be verified end to end rather than by hand. Tenant status checks — deleted, inactive, suspended — were added to the login path, with suspensions that lift themselves automatically on expiry and write an audit entry when they do.
- The outcome
- The system moved from unverifiable to tested, and a whole class of access-control bug became impossible to reintroduce silently. The work was done incrementally against a running production system with no cutover weekend.
Engineering highlights
- Secrets removed from source control into managed storage
- Unit and integration test infrastructure introduced from zero
- Tenant status enforcement added to the authentication path
- Self-expiring account suspension with audit trail
- Controllers refactored to a service layer for testability
Stack
.NETxUnitIntegration test hostEntity Framework CoreAzure SQL
Sectors served
References available on request.
Where an engagement is under agreement the client is not named here. For a serious enquiry I will happily put you in touch.
- Wholesale & distribution
- B2B commerce
- Professional services
- Manufacturing
- SaaS operators
- Logistics
Next step
Most engagements start with a 30-minute call.
No pitch deck and no discovery invoice. We talk about what you're running, what hurts, and whether I'm the right person to fix it.