Pick a consignment in the left rail, then trigger a scenario. Each one drives the same rule engine a real tracker feed would, so the alert, the escalation clock and the audit entries are all genuine. Nothing here is scripted at the alert layer.
Every entry carries the hash of the one before it. Editing a stored record after the fact, which is exactly what an insider covering a diversion would do, changes its hash and breaks every link that follows. Press the tamper button, then verify, and the console names the sequence number that no longer matches.
| Seq | Time | Actor | Event | Shipment | Detail | Hash |
|---|
These thresholds live in assets/js/data.js under RULES_CONFIG, and the logic in assets/js/rules.js. Tune them per corridor, not globally: a 4 km corridor is generous on the Great North Road and far too loose inside Lusaka.
| Rule | Severity | Threshold | Why it matters |
|---|
Real: the geodesic maths, the corridor and geofence checks, the rule engine, the escalation clock, the hash chained audit log and its verifier, the client scoped tracking lookup, and the handover code flow with attempt limits.
Simulated: the position feed. A fake tracker moves each truck along its route polyline and emits the same sample shape a Teltonika or Cartrack unit would push, including dead zones on the Kapiri Mposhi to Ndola stretch. Swap telemetry.js for a provider API poller and nothing above it has to change.
Not built: authentication, a server, a database, SMS delivery, and payments. All state lives in this browser's local storage. Roles here are a demo convenience, not a security boundary. In production the client separation belongs in PostgreSQL row level security, and location history needs a retention policy because it tracks drivers as well as cargo.