
The detail behind the three cards.
Every capability with the figure that proves it, how each figure was counted, where the seven years went, and what I want next.
What I do, and the figure that proves each one.
Five capabilities, each with the measured evidence behind it. Nothing here is self-assessed.
Double-entry accounting
4 yrsI designed the general ledger: 48 kinds of financial event, 84 account categories, and the tax, cost-of-sales and year-end close that hang off them.
System architecture
4 yrsEach client gets their own database — 20+ of them, 200 tables each — running on one codebase, with company and outlet levels inside.
Full-stack .NET and React
7 yrs123,962 lines of C# and 165,556 of JavaScript across 818 REST endpoints. Both halves, one person.
Offline-first systems
1 yrThe till keeps selling with the network down. Encrypted local store, one-way sync, and crash recovery proven by killing a live process mid-write.
Security ownership
2 yrsI commissioned an audit of my own production system, unasked. It found 7 critical problems. All 7 are closed and verified.
How I work — engineering practice and the security audit
Engineering practice
- Written standards the build enforces, not a style guide nobody reads — a layer that reaches for something it should not is a failed build, not a review comment.
- The write path is ordered so that every failure is a recoverable one. The receipt prints last, after the money is durably on disk.
- Written decision records — every rule carries its why, including the designs I rejected and the reasons.
- Money is
decimalat fixed precision throughout. Full precision in, rounded once at the edge.
Security ownership
- I commissioned a security audit against my own live production system. Nobody asked me to.
- It returned 7 critical, 10 high, 8 medium, 5 low.
- All seven criticals are closed and verified. Secrets moved out of the code and default to empty, so a misconfigured server refuses to start rather than running open. Sale totals are recalculated on the server. Password reset was rebuilt. The only endpoint left open is device pairing, which has to be — it is where a till's credential is born.
- One critical-adjacent gap is still open, and I would rather you heard it from me: passwords are hashed with a single round and no work factor. It is the first thing on my list, and it is the reason I threw away my own offline sign-in design.
Business domains I have built for
Double-entry bookkeeping. Chart of accounts, cost of sales and stock valuation, bank reconciliation, year-end close. Multi-currency and exchange differences. Tax. Retail point of sale and cash handling. One database per client, and a till that works offline.
Counted from the codebase, not estimated.
Every figure below was produced by counting the repository, not by recalling it. Where a number could have been inflated, it is shown being taken back out.
How the 818 endpoints break down
One dot is one endpoint.
- POST416
- GET306
- PUT48
- DELETE44
- PATCH4
Writes lead by a wide margin. Most business software mostly reads and displays data. This one changes money far more often than it shows it, and the shape of the chart is what shows that.
What counts as a hand-written line, and what does not
- Backend C#123,962 · 733 files
- Frontend JS / JSX165,556 · 1026 files
- Generated EF migrations59,533 · 3 files
Generated by a tool — excluded from every claim on this page
How the tenants are isolated
× 20+ one database per client, so no query can reach another client’s data
16 bounded contexts · 214 entity files · 85 controllers · 78 repositories · 95 services
Counted from the source tree · 13 September 2026
Where the seven years went.
Multi-tenant ERP & POS platform
NowRetail partnership — Kuwait / GCC retail — Sole engineer. Architecture, database, deployment, production support. Live in 20+ businesses.
2025 — now
Retail POS platform
Private client, California — Built to match the feature and reporting depth of an established commercial POS. Became the foundation of the ERP.
2023 — 2025
Property management platform
Private client, Jamaica — Three portals — owner, manager, super-admin — over an accounting core.
2023 — 2024
POS & retail management product
Private client, USA — Delivered in two months, then productised and resold to further customers.
2022
Freelance — 22 contracts
8 countries — Seventeen left a public review. All seventeen were five stars.
2019 — 2024
Where the clients were — 22 contracts · 8 countries · 17 reviews, all 5-star
- 01USACalifornia — Retail POS platform, ~1.5 years
- 02United KingdomLondon — Freelance contracts
- 03JamaicaKingston — Property management platform
- 04VenezuelaCaracas — Freelance contracts
- 05KuwaitKuwait City — ERP & POS platform, current
- 06QatarDoha — Retail deployments
- 07IndiaNew Delhi — Freelance contracts
- 08GuamHagåtña — Freelance contracts
- Gazipur, Bangladesh — where all of it was built
22 contracts · 8 countries · 17 reviews, all 5-star
A product team where the numbers have to be right
Full-stack or architecture, on a product where the numbers matter — ERP, accounting, invoicing, retail, payments, logistics. I am most useful where the domain is hard and the correctness bar is high, because that is the only kind of software I have built.
I want the one thing I have never had: a team. Seven years alone means nobody has ever reviewed my code. I have run written standards, staged rollouts and my own security audit as substitutes — but they are substitutes. Working somewhere that already has review and a test culture is most of why I am moving.
Availability
Immediately. No notice period to serve. Open to relocation.
What I would rebuild, said before anyone asks
Tests on the financial code
The web platform has none, and that is the honest answer. Not because of bugs I shipped — because of the parts I refactor slowly, where nothing tells me when I have broken something. It is the first thing I would fix, and the first thing I would want a team to hold me to.
Password hashing, and the design I threw away
Passwords are hashed with a single round of HMAC-SHA512 and no work factor, and the check is not constant-time. I found it while designing offline sign-in for the till, which would have cached those hashes on every shop-floor PC. On one hardened server that is a contained problem. On fifty shop machines it is a catastrophic one. I threw the design out and escrowed a key instead. Fixing the server side is the first thing on my list.
TypeScript, and a real pipeline
1,026 JavaScript files and no types, so a renamed field is only found when a user hits it. And releases are scripted against infrastructure I run myself rather than a pipeline that gates them.
Get in touch
I am happy to walk through any of the above on a screen-share — the live system, the posting engine, the sync design. Ten minutes tells you more than this page can.
Not ready to write yet?
The first opens the platform as something you can walk through module by module. The second is the same argument on three pages, if you would rather forward it to someone than send them a link.
Gazipur, Bangladesh · Open to relocation