RUEN
Start a project

Studio product

LogiTMS

A transport management system: orders, route building, vehicle and driver matching, a live map and a separate driver screen.

screens
14
data tables
16
mapping API keys
0
LogiTMS dashboard with a demo dataset

A workplace for the dispatcher of a small haulage or courier fleet: taking orders, building routes, matching a vehicle and a driver, optimising stop order, a live map, a driver screen, documents and analytics. It runs in a browser and as a desktop application on Windows.

Stop order is solved in two passes — under a hard constraint

Nearest neighbour first, then pairwise swaps. But both passes sit under a constraint without which optimisation becomes a trap: a pickup always comes before its delivery. A route where the van arrives to unload first is shorter — and useless.

The dispatcher is not shown the word “optimal” but how many kilometres and minutes it saved against the original order. The difference matters: in the second case a person sees the price of the decision and is free to disagree with it.

Vehicle matching explains its refusals in plain words

“Find a vehicle” scores the whole fleet against a specific order and shows the best five. What matters more is what happens on a bad assignment.

The business rules return a reason, not an error code: over the weight limit, not enough volume, the vehicle is in service, the driver is offline or already on a route, a completed order cannot be cancelled. The dispatcher does not guess why the system refused — they read exactly what does not add up.

The driver screen is a separate app inside the same codebase

Drivers get their own page with no sidebar and no panels: “Start route” → “Arrived” → “Confirm delivery” or “Loading complete” → “Finish route”. Next to it: call, and open the leg in the phone’s map.

Delivery confirmation captures what gets asked for in a dispute: a finger signature on canvas, photographs, the recipient’s name, a comment and the coordinates at the moment of confirmation.

A map with no keys at all

Leaflet and OpenStreetMap tiles — no API key, no paid quota. Distinct markers for pickups, deliveries, waypoints, vehicles and problem stops, the vehicle icon rotated to its heading, route lines, and filters for all / en route / free / problems.

Address geocoding runs through Nominatim with its own cache in the database and a fallback list: lose the network and the application keeps working instead of stalling on address entry.

Screens refresh themselves without polling

Inside there is a typed bus of domain events: order created, route started, vehicle moved. A subscription hook reloads only the screens the change actually touches, rather than everything on a timer.

The movement simulator follows from that: every three and a half seconds it advances the vehicles of active routes toward their next stop, marks arrivals and frees the van — and the map and tables update by themselves, because they listen to the same events they will listen to with real GPS.

Local storage written as if a server stood behind it

The data lives in the browser: sixteen tables in IndexedDB with their own indexes. But the application is not written like a local program.

Data access goes only through repositories whose signatures mirror the future REST endpoints. A write lands in local storage first, then in a send queue, and the queue survives a page reload. Connecting a real server means replacing one layer, not rewriting the interface.

Three providers that can be swapped one at a time

Geocoding, route building and vehicle tracking sit behind interfaces. Today local implementations stand behind them: distance is computed as a corrected straight line, and vehicle positions come from the simulator.

That is a deliberate boundary, not a quick stub. Plugging in an external router or real GPS means replacing one class: the interface is already described and the screens do not change.

The desktop build

Electron with context isolation and a sandbox, no system modules reachable from the page, a localised menu and automatic updates. The dispatcher does not have to keep a browser tab open, and the application updates itself.

The screenshot shows a demo dataset, not a real fleet at work.

TypeScript · React 18 · Vite · Tailwind CSS · IndexedDB · Leaflet · Recharts · PocketBase · Electron