Four surfaces, one core
Everything below was built for one PPE and workwear supplier, on one accounting and inventory core, mostly unprompted. Together they cover the whole chain: a customer asking for a price, the order being packed, the delivery being signed for, and a specific worker collecting a specific pair of boots on a mine site.
The same idea sits under all four. The data already exists — it is just in the wrong shape for the person who needs it. Products are flat invoice lines; a customer needs grouped products with sizes. Orders are line items; a packer needs boxes. Deliveries are invoices; a driver needs a signed record with a photo. Stock is a ledger; a worker needs to know what they are allowed to take.
They were built in that order, over about seven months. The catalogue came first, in April 2026, and building it meant learning how the business structures its products and how its accounting system actually behaves. By the time I turned to the internal operations at the end of September, I already knew the core — which is why delivery, packing and issuing took five weeks rather than five months.
From April 2026 · the customer-facing surface
Catalogue & Quote Platform
The public catalogue, a custom workwear builder and a quote flow that lands as a real draft estimate in the supplier’s accounting system. Around 10,800 lines across 50 modules, reading from two Zoho APIs and writing back through one.
What was broken
- Products live in the accounting system as flat, ungrouped invoice lines — “boot, grey, 06” and “boot, grey, 07” are separate records. Nothing a customer could browse.
- Quote requests arrived as emails and had to be retyped into the accounting system by hand.
- Custom workwear enquiries had no way to express fabric, colour, reflective tape and logo placement, so every one started as a conversation from scratch.
How I thought about it
- Group on the way out, not by hand. The plugin reads a product-name field where one exists, and otherwise parses each item name into product, colour and size. It handles two-tone colour codes, hyphenated sizes, colour words before or after the size, and sorts sizes properly so S comes before L and numerics ascend.
- Never silently drop a duplicate. Where the same product, colour and size appear twice, one is kept — in stock first, then the most complete record, then the oldest — and every hidden item is listed in an admin report rather than disappearing.
- Swap only on success. The daily sync reads every active item in pages, writes to a staging table, and only replaces the live catalogue when the whole run completes. A failed sync leaves yesterday’s catalogue standing.
- The website never prices anything. A quote request becomes a draft estimate at zero value for a human to price, with the customer’s details attached as an internal comment that never reaches the customer’s PDF.
- Never blocking. In the workwear builder, a line that fails a stock or minimum-order rule still reaches the rep, carrying the reason. The rule informs; it does not refuse.
- Degrade, do not fail. Requests are saved on the site first and pushed with retries. If the accounting system rejects a salesperson name the quote is created without it and the fix is logged; if sign-in breaks the team is emailed and requests queue until it works again.
- 10.8k
- Lines of code
- 50
- Modules
- 2
- Zoho APIs
- 200
- Items per sync call
- 300
- Max quote lines
Live and public. The link is held back for now because it names the client, and the three systems below are written up anonymously.
30 September 2026 · for a PPE and workwear supplier
ShipShape
A delivery and proof-of-delivery system. Drivers capture signed PODs on their phones, the office schedules and tracks every delivery, managers get a live dashboard and a report every night.
What was broken
- Delivery status lived in spreadsheets and personal chat messages, so nobody had one view of what was packed, scheduled, out or delivered.
- A copy of the invoice doubled as the proof of delivery, so there was no signed record with a time, photos or exceptions.
How I thought about it
- Off-the-shelf first, for months. From April I installed and trialled ready-made delivery apps instead of building anything. None of them fitted how the business actually worked. In the same months I was building the catalogue, which meant learning their product data and their accounting system from the inside — so by the end of September I knew both the problem and the core it had to sit on. That is why the first version went live the day I started writing it.
- One record, end to end. The same delivery moves from packed to scheduled to out to delivered, so every screen and every report agrees.
- Build for the floor, not the demo. Username and PIN sign-in, because warehouse staff have no company email. Offline capture, because signal on the road is not a given.
- Nobody asked for it. I saw it, scoped it and built it.
- 40
- Screens
- 18
- Permissions
- 22
- Roles
- 30
- Active accounts
- 10
- Teams
- 8
- Systems connected
- 70
- Training lessons














