Case study · Logistics · Vite · Vercel Functions · Supabase · Live AIS
Inland container planning lives in twelve tabs. We put it on one canvas.
Built for my own role at A.P. Møller-Maersk, coordinating inland container transport across the Rotterdam → Germany corridor. Vessel cutoffs, customs windows, Rhine water levels, truck capacity, barge slots and rolled-container risk used to live in separate tools, every tab switch a chance to roll a container and break a promised date. I built eight planning surfaces on one canvas, fed by real port AIS and inland waterway gauges, with CO₂ logged natively for CSRD scope-3. In active use on the BENELUX + DE inland desk.
Every container that misses its slot becomes storage, demurrage and a phone call.
A mid-size inland operator plans hundreds of container moves a week. When a cutoff is missed or a barge slot is mis-read, the container rolls to the next sailing, and the operator absorbs quay rent, demurrage, detention and the re-plan. Industry figures put combined demurrage and detention at €150–€400 per container per day.
Per rolled box
€150–400
demurrage + detention / day
Planning time
~5×
faster per booking on one canvas
Coordination
12 → 1
live feeds, one operating board
Emissions
Native
CO₂ + modal split per decision
01 · Who it helps
Built for the people who carry the cost of every rolled container.
If your team coordinates inland moves across terminals, carriers and waterways, the math works. Four operator profiles where one operating canvas replaces a dozen tabs.
01
Inland barge operators
Waterway levels, lock windows and barge slots change hourly. One board that reads them live keeps a rotation profitable instead of reactive.
02
Freight forwarders
Paid on promised delivery dates, exposed to every roll. Triage at the planning layer means fewer broken promises and fewer goodwill credits.
03
Terminal operators
Gate congestion and CY/CY moves are a coordination problem. A shared live picture smooths the peaks the yard pays for.
04
Shippers & BCOs
Need on-time delivery and now a defensible CO₂ figure. Both fall out of the same planning decision, logged automatically.
02 · Why it matters
From 2025, the emissions number stops being optional. It has to be auditable.
Under the EU Corporate Sustainability Reporting Directive (CSRD), in-scope companies must report scope-3 transport emissions on a defensible, auditable basis. A planning board that logs modal split and CO₂ at the moment of the routing decision turns a year-end scramble into a by-product of normal work.
✕ Without the canvas
Cutoffs, gauges and slots live in 12 tools, re-keyed by hand
Rolled containers surface as an invoice, not a warning
CO₂ reconstructed at year-end from spreadsheets
No record of why a routing decision was made
✓ With the canvas
All 12 feeds on one operating board, refreshed live
Rolled-container risk flagged before the cutoff, not after
CO₂ and modal split logged the moment a route is chosen
Every decision is a record, audit trail by default
03 · The build
Live feeds in, one canvas out, EU-hosted by default.
Real port AIS and inland waterway gauges stream into a Postgres core; planning surfaces render on a Vite front end behind Vercel Functions; Firecrawl keeps terminal rules and schedules current. Every routing decision writes its modal split and CO₂ score back to the same store.
→ 01
Live ingestPort AIS + inland waterway gauges
→ 02
Terminal rulesFirecrawl keeps schedules current
→ 03
Postgres coreSupabase · 32 terminals, 12 feeds
→ 04
Planning canvasVite UI on Vercel Functions
→ 05
CO₂ ledgerModal split logged per decision
Planning flow: feeds refresh live → planner reads cutoffs, gauges and slots on one board → assigns mode and routing → rolled-container risk flags before the cutoff → CO₂ + modal split written with the decision. 🚢 32 terminals · 12 live feeds · ~5× faster per booking.
04 · The operator view
The same canvas a planner works in, eight surfaces, one board.
Three views of the live system: the planning board where every container move is read and triaged; the live feeds that keep it true; and the CO₂ ledger that logs the emissions of every routing decision. A planner never leaves the canvas.
maersk inland · BENELUX + DE · this week
Live · EU hosted
Export23
Import31
CY / CY14
Terminals32
Live surfaces
Port activity8
Schedules46
Waterway5
Vessel19
ContainerLane / terminalCutoffModeStatus
CTR-4471Terminal A → Inland hub 3Tue 14:00Barge✓ on time
CTR-4488Terminal C → Inland hub 1Tue 17:30Rail✓ on time
CTR-4502Terminal A → Inland hub 2Wed 09:15Barge● at risk
CTR-4517Terminal B → Inland hub 4Wed 11:00Road✓ on time
CTR-4523Terminal D → Inland hub 1Wed 16:45Rail● at risk
CTR-4540Terminal C → Inland hub 3Thu 08:00Barge✕ rolled
CTR-4556Terminal A → Inland hub 2Thu 13:20Road✓ on time
CTR-4571Terminal B → Inland hub 4Fri 10:30Rail✓ on time
One canvas, not twelve tabs. Cutoffs, terminals, mode and rolled-container risk for every booking sit on a single board. The eight planning surfaces on the left are the same live database, each viewed for one job. A planner triages the week without ever switching tools.
Live feeds · 12 streams
Streaming
Port AIS · vessels
Vessels tracked37
in coverage zone12:04:11
MV-tracked 08151.9°N 4.1°E
berthing · Terminal A12:04:09
MV-tracked 11451.8°N 4.4°E
inbound · ETA 14:2012:04:02
Waterway gauges
Gauge · Reach 1▲ +0.12 m
3.84 m · navigable12:00:00
Gauge · Reach 2▼ −0.27 m
2.91 m · watch12:00:00
Gauge · Reach 3▲ +0.05 m
4.12 m · navigable12:00:00
Terminal schedules
Terminal A14:00
next export cutoffrefreshed 11:58
Terminal C17:30
rail departurerefreshed 11:58
Terminal Dclosed
gate window 06:00–22:00refreshed 11:57
12 live feeds · port AIS + inland gauges + terminal schedules · refreshed continuously · EU hosted
Real signals, not stale tables. Port AIS positions, inland waterway gauge levels and terminal cutoff schedules stream into the same store that drives the board, so a route is planned against where the vessels and water actually are, right now.
CO₂ ledger · per routing decision
Append-only
Time
Move
Mode
Distance
CO₂ (kg)
Logged
09:12
CTR-4471
Barge
142 km
68.4
✓ logged
09:31
CTR-4488
Rail
208 km
91.5
✓ logged
10:04
CTR-4502
Barge
96 km
46.1
✓ logged
10:22
CTR-4517
Road
61 km
52.7
✓ logged
10:48
CTR-4523
Rail
177 km
77.9
✓ logged
11:09
CTR-4540
Barge
134 km
64.3
✓ logged
11:33
CTR-4556
Road
48 km
41.5
✓ logged
11:57
CTR-4571
Rail
221 km
97.2
✓ logged
8 of 312 decisions today · modal split barge / rail / road · exportable for CSRD scope-3
Emissions logged at the decision, not the year-end. Every routing choice writes its mode, distance and CO₂ figure to an append-only ledger; modal split and scope-3 emissions fall out of normal planning, ready to export for CSRD without a reconstruction.