NexStock

NexStock is a business operating system for small and medium businesses — one platform in place of the usual pile of disconnected tools. It brings multi-store inventory, a point of sale, quotations and invoicing, customers and suppliers, reporting and audit logs into a single system, configurable enough to fit a retail shop, a wholesaler, a workshop, a garage, a printer or a repair business.

Architecturally it is a modular monolith: a Laravel 12 API where every bounded context — Inventory, Products, Sales, Purchasing, Customers, Suppliers, Accounting, Reporting, Users, Notifications, Settings, Support — is its own module with its own domain, application, infrastructure and routes layers, and a dependency linter (Deptrac) that fails the build when a module reaches into a neighbour it has no business knowing about. The composition root wires modules together; it contains no business logic of its own.

On top of that API sit two clients: a React + TypeScript SPA for the back office and the POS, and a Flutter companion app for the shop floor — stock lookups, movements and dashboards from a phone. Both are fully bilingual (EN / FR) with light and dark themes, and — a detail that matters on shared hardware — the theme and language follow the account rather than the device, carried in a JWT claim so a fresh device adopts the right settings on first login.

The brand palette is derived from the logo rather than picked by eye, and it is documented as a contrast argument: interactive surfaces run teal → cyan, and the exact shades were chosen because they clear 3:1 against both white and near-black, with the 700 shades reserved for anything carrying white text so it clears the 4.5:1 AA threshold. Blue was retired from the brand entirely and now means status.

Inventory & stock
  • Product catalogue with variants, barcodes and unit pricing
  • Per-store stock levels with low-stock thresholds
  • Stock adjustments with reason codes and a full audit trail
  • Inter-store transfers with request / dispatch / receive states
  • Bulk import and export of products
  • Barcode scanner input on product and POS screens
  • Product detail pages with per-store breakdown and movement history
  • Store management for single-branch or multi-branch businesses

Selling
  • Touch-friendly POS with keyboard shortcuts
  • Held orders — park a sale and come back to it
  • In-POS sales history
  • Product customisation at the point of sale, for custom-order businesses
  • Quotations that convert into invoices
  • Invoices with status transitions, part payments and mark-as-paid
  • Follow-up flow for unpaid invoices
  • Printable / thermal receipts
  • Orders queue for workshops and repair jobs
  • Accounts receivable with reminder flows

Contacts & purchasing
  • Customers with per-customer history and balances
  • Suppliers with their own product catalogues
  • Supplier orders raised from a supplier's catalogue
  • Contact detail pages tying documents, orders and payments together

Business & platform
  • Multi-business workspaces with a business switcher
  • Guided onboarding wizard with logo upload and in-browser cropping
  • Users, roles and granular permissions
  • Drag-and-drop customisable dashboard widgets
  • Reports with charts (Recharts) and data tables
  • Searchable audit log of every privileged action
  • In-app notifications
  • JWT authentication with 2FA (TOTP, QR enrolment) and OTP e-mail flows
  • Password policy defined once and shared by the API rule and the on-screen checklist
  • Documented REST API with a generated OpenAPI spec, plus an integrations page
  • Billing and plan management
  • Help centre, changelog and credits pages
  • EN / FR throughout, light and dark themes that follow the account

Engineering
  • Laravel modules with enforced boundaries — Deptrac fails the build on a violation
  • Larastan static analysis and a PHPUnit suite
  • Errors carry stable error_key values; clients never match on prose
  • A mock server (MSW) so the SPA can be developed against the real response envelope
  • Playwright end-to-end coverage
  • Documented conventions for the traps that bite: actingAs() bypassing the auth provider, and Notification::fake() never rendering the mail template
One system, every counter

The back-office stock table, the point of sale and the Flutter shop-floor app — recreated from NexStock's real screens and its teal / cyan brand palette.

nexstock.app/inventory/products
NexStock NexStock
Dashboard
Products
Stores
Transfers
POS
Invoices
Reports
Products
Import Add product
1,284
SKUs
17
Low stock
4
Stores
Scan or search a barcode…
ProductStoreQtyStatus
Alu Profile 40×40Port Louis212In stock
Hinge Kit — Soft closeCurepipe14Low
Melamine Board 18mmQuatre Bornes0Out
LED Strip 5m — WarmPort Louis96In stock
Transfer requested · Curepipe → Port Louis
Multi-store product & stock table
nexstock.app/sales/pos
Point of sale
F2 hold
Alu Profile Hinge Kit LED Strip
ItemQtyTotal
Alu Profile 40×404Rs 1,240
Hinge Kit2Rs 460
LED Strip 5m1Rs 590
SubtotalRs 2,290
Due Rs 2,633
Charge Hold Quotation
Held orders
#H-207 · walk-in 2 items
#H-206 · Mr Ramjan 5 items
POS with held orders
NexStock Port Louis
Rs 48k
Today
32
Sales
Stock movements
Received · 40 pcs
Hinge Kit
Sold · 6 pcs
LED Strip 5m
Low stock 17
Flutter shop-floor app
Laravel 12 PHP 8.3 Modular monolith JWT + 2FA React 18 TypeScript Vite TanStack Router TanStack Query TanStack Table Tailwind CSS Radix UI Recharts dnd-kit Flutter flutter_bloc Larastan Deptrac Playwright MSW

NexStock is in active development. If you would like a walkthrough or a demo access account, contact me on contact@farhaan.info