Every screen shows invented test data loaded into the browser for these shots. No real customers, staff, orders or company names appear, and nothing was saved to the live system.
Live 2 November 2026 · warehouse floor, same supplier
Box Clever
The packing end of the same delivery record. Packers split each order into boxes on screen, a weigh-and-label station weighs every box and prints its label, and a dashboard shows the day’s packing at a glance. It feeds ShipShape, so every box can be traced from packing to a signed delivery.
What was broken
- Packers wrote every product’s SKU, name and quantity out by hand on a pre-printed, colour-coded label and taped it to the box with clear tape.
- Nothing recorded what was actually in a box, so a disputed delivery came down to whose memory you believed.
- No box weights, and no way for a manager to see how packing was going until the day was over.
How I thought about it
- The app does the saving. Packers get a permission profile that opens only the packing screens, and every change goes through the app’s own functions, so records cannot be edited by hand.
- One scan to the right box. The station finds a box from the barcode on its contents sheet, so nobody types box numbers under pressure.
- Reprints are accountable. A label printed again needs a reason, and every print records who labelled the box.
- A recorded way round the station. If the weigh step gets skipped, the app asks who and why, then lets the packer weigh and print instead. People will always find a way round; better it leaves a trace.
- Write before the door closes. The accounting system locks a package the moment it ships, so the order of operations is the whole game: the final packing values are written first, and only then is the shipment created. Two things can start that check — the invoice being sent, or the last label being printed — so a package finished after invoicing still ships by itself. A package still being labelled is never shipped; dispatch is told instead. Other teams’ packages are left to the existing manual process, and the whole thing is safe to run twice.
- A known gap beats a silent one. Packages shipped before that fix existed can never be updated — the accounting system has locked them for good. Rather than let those disappear the moment the retries stopped, a report lists each one with its reason, so the gap is recorded rather than forgotten.
- Retry, but know when to stop. A nightly job retries any write-back the accounting system rejected. Some rejections can never succeed, so the system recognises those, records that it has stopped trying, and goes quiet rather than failing into the log every night forever. Recoverable errors keep retrying, and no audit row is ever deleted.
- Write only when something changed. Each write compares against what was last sent, so labelling twenty-three boxes of a twenty-four-box order costs no API calls at all, and a reprint only writes if the weight or the labeller actually differs.
- 47
- Server functions
- 13
- Custom APIs
- 10
- Data forms
- 25
- Versions in 36 days
- 2
- Printed outputs
- 11
- Training lessons







Live since 2 November 2026 with one packing team. Fifty-four boxes recorded to date, twenty-one of them since go-live, eighteen weighed and labelled at 157.9 kg. Count published with the client’s approval. Screens rendered from the real app code with invented test data on a test machine; the company name and logo on the printed label and insert are replaced with a demo name.
Rolling out from November 2026 · mine sites, same supplier
Kitroom
The PPE store, run properly. Who may collect what, issuing at the counter, signing, returns, stock counts, top-ups and deliveries — with every signed issue invoiced in the accounting system automatically.
What was broken
- An Excel application with macros on each store PC, posting to a desktop accounting package on that same machine. Every site was its own island.
- An older low-code app elsewhere that had reached its limits for speed and volume.
- The rules for who may have what lived in spreadsheets and were checked by hand, with extras approved by note, letter and email.
- Head office could not see stock, issues or counts until someone sent a file, so top-ups were guesses.
How I thought about it
- The matrix decides, people approve. Nothing beyond an allowance is issued without an approval or a written reason, and every exception is labelled in the basket and in that person’s history.
- Everything happens once. Stock moves, invoices and accepted deliveries each carry a unique key, so a double tap, a retry, or a sign-off arriving from two apps can never count twice.
- The accounting system stays master. Kitroom prepares and checks; it never places, voids or deletes.
- Money stays at head office. Store and mine users never see prices — not on screen, on slips, in exports, or in error messages.
- 150+
- Automated tests
- 11
- Functional areas
- every 5 h
- Fit-for-duty check-in
- permanent
- Demo environment
















Screens come from a private demo copy filled with invented data: a made-up mine, two stores, forty fictional people, two months of pretend history, wired to a simulated accounting system. Names, prices and codes were replaced before each shot, and every image was re-saved so no metadata travelled with it.