dan’s digital workshop
Back to projects

EWOS — from over-planning to a live InvenTree instance

Eight weeks designing an electronics-workshop management system without writing a line of code, then a build-first restart on InvenTree — which now has 175 real parts in it, correctly categorised, correctly priced and correctly counted.

InvenTreeDockerPostgreSQLREST API

Problem

My workshop has real problems: parts scattered across drawers, no way to know what I can build with what I've got, no bill of materials for any project. Eight weeks into designing a fix, I had a requirements catalogue, a UX spec and a design system — and nothing that ran. No inventory, no build, no screen in a browser.

Approach

The unblock was choosing not to build the core myself. InvenTree — a mature open-source inventory manager with Docker, PostgreSQL and a REST API — already handles parts, locations, stock, BOMs, builds, reservations and shopping lists. EWOS became a deliberate thin layer over a proven system instead of a blank sheet, restarted build-first. Two planning docs — the Master BRD v5 and Master SSD v6 (Implementation Ready) — became the actual source of truth once written, and everything since has been built to match them: every workshop item rebuilt onto a proper SKU convention (EWOS-<PREFIX>-<DESCRIPTOR>-00N) and a real category taxonomy, replacing the generic Temu-style categories the receipts came in with.

Outcome

175 real Parts are now live in InvenTree — correctly categorised, correctly SKU'd, with correct stock-on-hand, and every one traceable back to its source receipt (seller, order ID, date, price paid) via the Notes field. Getting there surfaced a genuine correctness bug: Unit Price had been calculated as price-per-pack rather than price-per-piece, wrong for roughly 60 multi-pack rows, fixed to Line Total ÷ True Total Qty. A second batch of 11 new receipts got processed the same way — 4 caught as duplicate re-uploads and skipped, 100 genuinely new line items added, SKU numbering continued rather than restarted. No physical shelf locations yet — deliberately deferred until the shelving and renovation are sorted, since the inventory data itself didn't need to wait on that. Nothing's blocking right now; the next pass, once shelving's done, is assigning locations to the 175 stock items — a lighter job than what's already behind it.

Lessons learnt

Two things earned their place in the project's running Lessons Learned doc this round. Real data work hides its bugs in the unglamorous middle, not the interesting parts — the price-per-pack error and Excel's Table ranges silently breaking when rows get appended past the table boundary both went unnoticed until someone actually checked the numbers, not the process. And tools fail silently, not loudly: InvenTree's bulk import wizard just stalls on ‘select all’ across many pages with no error message, and there's no bulk CSV path for stock quantities at all — both needed working around (paging through 25 rows at a time; the REST API directly from an authenticated browser session) rather than trusting the UI to tell me when something wasn't working.