PlatformDispatcher board

Drayage dispatch software that shows the clock, not just the load

One row per load, and the row already knows what that load is costing you today. The board is the part of DrayBase that is already written: it queries a drayage operation out of Postgres — loads, moves, containers, chassis, drivers, appointments — and puts a working day on one screen.

Where the line is todayThe board is read-only. It lists, derives, prices and counts — it does not assign a driver, book an appointment or move a load. The only writes in the whole system right now are the two forms on this site and switching which company you are looking at. No carrier is dispatching on it yet either — nobody has been migrated. Every capability below says which side of that line it sits on, in the same sentence that describes it.
Dispatcher · Newark5 loads
Sample
DBXU 418320640 HCHold · CustomsLFD 1d
TGHU 772104820 GPEnroute DeliverPD $0
MSCU 449812040 HCArrived ReturnPD 2d
CAIU 118203040 HCLoadedLFD 3d
FCIU 902551920 GPDispatched

Illustration of the board — sample rows, not live data. The status labels are the ones the product renders.

The rowBuilt

What a row already knows

The columns are not a layout decision. Each one is resolved by the API before the page renders, so the board and the rest of the system can never disagree about what a load is doing or what it owes.

Load
Load number, customer, and both ends of the run — the terminal it comes out of, by its gate code when it has one, and where it is going, each with its city and state, because two terminals in the same port are not interchangeable to the driver you are about to send.
Status
One of sixteen board states, derived every time the row is built. It is not a column somebody forgot to update after the driver called in.
Container
Number, size and type, printed as the shorthand a dispatcher reads at a glance — 40HC, 20DV — with the steamship line, because the line decides the daily rate and where the empty goes back.
Chassis
The chassis and the driver on the leg that is open right now, not the ones on the leg that finished yesterday. You need to know who has the box, not who had it.
Free time
Last free day, and travelling with it the source the date came from and the moment it was last refreshed — both on the row the API returns, though the table does not print them yet. A free-time date with no provenance is a rumour, and a rumour is what per diem disputes are lost on.
At risk
Demurrage plus per diem accrued as of the moment the row is built, counted in whole days and whole cents. Zero is shown quietly; a number that is not zero is shown the way a number that is costing you money should be shown.
Appointment
The next window on the load, with the terminal confirmation number when there is one — because without it the truck does not get through the gate.

The clocksBuilt

Demurrage and per diem are not the same clock

Most systems collapse the two into one number called "charges" and let billing sort it out later. The board keeps them apart, because they start and stop on different events and only one of them is still yours to prevent.

DemurrageRuns while the box is still inside the terminal with its last free day behind it, and stops dead the moment the container is gated out.
Per diemStarts after gate out and stops when the empty is returned. A container cannot be accruing both at once, and the board does not pretend it can.
Whose rateOn the row: the steamship line's daily rate, with a per-container override for when what you negotiated is not what the line publishes, and a standard daily rate as the fallback when neither is on file. Lines do not charge the same, so the rate is not hardcoded.
Which dayCounted in port calendar days on New York time, never the server's clock and never UTC. Count it wrong and a container reads as overdue a day early — there is a test for the daylight-saving change specifically.

The status derivation and the money math live in a package of their own, with 32 unit tests, precisely so the board — and, when they are written, the alerting worker and the invoice — can never quote three different numbers for the same container.

The dayBuilt

Six numbers before you scroll anything

The tiles count the whole operation, not the page you happen to be looking at. Filtering the table down to one customer does not quietly shrink the number of containers bleeding per diem.

Need pickup
Open loads with a container still to pull, and beside it the count of open loads already at or past their last free day.
Need delivery
Open loads with the delivery leg still to run.
Need return
Open loads with the empty return leg still to run. This is the queue per diem comes from.
Drivers
Available out of the active roster, with how many are on a move and how many are off duty.
At risk
The demurrage and per diem accruing across the whole operation, and how many containers are producing it. The tile totals at the standard daily rate; the line rate and the per-container override are applied on the row.
Exceptions
Open problem records nobody has closed. The tile counts them and the record has a field for the money at stake, so the queue can be ordered by impact instead of by age — but the checks that will raise an exception on their own, from an imminent last free day to a missing appointment or stale terminal data, are not running.Detection planned

InventoryBuilt · and not

The whole surface, line by line

A demo can hide the difference between a screen that works and a screen that was drawn. This table is the difference, written down. Nothing marked Planned exists in any form you could use.

#CapabilityWhat it isStatus
01Load listOne row per load, resolved on the server before the page renders. No spinner cascade, no client-side math: the browser paints what the API already decided.Built
02Derived statusSixteen board states, crossed from the open leg and its progress. A terminal hold outranks everything still open — until the box is gated out, at which point it stops blocking, because a hold on a container already on the street is history, not a problem.Built
03Free-time moneyDemurrage and per diem accrued to the moment the row is built, in cents, on the row itself. Not a report you have to remember to run on a Monday.Built
04KPI tilesSix counters across the whole operation, computed in their own aggregate query so paging the table never changes them.Built
05Multi-selectRow checkboxes, select-all, and a floating bar that counts the selection. The bar is there; the actions it will carry are not.Built
06FiltersStatus, driver, customer, terminal, an LFD-critical switch, and free text across load number, container number and bill of lading — all of it in the API today. The filter controls on the board itself are still scenery.API only
07Assign and dispatchAssigning a driver, confirming dispatch and booking an appointment from the row. This is the first write the board will get, and it is not there yet.Planned
08Saved viewsColumns, filters and sort persisted per dispatcher. The board you build should be the board you get back tomorrow — that needs two tables the schema does not have yet.Planned
09Live updatesThe board is fresh when it renders and stays as it was until you reload. Pushing a change to a board someone already has open is a later job.Planned
10Other viewsDriver itinerary, planner, timeline and map on the same surface, sharing one filter set instead of splitting into three screens that hold the same fields.Planned
11Agent rowsThe strip above the board today is a plain summary of the counts underneath it — there is no model behind it, and the code says so. Suggestions that arrive as rows you apply or dismiss are a later phase.Planned

Every board query runs inside the tenant of the session that asked for it, and the tenant is taken from the session rather than from anything the browser sends. How that is enforced is on the security page.

Next

The rest of the operating surface

Containers and free timeThe record the board reads from: holds, last free day, per diem and the empty return, on one record. Containers
Chassis and street turnsThe chassis as a record with its own pool and its own daily cost, and the street turn that puts an import straight under an export booking. Chassis · Street turns
Drivers and agentsThe record a driver app will write to, and the six agents that will sit on this board with a person in front of every state change. Drivers · Agents
Everything elseThe full map of what is built and what is next. Platform · Roadmap · Pricing

If you dispatch out of Newark or Elizabeth and you want to see this board against your own lanes rather than a sample, tell us where you run. Access opens one port at a time so migrations get done properly.