Multi-tenant from day one
Every query is scoped by organizationId. Per-tenant webhook signing keys, per-tenant RBAC, per-tenant default geofences and cross-dock sites. Single-tenant deployments are a config flag, not a fork.
aFixplumproductThe Platform
FleetCommand is a single, multi-tenant operations system exposed through four surfaces — a web operations dashboard, a desktop power-user console, a Flutter driver app, and a 130+ endpoint REST API — backed by AWS Bedrock for AI and Mix Telematics for live GPS. This page is the architectural truth of how it's built and how data flows.
Architecture
Operations runs in NestJS on AWS Fargate, persisted in Postgres 16, with S3 for evidence (POD photos, signatures), Bedrock for AI, and Mix Telematics for live GPS. Every surface speaks the same REST and WebSocket API.
Every query is scoped by organizationId. Per-tenant webhook signing keys, per-tenant RBAC, per-tenant default geofences and cross-dock sites. Single-tenant deployments are a config flag, not a fork.
WebSocket fan-out broadcasts vehicle positions to web and mobile clients within 30 s of the GPS tick. Geofence evaluations and bay-arrival stamping happen server-side, not on the device.
POD photos and signatures land directly in S3 with KMS-managed encryption. The Order, the Trip, the Document, and the OrderEvent are written in a single Prisma transaction.
Data flow
Every state transition is a row in the database. Every status change emits a TripEvent. Audit-grade by design — your AR team can defend any invoice three years later.
Drop an Excel, CSV, or PDF onto the web upload. AI extraction (Bedrock Haiku 4.5) maps columns, normalises dates, validates client and lane references, and flags missing data before it lands as Order rows. Orders enter VALIDATED state with a parent client and zone.
The auto-allocator runs three explainable filters: contractual lane match (ContractualLane rows), vehicle availability (no active trip), and GPS proximity (closest available unit). It produces a Trip with explicit reasoning — every allocation is defendable in a Monday standup.
Bay assignment matches truck size and time slot. Driver crosses the geofence (50 m radius), the LiveTelematicsWorker stamps an arrival event, the bay clerk releases the truck, the driver app advances to LOADING → LOADED_WAITING → DISPATCHED. Every transition is a TripEvent.
Mix Telematics polls the truck every 30 s. Positions land in tracking.service, get fused with the driver phone GPS (gps-fusion.service handles disagreement and mock detection), broadcast over WebSocket to web + mobile, and evaluated against geofences for breach alerts.
Driver captures POD: 1–5 photos, recipient signature, geofence-validated GPS coordinates. Photos go to S3 directly, the Document row + OrderEvent + Order.status=DELIVERED are written in a single transaction. Bedrock OCR runs async to extract recipient and stamp metadata.
If the delivery carries return goods (empty barrels, glass crates, claims), the trip parks in RETURNING after POD instead of COMPLETED. The driver stays on the trip in the app, dispatch keeps them unavailable for new allocation, and they confirm warehouse offload with one tap to release the vehicle.
The four surfaces
A single-pane control room for dispatchers and ops directors. Orders, dispatch board, dock management, TAT analytics, and tenant administration. Real-time vehicle map fed by WebSocket. Drag-and-drop reallocation. Geofence editor. Built for fleets that staff a 24/7 control room, not a spreadsheet.
The desktop is for the dispatcher managing 100+ active trips with mouse-and-keyboard density that no browser can match. Native window chrome, OS notifications, multi-window layouts, multi-monitor support. Same data model, denser UI.
Designed for the daily reality of long-haul work, not for the App Store screenshot. Big buttons, low-light contrast, single-glance status. Offline-tolerant POD with auto-resync queue. Foreground-service GPS with battery-aware throttling. Mock-GPS spoofing detection running in production.
Everything the UIs do, your engineers can do. 130+ REST endpoints with JWT (interactive) and API key (machine-to-machine) dual auth. Per-tenant signed webhook subscriptions for downstream ERPs. SDKs in TypeScript, Python, Go, Java, C#, PHP, Ruby, Swift. Full OpenAPI spec for codegen.
AI layer · Built on AWS Bedrock
Every AI feature runs through AWS Bedrock inference profiles in eu-west-1, authenticated via the ECS task IAM role — no API keys to rotate, no third-party providers, no PII leaving your VPC.
Bedrock Haiku 4.5 reads the document, identifies the columns (orderNumber, client, address, commodity, weight, ETA), normalises dates to ISO-8601, resolves client references against your tenant directory, and flags missing or inconsistent rows before they reach dispatch. A typical 200-row Excel converts in under 8 seconds.
Every POD photo is sent to Bedrock for vision OCR. Recipient names, time stamps, and stamp/seal markings are extracted, indexed, and surfaced on the POD-history page. Three years later, your AR team can search for a specific recipient name without scrolling photos.
Live GPS progress combined with rush-hour patterns, route history, weather data, and the driver's typical pace. Sonnet 4.6 reasons over the inputs to produce an ETA confidence band — not just a point estimate. The dispatch board shows orange when confidence drops below 80%.
Type questions in plain English: "Which trips were delayed on the Mombasa corridor last week?" "Show me drivers with more than 3 geofence breaches this month." The Intelligence Center routes the query to read-only Postgres views via Sonnet 4.6 with strict tool-use guardrails.
Telematics & integrations
FleetCommand connects to the providers your fleet already uses, and pushes events into the systems your finance team already runs.
Webhook signing & securityThe stack
Production fleets don't want exotic infrastructure — they want tools their next engineer can read on day one. Every choice below is documented and defendable.
30-minute walkthrough. We'll show you the dispatch board, the driver app, the API console, and the AI layer — all on a live tenant of similar size to yours.