Tech Stack (CEO approved 2026-03-03) Tech Stack (CEO approved 2026-03-03) Decision Date CEO Approval: 2026-03-03 Supersedes: Express + TypeScript backend, monolithic Next.js frontend Backend Component Choice Rationale Language Kotlin Type-safe, JVM performance, JetBrains ecosystem Framework Ktor Coroutine-based async, lightweight, idiomatic Kotlin Database PostgreSQL 16 Rock-solid relational DB, JSONB for flexible fields ORM Kotlin Exposed Type-safe SQL DSL, no annotation magic Build tool Gradle (Kotlin DSL) Standard for Kotlin/JVM projects Testing Kotest + Testcontainers BDD-style tests, real DB for integration tests Auth JWT (24h expiry) + refresh tokens Standard stateless auth Queue Kotlin coroutines + Redis Async jobs: label generation, carrier calls Frontend — Micro-Frontend Architecture Component Choice Rationale Framework React 19 + TypeScript Stable, large ecosystem Bundler Vite + Module Federation MFE-ready, fast HMR Architecture Micro-Frontend (MFE) Each feature independently deployable Shared UI Tailwind CSS 4 + shadcn/ui Design tokens in packages/ui/ State Zustand per MFE Lightweight, no global store coupling MFE Structure MFE Responsibility Deploy shell Layout, routing, auth, navigation Always mfe-inventory Inventory management, bin locations, cycle counts Independent mfe-orders Order management, inbound/outbound Independent mfe-picking Picking workflows, wave management Independent mfe-settings User management, integrations, config Independent mfe-ai Plock AI Chat, analytics, dashboards Independent Each MFE is independently deployable — a change to mfe-picking does not require redeploying the shell or other MFEs. AI / ML Layer Component Choice Use Case LLM Claude API (claude-sonnet-4-5) Plock AI Chat — Swedish NL queries ML framework Python microservice Isolation from JVM, flexible ML tooling Route optimisation OR-Tools (Google) Smart Picking — VRP/TSP solver Anomaly detection scikit-learn Z-score + isolation forest Forecasting (Phase 2) XGBoost / Prophet Demand forecasting Infrastructure Component Choice Monorepo Turborepo (frontend MFEs) + Gradle (Kotlin backend) Mobile (Phase 2) React Native — scanner + picking app Cache Redis Testing (frontend) Vitest + Playwright CI/CD GitHub Actions Containers Docker + Docker Compose (local dev) Architecture Decision Records ADR-001: Kotlin over TypeScript for backend (2026-03-03) Context: Previous design used Express + TypeScript. Decision to move to Kotlin + Ktor. Rationale: JVM performance for WMS workloads, stronger type safety with Exposed ORM, coroutine-based concurrency fits async warehouse operations (carrier calls, label generation). Status: Accepted by CEO 2026-03-03. ADR-002: Micro-Frontend over monolithic Next.js (2026-03-03) Context: WMS has distinct feature domains that evolve at different rates (picking vs AI vs integrations). Rationale: Independent deployment reduces risk, enables feature teams to work in parallel, allows phased feature releases. Trade-off: Higher initial complexity, but pays off at scale. Status: Accepted by CEO 2026-03-03.