Somerset West, Western Cape, South Africa

Case Study · Multi-Company ERP · Proof of Concept

HyperOS

A custom operating system for a garage door installation business: one project number from the first phone call to the day the door is installed and paid, with a server-side workflow engine enforcing the rules a 467-page enterprise spec demanded.

ClientAspida Group · Worcester
Status● POC in build ~70%
TenantsHyper Doors · Mega Aluminium · Boland Roofing
Scale130+ tables · 27 staff · 44 vehicles
Tracked inWAID · 121 tickets

One record. One number. Six phases.

The legacy system was so disliked the owner wanted it gone. Enquiries arrived by phone and WhatsApp with no tracking; jobs moved between departments by word of mouth; stock was checked by walking to the warehouse. HyperOS replaces it with a single project spine: born at enquiry, carrying one number through survey, quote, manufacturing, installation and payment. The five WORK screens are just filtered views of this pipeline.

This page is laid out the same way the product thinks: phase by phase. Demo data is fictional; the production counts at the end are real.

The spine PRJ-2026-000047
EnquirySurveyQuoteJobInstallationDone

Every tab adds data to the same record. Nothing is ever retyped, nothing is ever a separate record.

Phases 1 to 6

The workflow engine, with its gates up

One Postgres function, advance_workflow(), validates every transition, enforces the business gates, reassigns the owner, writes an immutable audit trail and recalculates the health score. Try to advance without paying the deposit.

1Enquiry 2Survey 3Quote 4Job 5Installation Done
YOU ARE HERE: Quote
Phase 3 · Quote

Configure, price, quote: live

Sales builds a door visually; the price recalculates as options change. When a surveyor submits measurements instead, generate_quote_from_survey() produces the same costed quote automatically from 18+ fields per opening.

Door type
Material
Dimensions3000 × 2400 mm · 5 panels auto-calculated
Colour
Operation
Accessories
Price summary
Door panels (5×)R9,532
Hardware & springsR5,639
Operation + accessoriesR0
Labour 8h × R570R4,560
Production 4h × R430R1,720
Transport + tollR1,717
CostR23,168
Margin 25%
QUOTE TOTALR28,960

Accepting a quote fires one trigger that creates the project, job, work order, bill of materials, stock reservations and installation record in a single transaction.

Operations · Fleet

44 vehicles, on real roads

MapLibre GL with CARTO dark tiles; vehicles animate along genuine OSRM road geometry with Turf.js interpolation. Green is moving, amber is parked, red means the licence expired and the dashboard already knows. Tap a vehicle.

N1 R44 WORCESTER DEPOT
CW 45-873 · Moving
MovingParkedLicence expired
Every morning

The urgency row answers “what needs me today?”

🔧

Installs this week 4

Retief residenceWed 08h00-12h00
Paarl warehouseThu 09h00
De Wet flatsFri 07h30
🚗

Licence alerts 3

CW 88-01412d overdue
CA 184-22124d to expiry
📦

Stock below reorder 5

Torsion spring 55mmOut of stock
Track set 2.4m3 / 10
🧾

Overdue invoices 7

INV-2026-031121d · R18,420
INV-2026-029814d · R9,660

Each card deep-links into the right section and tab. Amounts and names in this demo are fictional.

Multi-tenant

Three brands, one codebase, eight minutes

Colours, logos and copy load from a company_branding table on login. The full visual reskin took under eight minutes because every component reads tokens, not hex codes. Click a tenant.

Aspida GroupDashboard · Pipeline · Fleet
KPI tileAccent from company_branding
Pipeline
tenant accent

In the shipped UI the sub-brand orange lives in the logo only; the working accent stays Abyssal Blue so status colours keep their meaning. The demo above exaggerates on purpose.

Design decisions

Documented in the code, not invented for this page

Dark navy UI everywhereAirwave #F6F8FE light default

Impressive in screenshots, harder to scan dense tables. Dark stayed as a toggle.

Brand orange as UI accentOrange quarantined to logos

It fatigued the eye and fought the status colours. Abyssal Blue #3A62E4 became the sole accent, written into theme.ts as a rule.

Spine created at quote acceptanceSpine born at enquiry

The spec left a pre-project gap. Moving creation to first contact gave every record one number for life.

Frontend status updatesadvance_workflow() RPC

Six client-side update calls became one server-side function that validates, gates, syncs and audits atomically.

Satellite map tilesCARTO dark tiles

Dramatic, but road names vanished and markers drowned. Dark tiles keep the fleet legible.

94 legacy screenshotsA seeded database

The only export the old system allowed. Customers, vehicles, products and invoices were extracted shot by shot into Supabase.

React Native + Expo (web export) · TypeScript · Supabase, 130+ tables with RLS · MapLibre GL + OSRM + Turf.js · Recharts · Cloudflare Pages · Resend · Playwright, 26/26 passing · DM Sans on Airwave surfaces

Screens

Captures land as the POC hardens

SCREENSHOT: Dashboard with KPI tiles, urgency cards, fleet map and charts
Dashboard with KPI tiles, urgency cards, fleet map and charts
SCREENSHOT: Fleet command centre with vehicle detail panel
Fleet command centre with vehicle detail panel
SCREENSHOT: Quote Builder with live price summary
Quote Builder with live price summary
SCREENSHOT: Unified project page, Installation tab, YOU ARE HERE banner
Unified project page, Installation tab, YOU ARE HERE banner
SCREENSHOT: Pipeline kanban with SLA timers
Pipeline kanban with SLA timers
SCREENSHOT: Enquiry tab with amber flag chips for missing fields
Enquiry tab with amber flag chips for missing fields
SCREENSHOT: Survey tab with the measurements grid
Survey tab with the measurements grid
SCREENSHOT: Quote tab with costed line items
Quote tab with costed line items
Aspida Group public landing
Aspida Group public landing
SCREENSHOT: Login with Aspida branding
Login with Aspida branding
SCREENSHOT: Sidebar with Work, Operations, Finance, People, Admin groups
Sidebar with Work, Operations, Finance, People, Admin groups
SCREENSHOT: Customers list with search and pagination
Customers list with search and pagination
130+tables, all RLS-enabled
121WAID tickets, 80+ shipped
26/26Playwright E2E passing
44vehicles on the live map
8minfull reskin, token architecture
467spec pages, gap-analysed

A formal UX audit scored the mid-build 4.7/10 and listed every stubbed button and data bug. The fix sprint that followed is why the POC is demo-ready. We publish that number because honest audits are the product.

Still running the business on a system nobody likes? We replace those.