WisePerformer is a multi-tenant SaaS ERP for small-batch manufacturing: tech cards, QR-tracked baskets, an operation timer, per-operation payroll, product costing and stock forecasting. The idea was proven by three prototypes in July 2024; the 2026 product is built solo, with a disciplined engineering method. The engineering bar: 272 backend + 11 frontend automated tests, all green.
The whole product concept was written down in July 2024: QR tracking of operations, per-operation payroll, load monitoring, statistics. Three prototypes tested the idea. A year and a half later it became a production multi-tenant SaaS.
17 database models in one file. The README already describes the full product: QR time tracking, per-operation pay, load forecast.
A one-day auth spike, then a real SPA split: Django + DRF + JWT in httpOnly cookies, React + MUI. A manager menu of 6 tiles. Only 1 of 6 worked.
The idea waited. The 6 tiles of the prototype stayed a written promise.
Brand and landing first, then the ERP: 8 Django apps, schema-per-tenant, React 19 SPA, Grafana, Traefik.
272 green tests, the landing's design tokens, a dark theme, a make demo runbook. The product is ready to show itself.
The manager menu drawn in the ProductERP prototype on July 13, 2024 was a roadmap. Five of six tiles were placeholders back then. In 2026 all six are live modules.
Each client company gets its own subdomain and its own PostgreSQL schema.
Traefik routes the subdomain, Django middleware switches search_path per request,
and the public schema keeps only auth and company registry. Analytics lives in
dedicated SQL views read by Grafana.
The core scenario of the product. A basket of parts travels through the shop, and every step feeds the same database: output, stock, wages, analytics.
An ERP for workshops that assemble or sew in batches: the shop works with baskets and a timer, the manager works with orders, costs and payroll, the owner watches dashboards.
Every basket carries a printed QR. A worker scans it with the camera and gets the exact next operation from the tech card, with a video instruction and a time norm. Start, pause, finish, log rejects with photos. A DB constraint allows one active run per basket. Continuations carry time over without double counting.
Net worked seconds times the employee rate, overtime per day with configurable rounding. Payroll periods run draft, calculated, approved, paid, with adjustments and a computed balance. The payout breakdown shows every operation run behind the number.
Materials by tech card norms times purchase price, plus labor: operation time norms times an hourly rate, with per-operation overrides. Incomplete data becomes a warning, not a silent zero. Demo product: 425 materials + 152.50 labor = 577.50 per unit.
Stock via movements, reserves per order, automatic write-off when a basket is released. Output is recorded once, on the final operation of the tech card. The consumption forecast answers the real question: how many days until this material runs out, and how much to buy for the horizon.
Departments, roles and module permissions, employee statuses, work schedules. Each employee keeps a work history: which operations, how long, at what quality. Permissions are granted per module: view, edit, delete.
Analytics views live in PostgreSQL inside each tenant schema. Grafana shows department throughput, employee efficiency and plan vs fact; the iframe switches theme together with the app.
A product in progress rests on discipline, not heroics. Every guarantee is written in code: a test, a DB constraint, or a configuration default.
A full pytest run on PostgreSQL and Vitest + MSW on the frontend. Payroll, warehouse and production-fact logic have dedicated test files on isolated databases.
An integration test drives a basket through the timer API from scan to output and checks that stock was consumed and wages accrued. Plus a clean makemigrations check.
TypeScript across the frontend, a type-checked production build, 0 browser console errors across all screens in both themes.
Fail-closed multi-tenant isolation: middleware refuses a request without an explicit tenant schema. IsAuthenticated by default for the API, per-employee module permissions.
One active run per basket as a partial unique index. Output recorded once, on the final operation. Stock write-off is idempotent: a repeated call never deducts twice.
One command brings up PostgreSQL, Django, Grafana and demo data with 346 operation runs. The stack deploys in minutes on a clean machine.
The product is written by one person to an engineering method: a spec for every task, automated tests, a runbook and documentation. The human sets the task, verifies the result and holds the bar. Tests and typing are the contract that makes this pace safe.
One token file drives both the antd theme and the CSS variables of custom grids. The same neon blue, the same DM Sans, the same WP monogram as the product site. This page follows the same design language.
tokens.ts from the landing: accent #3D7CFF, navy scale, radius 12, DM Sans self-hosted. Feeds the antd ConfigProvider and the CSS variables of custom grids at once.
Light and dark themes with a header toggle. The sidebar stays brand-navy in both. Grafana iframes switch theme together with the app, kiosk mode with no extra chrome.
WP monogram and favicon, grouped navigation, breadcrumbs with the company name, Russian locale. The statistics page embeds provisioned dashboards: the user enters no UID at all.
The point of this case is not only the features. It is the pipeline that keeps a prototype's speed and a product's bar at the same time.
A real domain: shop floor, money, stock. Tech cards, a QR flow, per-operation payroll and costing are wired into one data loop where every hour of work is visible and priced.
Three prototypes proved the idea. A production multi-tenant ERP built solo: 8 apps, ~110 API operations, 10 screens.
272 + 11 green automated tests, a type-checked build, safe defaults, a design system and a make demo runbook. Numbers, not adjectives.
WisePerformer is my own product in progress. This case shows how I work: product thinking, speed and engineering discipline in one loop. If your project needs the same approach, let's talk.