23 Kampen-verified rows, linear interpolation between them, hard refusal outside 10–230 bar. Nothing is extrapolated.
EZ Break.
The platform is not allowed to invent a number.
Kampen builds the EZ Break 7.0, a hydraulic break-out unit that cracks drill-pipe joints on horizontal directional drilling rigs. It is CE-marked machinery, so every figure and every document the software shows is part of a safety file — not marketing copy. Dpixel built the product site, the operator torque reference, a per-serial document page behind a QR code, and three separate back offices for Kampen staff, machine owners and dealers.
Four constraints.
Documents are legal artifacts
A CE declaration belongs to the unit it shipped with, so document versions are bound to serial numbers — not to the product.
The numbers come from Kampen
Torque figures and warranty durations come from client tables. The software may interpolate and convert units; it may never guess.
Three audiences, conflicting visibility
Staff see everything. Owners see their machines. Dealers file claims for machines they sold — without seeing the owner’s invoice.
It is sold, not browsed
No cart, no checkout. The core objects are identity and entitlement: who owns this serial, what warranty it carries, which documents they may download.
Seven calls,
explained.
A reference table with hard bounds, not a formula
23 Kampen-verified bar → Nm rows, interpolated linearly and refused outside 10–230 bar. psi and ft·lb are exact conversions underneath, never the anchor. A test asserts every reference row is reproduced exactly.
Vanilla JS for the one component that must work
The calculator failed twice in the client’s browser as Livewire, then Alpine. Version three wires the slider as the page parses — no framework, no hydration. The gauge on this page uses the same approach.
Three panels, boundary in the guard — not the form
/admin, /portal and /dealer on one codebase. Dealers are refused the owner panel at the guard, their queries are scoped to their own dealership, and the claim form can’t be used to probe which serials exist.
A policy object that refuses to compute
While a warranty policy is unconfigured the calculator throws instead of returning a number. On approval, 24 months fill from the invoice date — never overwriting dates a human set by hand.
A public per-serial page behind a QR sticker
/m/{serial} needs no login and serves the exact document versions bound to that unit — throttled to 20 requests per minute so serials can’t be enumerated.
Every download goes through a controller
Invoices, CE documents and 3D manifests live on private disks outside the web root; access is authorised per file and tested as a property, not a deployment habit.
The manual as a wiki inside the panels
18 role-tagged articles rendered inside the admin and dealer panels, with search that requires every word to match.
14 MB of CAD,
in a browser.
Staff wanted to explore the machine by part. What arrived was a STEP export straight out of Inventor. No CAD tooling could be installed on the server and no production file could stay on it — so the route was npm and WebAssembly, run offline.
STEP received
AP214 · 98 products · 295 solids
Converted
GLB · 171k triangles · OpenCascade as WASM
Optimised
GLB · 103k triangles · gltf-transform + meshopt
Source destroyed
production CAD never needed again
// 13 named parts — the real ceiling of a flattened assembly. We reported the cause instead of shipping fake granularity.
Three phases,
no guessing.
The brief had real gaps — warranty terms, document PDFs, the dealer list. Every unknown became configuration with an explicit refusal behaviour, tracked openly instead of guessed at.
The hardest part of software for a CE-marked machine is not what it displays. It is what it refuses to display.