Operating scenario
LiveNormal working conditions
Compiling yard model…
Yard model · live telemetry

Meridian
Terminal

Stack height reads ground slots in use. Stack colour reads mean dwell. Hover a block, or pick one to pin the camera to it.

Mean dwell · days
< 2
2–3.5
3.5–5
5–7
7 +
Drag to orbit · scroll to zoom

Scenario live, camera view Yard. No block pinned.

Moves today

24 h

3,314moves

+4.1%vs. 7-day mean

Mean dwell

14 d

3.6days

-2.4%vs. 7-day mean

Yard occupancy

14 d

52%

+1.8%vs. 7-day mean

Crane rate

4 h

28moves / hr

+3.2%vs. 7-day mean

Moves per hour

Last 24 h · by move type
Moves / hour · UTC
050100150200199 peak0003060912151821

Dwell distribution

All blocks · TEU
0–1 d569%
1–2 d12620%
2–4 d19030%
4–6 d18429%
6–8 d549%
8 d +173%

11% of boxes are past the 6-day free period and accruing demurrage.

Quay crane rate

Moves per hour · last 4 h
QC-01Working

20mv/h

Berth A · last 4 h

QC-02Working

33mv/h

Berth A · last 4 h

QC-03Working

33mv/h

Berth B · last 4 h

QC-04Working

24mv/h

Berth B · last 4 h

QC-05Idle

2mv/h

Berth C · last 4 h

QC-06Idle

1mv/h

Berth C · last 4 h

Yard manifest

Yard manifest. Selecting a row pins the matching block in the 3D yard.
Allocation
Empty depot42/1005.2 d14Watch
Empty depot53/1002.2 d20Nominal
Empty depot56/1003.4 d29Nominal
Cape Loop 244/1004.4 d20Nominal
Cape Loop 249/1001.9 d27Nominal
Cape Loop 266/1005.0 d24Watch
MRD-7 Northbound72/1003.2 d38Nominal
Reefer block40/1006.0 d18Watch
MRD-7 Northbound37/1003.2 d26Nominal
MRD-7 Northbound37/1001.7 d24Nominal
Feeder Gulf50/1004.7 d31Watch
MRD-7 Northbound82/1002.3 d22Nominal

Working · 12 blocks · 4 needing attention

Gate queue

Landside
In 1–42428m
In 5–8296m
Out 1–33411m
Out 4–61424m
Reefer88m
OOG1017m

Trucks in queue and median turn time, by lane group. Lanes over 25 minutes are flagged.

Design principles

Built as an instrument,
not an illustration

A terminal operations console has one job: let a shift supervisor find the block that is about to cost money, in under five seconds. Each principle below names the code that keeps it honest.

  1. The model is the chart

    Block geometry is generated from the records that fill the manifest. Stack height is ground-slot occupancy; stack colour is the dwell step. Nothing in the scene is decorative. Every box you see is a row you can query.

    lib/data.ts, stackHeights() and dwellHex()

  2. One store, two directions

    Hovering a block in 3D lights its row in the table; hovering a row lights the block. Both read and write a single client store, so a panel added later joins the same wiring without a new integration.

    lib/console-state.tsx, one context, 6 subscribers

  3. Stage-agnostic

    The viewport renders a React Three Fiber stage by default and a published Spline scene when one is configured. The console around it does not change either way, because the contract is object names, not a renderer.

    NEXT_PUBLIC_SPLINE_SCENE, objects Block_A1 to Block_B6

  4. Deterministic by design

    Every figure comes from a fixed seed, so the server render and the client render agree and a scenario looks identical on reload. Swapping in a live feed replaces one data module, not the views.

    mulberry32(hash(id + scenario)), no Math.random()

Chart library

Every one of these is
a chart we can build you

These six are examples, not fixed features. Each one is a form we fit to whatever your business actually measures. The terminal data below is only what we happened to plug in.

Also availableGeospatialSankeyFunnelCohort retentionSmall multiplesWaterfallBox plotScatter with fitControl chart
Specification

What ships

Numbers measured off this build, not rounded up for a slide. If a figure below matters to your procurement team, we will show you where it comes from.

Synthetic data, fixed seed
Rendering
12 instanced meshes
1,200 containers drawn from one geometry buffer per block, with shadows on a 2048 map. Adding a block adds a draw call, not a thousand.
Data contract
12 typed accessors
Blocks, throughput, dwell, cranes, gate, energy, berth calls, fleet, occupancy, turn times, ranking and KPIs. Point them at your TOS and the views never learn about it.
State
1 store, 0 polls
A single context holds scenario, hover, selection and camera. Panels subscribe to it; nothing duplicates and nothing polls on a timer.
Colour
ΔE 9.3 worst pair
Categorical palettes are run through a colour-vision validator per theme, above the deuteranopia and protanopia separation floor. Sequential ramps are re-stepped so the terminal step still clears its own surface.
Contrast
8.5:1 body text
WCAG 2.2 AA on both themes, with secondary text at 5.1:1. Focus rings are never removed, and forced-colors mode keeps its borders.
Theming
151 tokens, 2 themes
One token set drives the DOM and the WebGL stage together, so day shift and night shift cannot drift apart.
Reporting
CSV, no round trip
The shift report is assembled and downloaded in the browser. Swap the writer for XLSX or PDF without touching the button.
Delivery
Next.js 16, React 19
App Router, statically prerendered. The 3D stage is code-split and client-only, so the console shell paints before WebGL starts.
How we start

See it against your business

One week, three steps, and a real answer at the end of it. No pilot programme, no statement of work to sign before anyone sees anything.

  1. You send a sample

    One day of move history and a block layout, in whatever shape your system exports. CSV, a database dump or an API endpoint all work.

    Day 1, no integration work on your side

  2. We fit the model

    Your yard replaces ours in the 3D stage and your figures replace the seeded ones. We pick the chart forms that answer the questions your team actually asks.

    Days 2 to 4

  3. You click through it

    A working console on your own data, deployed behind your SSO. If it does not tell you something you did not already know, we say so and stop there.

    Day 5

Send us a sample

Built by Pixlotech. Tell us what your operation measures and we will tell you, honestly, whether a console like this is worth building for it.