Ship page (/ship/<imo>) - complete field guide
The Ship page is the single-vessel deep-dive at /ship/<imo>. It opens with an identity header (#shd) followed by a stack of self-contained analytic cards - load condition, CII, where-to-load-next, operational efficiency, port quality, market valuation and marine weather - then one Leaflet map shared across all tabs, a live-transit control bar, and three tabs: Overview, Voyages, History. The whole page is driven by load(), which calls /api/ship and fires every card's fetch in parallel, then re-runs on a 30-second timer - so the live position, ETA, weather and load state refresh on their own while you read. The tab you last used is remembered in localStorage.
What you see depends on your account
Vessel detail is approval-based. Every member can open any vessel's hub and see the full menu of what the system tracks for her - the service cards are visible as a locked preview; the full workspace - the service pages (Position, Voyages, Performance, Market, Valuation, Where to load, Tonnage Gap…), the classic one-page view and the deep per-vessel data behind them - unlocks per vessel after you star it as a favourite and the administrator approves the request. Once approved, the ship joins your My Fleet and every page and alert for it opens. Administrators see everything.
shipdata.net is sold by membership type. Owner (shipowner) accounts see the full Ship page - track, voyages, performance, port quality, benchmark, valuation, market and emissions - only for the vessels they own (the ships assigned to their account). For every other vessel they get a surface summary: name, type, flag, DWT and live position/state, without the deep history and analytics. Market, FFA, Ports, Congestion and Analytics stay fully open to owner accounts. Admins and full members see every vessel in full. Which vessels count as “yours” is set by an administrator (the assigned-ships list on your account).
The vessel workspace - dedicated service pages
Opening a ship at /ship/<imo> no longer drops you into a wall of tabs. It opens a vessel dashboard (the “workspace hub”): the vessel’s identity, a strip of live status tiles (status, destination, ETA, draught, last seen), a Voyage timeline of her recent journey (load → laden sail → bunker → discharge → live now, colour-keyed - see the Voyages-tab section below for how to read it), an Overview section (particulars, valuation, trading footprint) and a grid of clickable service cards. Every service now has its own dedicated, detailed page - with charts, a plain-language “how to read this page and how to act on it” explainer, and a sub-nav to hop between services without returning to the hub.
- Position (
/position) - live map, course and recent track, a transit simulation along the sea route, and the full Marine weather card. - Voyages (
/voyages) - port-to-port legs, time at each port, MMSI / voyage / position change history and the actual sailed path. - Performance (
/performance) - speed profile and time-split efficiency vs same-size peers, peer rank, condition trend, utilisation and load/discharge rates. - Ports (
/ports) - where she loads, how busy those load ports are (Port Activity Index) and how often she returns to each. - Market (
/market) - what she could earn now: estimated daily hire from her current area to each destination region, ranked, plus a class freight-momentum snapshot (spot, vs balanced, 1d/7d, DBPI, LSR). Model estimate, not a fixture. - Emissions (
/emissions) - CII rating (A-E), attained AER vs reference, fuel and CO2, and the € cost of EU emission allowances per voyage (with adjustable EUA price and window). - Valuation (
/valuation) - an indicative asset (sale & purchase) value from a transparent model: newbuild parity - anchored to the weekly published newbuilding price index, so values move with the real S&P market - for her size × an age depreciation factor × a market factor (live composite DBPI), floored at scrap value - shown with a full depreciation curve. Indicative model, not a certified valuation or investment advice. - Where to load (
/where-to-load) - projected forward voyages: where she is likely to trade next, timed from her own realized speed, with per-leg earnings and confidence. Projection, not a committed schedule.
The full one-page classic view is always available at /ship/<imo>/classic. Owner-tier accounts see these dedicated pages only for their own assigned vessels; for every other ship they get the surface view (see “What you see depends on your account” above).
Two feeds, one timeline (2026-07). A ship’s voyage history is built from both live AIS and the broker freight feed under one coverage rule: inside the era live AIS actually tracked her, AIS is authoritative (it sees roughly twice as many port calls there); everywhere outside it - before tracking began, inside reception holes, and after AIS goes dark - the broker’s reported port calls become real voyage legs. History accrued this way is stable: when AIS coverage resumes, previously built broker legs stay.
Sister ships - her true class peers
On the vessel Hub, a Sister ships card lists the vessel’s real class peers: same segment, within ±2% deadweight and ±1 build-year. When the build-yard is known (from gathered particulars) for both ships, a shared yard is flagged a confirmed sister (★) and a matching yard number the same series.
- Each sister links to its own page and shows build year, an indicative value (same valuation model) and the basin it is trading in now - a ready-made set of comps for valuation and benchmarking.
Confirmed (same-yard) sisters fill in as vessel particulars are gathered; values are indicative model estimates, not market quotes.
Header: identity, load condition, valuation and the My-Fleet star
The header block (#shd) is the vessel's identity, populated from /api/ship and /api/freight_meta.
- Title (
#nm) - vessel name plus IMO in parentheses, e.g.BULK NAVIGATOR (9512345). A← Fleet maplink to/appsits above it. While loading it readsLoading...; if/api/shipreturns no vessel it showsIMO … - no data yet(the rest of the page stays blank). - Subtitle (
#nm_sub) - a one-line particulars string, appended with a leading dot when present. - Favourite button (
#favbtn) - the My-Fleet toggle, inline at the end of the title. Hollow star☆ Favourite= not saved; filled amber★ In My Fleet= saved (button turns amber). Clicking POSTs to/api/favoritewith your CSRF token (read from/api/me). The button is hidden entirely for anonymous visitors; if the CSRF token is missing, clicking sends you to/login. State is checked against/api/favoriteson load. Add ships you are working a fixture on so they cluster on your My Fleet map. - Meta line (
#meta) - pipe-separated live snapshot, two rows: MMSI · Callsign · Type · Cargo · LOA×Beam (m) · Status, then Destination · ETA · Draught (m) · Last seen. "Status" is the decoded nav status. Read this as the single freshest fix. - Where the destination comes from - the page is explicit about its source. When the destination and ETA come from the position feed they are labelled (reported); when they come from the ship's own live AIS voyage message they are labelled (broadcast). Neither is a freight assessment or a broker quote - both are observed vessel data, just from different channels.
- Load condition line - computed in-browser from registry summer draft (
particulars.draft) vs current AIS draught (vessel.draught): green Laden when draught > 80% of loaded draft, amber Ballast at or below 80%, grey Unknown if either figure is missing. When both exist it shows the actual numbers, e.g.(AIS 9.1 m vs loaded 14.2 m). This is the fastest read of whether the ship is full or empty. - Position conflict pill - appended to the meta line as a pink
⚠ position conflict (N nm)badge when the two latest fixes disagree. Hover the badge: it explains the two latest fixes are~N nm apart within H h (implied K kn)- a flag that one of the two channels (AIS broadcast vs reported feed) is out of date or mismatched, worth verifying before you act on the position.
Trade-on vs recycle - the asset decision lens
On the Valuation service page, below the depreciation curve, a Trade-on vs recycle card frames the keep-or-scrap decision straight from the model’s own outputs:
- Trade-on premium - how much more she is worth trading (the estimated value) than as steel (the scrap floor), in $M and as a % over scrap.
- Residual value - her estimated value as a percentage of a newbuild, i.e. how far down the depreciation curve she has travelled.
- Replace with newbuild and Replacement gap - today’s newbuild parity and the difference vs her value, for fleet-renewal calls.
A green headline means a clear trade-on; an amber one flags that the trading premium over scrap has thinned to the point where recycling economics come into play. It is indicative (derived from the valuation model, not a market quote).
Header analytic cards: CII, valuation, visited countries, load-next, efficiency, port quality
Below the meta line sits a stack of cards, each fed by its own endpoint and each hidden until its data arrives (so slow networks don't flash empty boxes). In source order:
- Market valuation (
#valuation) - appears only whenfreight_meta.vessel_valuationexists; rendered as Market valuation · the figure. - Stale-record banner (
#stale_warn) - an amber warning injected above the valuation when the voyage record is 30+ days old (freight_meta.stale). It names the preserved status and port (e.g."Open" at SINGAPORE) and the age in days, and states the status "is not treated as ongoing." When you see this, do not trust the "current status" as live. - Visited countries (
#visited) - a flag-emoji + name list fromfreight_meta.visited_countries(e.g. 🇨🇳 China · 🇧🇷 Brazil), built from a 2-letter ISO map. The Overview's Trading footprint card rolls these same visited countries up to macro-basins - a Trades in: Mediterranean · Black Sea · … deployment fingerprint ranked by how many countries fall in each basin. - CII estimate (
#cii) - from/api/cii. Shows a coloured A-E band pill (green A → red E) plus AER in gCO₂/dwt·nm with the segment reference, the leg count, total nm and total CO₂ tonnes, over a stated window (e.g. last 365 d). Computed from observed voyage legs at an assumed service speed and t/day at sea - explicitly "Not for IMO compliance." If there are zero completed legs it shows a clear "need at least one port-to-port leg" placeholder listing the assumed speed/consumption/reference AER. A worsening band (D/E) signals charter-party CII clauses and possible speed restrictions. - Where to load next? (
#loadpred) - from/api/predict_loading; rendered only when the ship is atSeaorAnchorage(hidden in port/idle, where it isn't actionable). For a laden ship the origin is its discharge destination ("After discharging at …"); for a ballast ship it's the current position ("Currently in …"). The table ranks candidate load ports with columns #, Port (linked to/port/…), Region, Distance (nm), Peer laden, Peer ballast, Score (with a coloured magnitude bar). A ⭐ marks ports this ship has loaded before; a ⤓ glyph means port+anchorage rows were merged. The card prints its scoring logic: a blend that rewards peer laden activity, penalises peer ballast crowding and steaming distance, and adds a bonus for ports this ship has loaded at before; positive = busy load market for this class. If peer voyage data is thin it falls back to a row of "Likely loading regions" pills from the ballast-feasibility matrix. - Operational efficiency (
#eff) - from/api/ship_efficiency?days=180, comparing this ship to peers (±10% DWT, ±3 yr built). A coloured Score pill with verdict ("Out-earning peers" / "On par" / "Underperforming") sits top-right. Four horizontal bars - Laden at sea, Ballast at sea, Anchorage (wait), At berth - show this ship's share (blue bar) against the peer average (orange tick), with a ▲/▼ arrow and a percentage-point delta coloured green (better) or pink (worse). Note the direction convention: more laden-at-sea is good; more ballast/wait/berth is bad. If the ship has no voyage history yet, it degrades to a peer-baseline view so you still see what's typical for the class. The footer prints the exact score formula and tracked days on file. - Port quality score (
#pq) - from/api/ship_port_quality?days=180. A coloured pill shows the average Port Activity Index of recent laden departures (e.g.1.62× · Premium trade lanes; thresholds: ≥1.5 premium, ≥1.0 above-average, ≥0.8 baseline, else low/spot). Below it lists up to 8 recent departures as date · port (linked) · PAI badge. The footer explains the combined signal: high laden-time ratio (efficiency card) + high port quality (this card) = a premium, well-utilised vessel - whereas lots of laden time on weak lanes, or short bursts on strong lanes, tells a different story.
Live status pill, Ship Card and sister-ship value comps
Every dedicated service page now opens with a live status pill beside the title - the same precise wording as My Fleet (Loading, Discharging, In port, At anchor, Stopped / drifting, Underway - laden/ballast) plus the context detail (which port, or speed and draft). From the vessel hub, the 🖨 Ship Card link renders a printable one-pager - identity and particulars, the model valuation with its range, the projected 12-month commercial view and her top load ports - formatted for print or “Save as PDF”, ready to hand to a charterer or bank. And on the Valuation page, a Value vs sister ships card places her estimate inside the value band of her closest sisters (±2% DWT, ±1 yr, same segment) with a per-sister comp table; confirmed same-yard sisters are starred.
Scenario re-pricing, the fix-now signal and per-leg sea margin
Three decision aids. On Where to load, a market scenario toggle re-prices the whole 12-month rotation at −20% / today / +20% lane rates - voyage costs stay fixed, so the net result swings harder than the gross: that operating leverage is exactly what the toggle makes visible (the map keeps the base case). On the Market service page, a fix now / wait chip reads the week’s spot momentum for her size class: a clearly rising week suggests waiting may pay, a softening one favours fixing now, and flat means decide on the cargo’s own merits - an honest momentum heuristic from tracked voyages, not advice. And on Voyages, the Sea margin table answers “was that slow leg the weather’s fault?”: wind and waves are sampled along her actual track, and each covered leg’s speed deficit is split into a weather-explained part (a simple screening rule scaled to the average significant wave height encountered) and an unexplained remainder that points at hull, engine or deliberate slow-steaming. Weather logging accrues forward only, so the table deepens with every new voyage.
The shared live map, legend, country tinting and night overlay
One Leaflet map (#map, OpenStreetMap tiles, 460 px tall) lives outside the tab panels so it stays visible on every tab. The #cmlab caption ("Track & countries visited", with a #cmsub count of visited countries) carries the full colour legend - every line and marker maps to one of these:
- Live track - solid yellow polyline (
#ffd24d) of real AIS fixes, with small pale dots at each point. The track breaks into separate runs on any gap > 6 h, or whenever the source flips between AIS and freight, so it never draws a false straight line across land. - Voyage report - standalone teal filled circles (
#39d3c3); each is a point-in-time freight snapshot (hover showsVoyage report · timestamp), drawn as dots with no connecting line because they are observations, not a continuous track. - Estimated route (searoute) - dashed teal line connecting consecutive freight snapshots along real shipping lanes (server-computed via searoute/MARNET), filling AIS-silent gaps. Hover shows the from→to timestamps.
- Live position - a green triangle (
#3ddc97) at the latest fix, rotated to course; a separate red dot (#ff6b6b) highlights the very last known position. - Projected route to destination - dashed orange line (
#ff9f43), the sea-route waypoints from the current fix to the resolved destination (drawn by the live-transit layer, below). - Night now (live) - a translucent dark polygon (the
nightpane, z-index just above tiles) over the hemisphere currently in darkness, from a real solar-terminator calculation refreshed every 5 minutes. Useful context for ETAs and arrival/port-call timing.
Country tinting - countries with AIS-tracked port stays are shaded blue, deeper with more visits (#5fb3ff, opacity scales with visit count); freight-only countries (a voyage in the feed but no AIS port stay) get a softer dashed teal fill (#39d3c3). Hover any country for a tooltip: visit count and up to 8 recent ports, or "Visited (voyage history)" for freight-only, or "Not visited." The map auto-fits to the AIS track (max zoom 9); with no track it fits to visited countries; failing that it shows the world.
Map weather overlay and the detailed Marine weather card
Marine conditions at the ship's current position come from /api/marine_weather (Open-Meteo, 30-min server cache) and appear in three places, all hidden until data arrives:
- Compact widget (
#wx_map) - a card pinned to the map's top-right titled⚓ Weather here, with rows for Wind, Wave, Swell, Sea temp. Each value is colour-coded good/warn/bad: wind green <22 kn / amber ≥22 / red ≥34; wave green <2.5 m / amber ≥2.5 / red ≥4. Wind and wave include a 16-point unicode arrow pointing where the wind/wave is heading toward. Adetails ↓link jumps to the full card (anchor#wx_full). - Detailed card (
#wx) - a grid of larger cells: Wind (kn + arrow, with compass point and gust), Significant wave (m + direction + period), Swell (m, long-period component), Ocean current (kn + direction) and Sea temp (°C, with air temp). Values are colour-coded on the same Beaufort/wave-height thresholds. Below sits a Next-72 h forecast spark: a row of paired bars, blue = wind (kn), green = wave height (m), each hour hover-able for exact values - a quick read of whether weather worsens before the ship's ETA. - Map overlay - a dashed wave-height ring around the ship (radius scales with wave height, colour by severity) and a wind arrow polyline from the ship pointing in the wind's "blows-toward" direction with a small arrowhead (length scales with wind speed). Redrawn each fetch.
Live transit: computed ETA, berth-wait buffer and the time-lapse player
When the ship is at sea with a resolvable destination, the green triangle becomes an animated marker that walks the orange projected route, and a control bar (#xitbar, "▶ Live transit") appears under the map - a flight-radar-style passage simulation drawn on the main map (no second map). If you arrive via #transit in the URL the page auto-scrolls to it.
- Play/pause (
#xitplay) - ⏸/▶ toggles the animation. - Time-lapse selector (
#xitspeed) - ×60 / ×240 (default) / ×600 / ×1800; this is purely how fast the simulated marker travels, it changes no number. - Info line (
#xitinfo) - the substance, in order: current speed (▲ 12.4 kn, or "stopped"/"speed n/a"), course, nav status, destination (→ Qingdao, with(area)if only a region resolved), distance-to-go in nm, then the headline computed ETA in UTC with days-to-go and the speed it used. The ETA speed is a robust trailing-median of the ship's recent underway SOG, taggedavg; it falls back to current SOG, or a typical-service default taggedestfor a ship momentarily slow or at anchor. - Berth-wait buffer - when the destination is a real LOCODE with enough laden history, a second figure appears:
berth ~YYYY-MM-DD (+N d typ. wait). This is the arrival ETA plus the median (wait + berth) days laden ships have actually spent at that port. For laytime planning this is the number that matters - the queue, not just steaming time. - AIS ETA cross-check - if the crew-entered AIS ETA differs from the computed one it's shown as
AIS says …, so you can spot an optimistic or stale manual entry. (If no ETA could be computed, the AIS ETA is shown alone.) - Source tag - the line ends with "sea-route sim" (following real lanes) or "heading projection" (a short, honest dead-reckon when no sea route is known - the marker walks the current course and resets every ~45 s), plus the last-fix timestamp. The marker colour itself is a status cue: grey if anchored/moored/in-port, green if making way, amber if stopped at sea.
Position confidence - is the fix fresh, and where is she really now?
On the dedicated Position service page, below the map, a Position confidence card answers the question every owner actually has when they open a tracker: how much can I trust this dot?
- Freshness band - a coloured pill: LIVE (last fix <6 h), AGING (6-48 h), STALE (2-7 days) or DARK (>7 days with no signal), plus the exact age and the source of the last fix.
- Dead-reckoned ‘estimated now’ - when the ship is under way but has gone quiet, the map shows a ghost marker projected forward along her last course and speed, inside an uncertainty circle that grows the longer she stays dark. A fresh ship has a pinpoint circle; a ship three days dark mid-ocean has a wide one.
- Coverage ribbon - a per-day strip over the last 30 days: green where we had a position, grey where the signal went dark, with the count of long (>48 h) dark gaps.
Today the gaps come from terrestrial AIS, which only hears ships near the coast - mid-ocean legs go dark for days. As we add satellite AIS, those gaps close: the ghost collapses onto the real marker, the ribbon turns solid green, and the source line shows the satellite share. The card is the honest, at-a-glance read on data quality for that vessel.
Two live feeds, one honest position. We blend our live aisstream AIS with a broker freight feed that fills coverage gaps (mid-ocean, and regions terrestrial AIS misses). The freight feed is a low-cadence snapshot with no speed, so it never overrides a still-fresh AIS track: while a real AIS fix is recent the map shows it, the freight position only takes over once AIS has gone dark, and a broker position that would imply a physically impossible jump (a stale port centroid on the far side of the world) is rejected rather than teleporting the dot. The ship never flips oceans between fixes - you always see the freshest position we can stand behind.
Voyage intelligence (the card above the map) turns that raw position into four calculated reads: a computed ETA to her declared destination from her observed recent speed, plus a berth ETA that adds the destination’s live anchorage-queue wait - shown next to the crew’s AIS-declared ETA and the difference; storm-on-path exposure (how close her projected route passes to an active tropical cyclone, from the free NHC/GDACS feeds); a plain-English read of what she is doing now (slow-steaming, idle/waiting, or off the great-circle); and her dead-reckoned probable position when AIS has gone stale. All are model estimates from the live track, not fixtures.
Voyage replay - animate the ship’s actual past track
Below the map sits a ⏱ Voyage replay bar. Where Live transit (above) projects the ship forward to its declared destination, Voyage replay reconstructs where the ship has actually been and animates it. Press ▶ and a marker walks the assembled voyage; a scrubber jumps to any moment, and the Speed selector controls how fast the days compress.
How the track is assembled. Every observed fix - AIS positions and the voyage-report (reported) positions that fill the open ocean where AIS can’t reach - is merged in time order and cleaned: sub-minute jitter is collapsed and any fix implying an impossible speed (over ~28 kn for a bulk carrier) is dropped as a bad reading. Long gaps between fixes are filled along real shipping lanes, so the replayed path hugs the water and never cuts across land. A route the ship could not physically have sailed in the elapsed time is rejected in favour of the honest straight line.
The coverage label under the bar is deliberately transparent: it shows how many fixes were used, over how many days, how many gaps were filled along lanes, the split between AIS and voyage-report fixes, and the approximate distance steamed (hover for the sea-route estimate vs the straight-line lower bound). Sparse ships produce a coarse track - the label tells you exactly how much is observation versus inference.
Overview tab: particulars, contacts, 3D model, speed/carbon optimizer, time-in-state
The Overview tab (default) holds the registry data and the interactive tools. (Switching to it calls map.invalidateSize() so Leaflet re-measures after being hidden.)
- Vessel particulars (
#parts) - a dot-separated list, showing only fields present: Name, Type, Built, DWT, GRT, NRT, Draft, TPC, LOA, Beam, Flag, Gears, Crane, Grab, Ice class, AHL, CO2, Laker, Logger, H/H. With no registry record it says "No registry record (run load_vessels.py)." - Class notation - explained - the dense classification-society "Description" on file (e.g.
GL +100A5 G str hv cargoes Ho 1&4 may be empty … +MC AUT) is decoded into plain English and grouped by theme: classification society, hull class & build survey, machinery & automation, strength & cargo capability, ice class, cargo equipment & dangerous goods, coatings/emissions and survey/condition-monitoring schemes (in-water survey, tailshaft monitoring …). Only the CURRENT class is decoded - any Former-class block is kept in the raw line but not mixed into the chips - and codes we cannot verify pass through verbatim rather than being guessed. - Chartering contacts (
#contacts/#ctab) - a table of Company, Email (clickable mailto), MIC, Phone, Role, Note, shown only when contacts are on file; if the API returns an empty list it says "No chartering contacts on file," and if it returns null the whole block is hidden. - 3D model (
#ship3d) - a parametric, to-scale bulk-carrier schematic built in Three.js purely from particulars - no external model. Hull length/beam come from LOA × Beam; moulded depth is estimated from summer draft. Crucially the sea plane sits at the current AIS draught: a ballast ship rides high and shows its red boot-top (anti-fouling), a laden ship sits down to its marks. The ship now floats on a live, animated ocean: the sea is a moving wave field whose height, length and direction come from the real marine weather at the vessel position (Open-Meteo), the sky, fog, sun and rain/snow read the weather code (from clear through fog to thunderstorm), and the hull pitches, rolls and heaves in those seas - head seas pitch her, beam seas roll her - while a bow wake and spray scale with her live speed (a moored ship lies still) and the wind gives her a little heel. The scene shows the actual conditions she is in right now. Hatch count is derived from DWT (3 holds under 15k DWT up to 9 above 100k); accommodation block, bridge and a red-banded funnel sit at the stern; cranes appear only if the ship is geared (count parsed from the gears string, e.g. "4×30T"). Drag to rotate, scroll to zoom; it auto-spins when idle and pauses rendering when the tab is hidden. The caption (#ship3dcap) restates the read: Laden/Ballast/unknown, LOA × beam, summer draft, current draught, hold count, geared/gearless. - Speed & carbon optimizer (
#voptcard) - enter a Load (LOCODE) and Discharge (LOCODE) (prefilled from the ship's most recent leg) and an optional Target days, then Optimize. It calls/api/voyage_optimizeand returns the TCE-maximising speed for this specific ship. The summary line gives the lane, distance, market hire/day, VLSFO $/t and EU-ETS coverage; a highlighted box compares Optimal kn vs design kn with the TCE/day, fuel-tonne, CO₂-tonne and CII-band deltas. The table breaks out modes - Design (service), Optimal TCE, Just-in-time (if applicable), Min fuel/CO₂, Min time - each with kn, days, fuel t, bunker $, CO₂ t, EU-ETS $, TCE/day and a coloured CII letter. The footnote flags that TCE is carbon-adjusted (net of EU-ETS) and that EUA price and port turnaround are assumptions. - Time in state (
#scards/#sleg/#sbar/#stl) - a date-range tool (From / To date inputs with Apply and Clear; the range also drives the Voyages table). It renders one KPI card per state - Moored (blue), Anchorage (amber), At sea (green), Idle (grey) - each showing total duration, % of observed time and interval count, with a matching colour legend. The "Share of observed time" bar (#sbar) is a single stacked proportion bar. Below it the chronological timeline (#stl, left = oldest) lays out every interval as a width-proportional segment; freight-derived intervals get a dashed top border and are slightly faded to distinguish them from AIS-tracked ones. Hover any segment for state, port, start→end, duration and source. The caption (#stlspan) prints the full span and total observed time.
Voyages tab: port stays, raw interval detail and port→port legs
The tab opens with the Voyage timeline - the ship’s journey over roughly the last YEAR told as a horizontal, left-to-right story: where she loaded, each laden or ballast sea leg (with distance, days and average speed), every bunker stop and discharge, ending in a ringed now node for her live position and condition. Port calls sit above the rail, sea legs below, each on a colour-keyed dot - green loading, blue laden, amber bunkering, red discharge, grey ballast (see the legend). Load and discharge cards show the cargo tonnage moved (from the draft change), and each port card now also shows the time spent there - days at anchor (waiting) plus days alongside - so the dwell between two dates is always accounted for (it reconciles with the Time in state panel below); and a port call the live AIS feed missed but the position/voyage feed recorded as a real stay (common in sparse-AIS waters) is spliced back in so it is not silently dropped. the strip scrolls and opens at the live end. It is built from the same legs as the table below, so it respects the Overview date range and appears once she has at least one leg on file.
Below the timeline are three stacked tables (each in its own scroll box). The legs table respects the Overview date range.
- Time at ports (
#ptb) - all-time per-port aggregation: Port (linked), Country, Moored (d), Anchorage (d), Total (d), Visits, PDA, Last (UTC). Splitting moored vs anchorage days tells a charterer whether time at that port is productive berth time or queue time. Every port the ship called appears here, not only the AIS-observed ones: for a freight-tracked vessel whose transponder was dark at the berth the cargo calls are filled from the voyage record (tagged from voyage), and where the feed reports an instant turnaround the dwell shows - (the call is real, its duration just unknown). An indicative PDA (port disbursement estimate) is shown per cargo call; bunker / canal-transit / ship-to-ship stops are flagged and carry no PDA (not a berth cargo call). Time a ship spends idle inside a port (stationary, but not squawking berth/anchor status) is counted too, split by her load: laden idle reads as an anchorage wait to discharge, while ballast idle reads as a fuel / repair / orders wait and is flagged bunker/transit. "No port stays recorded yet" shows when empty. - Interval detail (
#st) - the raw, per-AIS-interval view: State (colour chip), Port, Start (UTC), End (UTC), Days, Source, Ongoing. Source is a pill - teal "report" (freight-derived) or grey "live" (AIS). Port/Anchorage intervals can carry a cargo/bunker badge sourced from the matching voyage leg: ⛽ amber for a bunker/fuel stop (draft change × TPC ≈ tonnes), blue ▲/▼ for cargo loaded/discharged (with tonnage), or a grey "transit" tag for a negligible-draft pass-through. Hover any badge for the draft-change arithmetic. - Voyages - port→port legs (
#vlb) - the macro view: Depart port, Departed (UTC), Arrive port, Arrived (UTC), Dist (nm), Sea (d), Speed (kn), Wait (d), Berth (d), Load. The arrive-port cell repeats the ⛽/▲▼/transit cargo badge. Speed is the implied SOG, coloured against the ship's design speed (pink if ≥10% slow, green if within ±5%; hover for design kn and the % delta) - slow-steaming or a hidden stop shows up here. Wait = anchorage queue days, Berth = days alongside; together they're the real port turnaround. The Load column is colour-coded (green Laden / amber Ballast / grey Unknown) with a pill: green "cargo" for a real laden/ballast change at both ends, or a dimmed "bunker/transit" pill (and the whole row is greyed and italic) when the load state didn't change - i.e. a bunker, canal-wait or refresher stop, not a cargo voyage. "No completed legs yet" shows when empty.
Click any leg row to light up that leg’s actual sailed path on the map above: a green dot at the load port, a red dot at the discharge port, and the real route between them (clipped from the cleaned track to the leg’s departure→arrival window). The readout shows the distance actually sailed (from the track) next to the theoretical port-to-port distance - e.g. a coastal leg may steam 48 nm to cover a 40 nm straight-line hop.
Part-discharge (multi-discharge) legs. When a ship part-discharges at one port and sails on still laden to drop the rest at a second port, that onward leg is NOT a new fixture - the cargo was loaded earlier. We detect this from the signed draught change at each call (a discharge, not a load, at the departure port) and tag the leg part-discharge with an amber badge naming the real load port, e.g. Laden · part-discharge · from New Orleans. The cargo lane is then attributed load→discharge (New Orleans→Vlissingen), never the phantom discharge→discharge (Antwerp→Vlissingen). This needs an AIS draught sample at both calls; where it is missing the leg falls back to the plain load/ballast reading.
Load vs discharge is read from the ship’s load STATE across the leg, not the raw draught number. A vessel that loads at one port and carries the cargo on to discharge at the next is shown correctly - Loading at the load port, Discharge at the destination - even when a single freight report only catches one nominal draught at the busy call. So a ship that loads at, say, Tuapse, sails laden to Ambarli and discharges there before ballasting home reads exactly that way: the draught rise is credited to the load port and the fall to the discharge port, never flipped onto the wrong end. A draught change on a leg the ship is sailing ballast (empty) is treated as a stale or de-ballasting reading, not a phantom discharge.
A draught-derived parcel larger than the ship’s own deadweight is rejected as a corrupt reading. Total cargo aboard can never exceed deadweight, so when a stale or garbage draught (often picked up across a long AIS-dark gap) implies a load or discharge bigger than the whole vessel, the timeline shows a neutral port call instead of an impossible tonnage. And while a ship is still laden and steaming on to a further port, an intermediate call where the draught did not change is shown as a port call, never a discharge - the real discharge is the destination still ahead (e.g. a Bissau cargo passing an anchorage off South Africa is delivered at the onward port, not where she merely paused).
The timeline now shows the FULL call history, not just AIS-confirmed legs. Ports the voyage-report feed recorded but our AIS-derived legs dropped (early calls before AIS coverage began, or bunker/passing stops like Las Palmas) appear as muted “Reported port call” or “Reported destination” breadcrumbs, slotted chronologically among the confirmed legs. They are clearly marked as report-sourced and NOT AIS-confirmed, and never carry a load/discharge figure - so you see everywhere the ship has been (e.g. São Luís and Las Palmas), while the confirmed legs stay visually distinct. The minute-by-minute track through an AIS-dark stretch between calls remains uncollected.
Ballast reference & the bunker-likely tag
Each ship carries a ballast reference - the lightest draught she has been seen at, which approximates her empty (ballast) draft. It is shown as a caption above the Voyages table once she has enough draught history on file, and it deepens over time as more of her past accrues (a single stray-low reading can’t set it - the value needs cluster support).
Against that reference, a port call where she arrives near her ballast draft and departs only slightly deeper (a small +0.1-0.6 m bump - the size of a bunker stem or stores, not a cargo parcel) is flagged with a dashed ⛽? bunker-likely tag. This is a low-confidence hint, not a fact: AIS draught is crew-entered and coarse, and a small bump can also be a part-cargo top-off. The tag only appears when the reference is trusted (enough distinct draught readings); confirmed bunker stops keep their solid ⛽ badge, while the dashed tag marks the extra cases the ballast reference suggests.
Voyage economics - what each laden leg likely earned
On the Voyages service page, below the port→port leg list, a Voyage economics table turns each completed laden leg into an indicative profit-and-loss line - the closest thing to a per-voyage result the platform can produce without your actual fixtures.
- Lane TCE ($/day) - the market daily-hire for the ship’s size band on that exact route (load basin → discharge basin), from the same engine that powers the Market page.
- Break-even ($/day) - the band’s daily running cost (the level where a ship just covers itself; DBPI 1000).
- Net ($/day) and Result ($) - lane TCE minus break-even, and that net multiplied by the leg’s on-hire days (steaming + berth) - waiting at anchorage is shown separately and is not counted as earning, so a leg that sat idle no longer books that idle time as profit. Green is a positive contribution, red a loss-making leg.
The header tiles roll the legs up into a net result, an average net $/day, total days at work and distance. It is an indicative model (market lane rates and a class break-even, not your actual freight invoices or bunker bills), and it sharpens as more voyages accrue. Distances are great-circle between the port centroids today; they tighten once continuous satellite tracks land.
History tab: MMSI, voyage/static changes and raw position changes
The History tab is the audit trail - useful for spotting identity changes, re-flagging, draught manipulation or AIS gaps.
- MMSI change history (
#mc) - each line showsoldMMSI → newMMSI at timestamp(highlighted in the change colour), or "No MMSI changes recorded." An MMSI change can signal a sale, re-flag or, combined with the conflict pill, an identity spoof worth verifying. - Voyage / static change history (
#vt) - one row per change to the broadcast static/voyage data: Recorded (UTC), Destination, ETA, Draught, Type, Cargo type, Name, Callsign, LOAxBeam. Watching destination/draught flip over time reveals when the ship declared a new discharge port or loaded/de-ballasted. - Position change history (
#pt) - the raw fix log, newest first: Recorded (UTC), Lat, Lon, Heading, ROT (rate of turn), Status, Source. The Source column is a pill - blue "AIS" or teal "Freight." The heading (#pc) prints(N shown of M total changes)so you know whether the log is truncated. This is where you confirm exactly where and when the ship was, and which feed reported it.
Benchmark tab: rank among true peers + best-operated ships
The Benchmark tab answers the one comparison that matters for a single vessel: how does it stack up against ships just like it? The peer set is this ship's true peers - every tracked vessel within ±10% of its DWT and ±3 build-years.
- Operational rank - where the ship sits among those peers on the efficiency score (more laden time, less ballast / anchorage wait, better load hubs), e.g. #3 of 41, with its top-percentile band.
- Profitability rank - its position by modelled idle-adjusted TCE ($/day) against the same peers, so you see who out-earns whom within the class, not just by ship size.
- Best-operated peers - a top-10 table of the highest operational scores in the cohort, with this ship highlighted in place and every row linking to that vessel.
When a ship has too few exact peers the tab widens to its segment. Below the 10 tracked voyage-day floor the tab now shows a provisional, low-confidence score from whatever data we already have - clearly flagged, with the progress shown (e.g. 5.6 / 10 tracked voyage-days) - so you can read the ship's standing immediately rather than wait. These provisional figures are computed exactly like the full score but from a small sample, so they are unstable and can swing as the ship sails; they firm up once it crosses 10 days. (A ship with essentially no voyage activity yet shows only the progress line, no score.) That count is voyage activity - sea time plus port time from completed legs - not calendar days of AIS coverage: a ship on the map for weeks but mostly idle in one port accrues tracked-days slowly. The window is 365 days (long dry-bulk voyages need it). Note the public worst/best Rankings board keeps the full 10-day floor - a one-leg fluke never tops it - so the provisional score appears on the ship's own page only.
Performance tab: speed, draught & machine-health signals
The Performance tab reads the ship's AIS speed time-series and draught history to surface how the vessel is actually run - and to flag trouble.
- Laden vs ballast speed and slow-steaming (% below the registry service speed): how hard the ship is pushed.
- Laden speed trend - recent vs earlier steaming speed, now also drawn as a month-by-month speed chart (laden and ballast steaming speed against the service-speed reference line) so you see the shape of any decline or post-drydock recovery, not just a single number. A sustained drop raises a speed-loss flag (possible hull fouling or engine wear - check weather and drydock-due) - but only once there is a real baseline behind it (roughly six weeks of laden steaming across at least two completed voyages). Until then the card honestly reads “condition baseline still building” rather than passing a verdict off a few days of one voyage. Each month’s speed is recorded into a long-running per-ship history, so the curve keeps deepening over time even as the raw position fixes age out. Beneath the chart, a maintenance detector annotates any long stationary spell (10+ days) that was followed by a clear laden-speed recovery - the classic hull-cleaning / drydock signature - and an estimated fuel spend by month strip prices each month’s sea days at the vessel’s (owner-uploaded) consumption and today’s VLSFO.
- Drifting / stopped at sea - spells of ~0 kn while the AIS status is under-way (or 'Not under command') FAR from any port: a possible engine breakdown, awaiting orders, or a ship-to-ship transfer. A recent spell raises a breakdown flag.
- Eco-speed gap - actual laden speed vs the fuel-optimal speed for THIS ship: the TCE-maximising speed on her own recent laden lane distance, at today’s live band hire and VLSFO price, anchored to her rated service speed (not a generic reference). So a vessel is only ever shown “above eco - slow down to save fuel” when it is genuinely fast for her real economics. Right below, a slow-steaming simulator turns this into a live slider: drag her laden speed and fuel/day, fuel $/day, CO₂/day, voyage days and daily net TCE recompute instantly from her real lane, her market-page Class-spot hire and live Singapore VLSFO (from the Bunker page, updated nightly) - a green glow marks her money-maximising (eco) speed and an accent dot marks where she actually steams, so the gap between them is money left on the table (or saved). It is a visual mirror of the same optimiser, not a second number, so it always agrees with the eco figure above.
- Cargo utilisation % (tonnes loaded ÷ DWT, from the draught jump) and load / discharge rates (t/day at each port from the draught change ÷ days alongside).
Honesty: we store no historical weather, so this is not a strict wind/wave-corrected sea-margin - the speed-loss trend is an unexplained-loss proxy you read alongside weather. All figures come from partial AIS (crew-set draught, intermittent fixes) and are directional, not audited. When a ship is mid-voyage, her current voyage is now folded in too: every steaming fix on the open leg is classed laden or ballast from the ship’s own live draught at that moment (the same draught rule the rest of the site uses), so the speeds are up to date - not just “as of her last completed voyage.” A small “includes her current voyage (laden/ballast, live)” note confirms it. Only when we genuinely cannot read her current draught - it is missing, or the open leg straddles an un-closed load/discharge and a fix sits right on the change - does the page fall back to labelling the figures as her last completed voyage, rather than guessing a stale window as “current”. The same drift/breakdown scan feeds the daily ops watchdog, which also publishes a fleet speed-decay leaderboard - the ships whose laden speed fell most this fortnight (a fouling/engine screen) - to the morning Telegram digest. And we now sample wind/wave along every at-sea ship's track (stored in weather_hist); a Sea state KPI shows the conditions the speed was made in, and as that record deepens it powers a true sea-margin (speed loss explained by weather vs by the hull/engine).
Market tab - earning power from here + a class FFA snapshot
The Market tab answers a chartering question directly: from where this ship is right now, what would it earn sailing laden to each destination region? It reads the ship’s current region, then for its DBPI class lists the estimated daily hire ($/day) to every destination, ranked best-first, with the laden distance, voyage days and the trade direction (how headhaul vs backhaul the lane is).
How this relates to the Market page. These are route-specific daily-hire estimates - the per-lane route_rate trade-balance model, for THIS ship from where it is now. That makes them a voyage-level figure that can sit below the market-wide band headline on the Market page, which is the bottom-up busiest-lane average for the whole size class. Same market, two related views: the headline level vs what one ship earns on one lane. The same per-route model also feeds Forward Voyages, the Fleet Optimizer and the Rankings TCE.
Region granularity follows the ship. Above the 17.5k-DWT macro cut the destinations are the broad basins (Continent/Baltic, Far East, ECSA, Med, US Gulf, Persian Gulf, …); smaller classes drill down to country-level regions. So a Panamax loading in the Baltic sees Baltic→Far East, Baltic→ECSA, Baltic→Med and so on, each with its own $/day.
Ship FFA snapshot. At the top sits a momentum card for the ship’s class: the current SPOT daily-hire, how far it sits above/below a balanced market, 1-day and 7-day change, and the strongest lane in the class right now - plus the headline DBPI, LSR and port/sea ratio. It’s our DBPI-derived forward read (there is no live FFA feed), so treat it as market commentary, not a fixture quote or investment advice. Rates are daily-hire equivalents from the trade-balance model; voyage days assume the ship’s current speed plus typical port time.
How firm is each number? Every lane carries a confidence mark - strong (many real laden voyages on the exact lane), moderate (some), or modeled (no direct fixtures yet, so the rate is inferred from regional rates & trade flow). A coverage line shows how many lanes are observed vs modeled and how many real voyages sit behind the view. This is deliberate: today many macro lanes are still modeled, and as the voyage history fills they cross to observed and the picture sharpens - you can watch the confidence rise over the coming months.
Operational profile - the ship's realized capability
At the top of the Overview tab, the Operational profile summarises how this specific ship actually performs, built only from its observed voyages and AIS track: realized speed (median AIS underway speed, with how it compares to the design service speed), the voyage-effective speed (door-to-door, including port approaches), typical sea days per voyage, port turnaround (wait + berth days), and the laden ratio (share of voyages loaded). A confidence mark shows how many completed voyages back the profile.
This is deliberately a ship-specific, accruing picture - thin at first, sharpening with every completed voyage. It is the foundation for forward planning: once a ship's real speed, turnaround and employment pattern are well-observed, the system can project a realistic forward schedule for it. A planning aid from observed behaviour, not a guarantee.
How the Where-to-load page is laid out - SPOT vs FIXED, in 3 stages
The Where-to-load page opens with a one-line status band that answers the only question that changes what you should do with a ship: is she OPEN (SPOT) or FIXED?
- OPEN / SPOT - she can take your next cargo, so she gets the full where-to-load read: a Low / Mid / High potential chip, the live reposition hero and ranked load ports. Two cases are OPEN: a laden ship (she is carrying cargo now but will open at her discharge region - the read is scored from there, where she hunts her next cargo), and an idle ballaster with no onward destination.
- FIXED - she is sailing empty (ballast) toward a load port, i.e. she has already fixed a cargo and is repositioning to lift it. Only this case is committed, so spot ‘load here’ advice would be noise - instead she gets a hire benchmark (what the lanes pay, $/day, busiest first) as a market read, not a routing recommendation.
So a laden ship that just loaded and sailed is OPEN, not fixed - she opens at discharge and the page shows where to load from there. Only an empty ship steaming to her load berth is FIXED. (If her load condition genuinely can’t be read she is treated as OPEN.)
Below the band the page reads top-to-bottom as one decision flow, in three stages: 1 · Where should she load today? (the SPOT hero or the FIXED benchmark, plus the Positioning vs fundamentals strip - is the fleet crowding into her region ahead of cargo, or is cargo outrunning tonnage?); 2 · The period ahead (the projected forward voyages and the at-a-glance KPIs); and 3 · The 12-month picture (the annual rotation with its Optimise-for tabs). The older overlapping tools - the four-policy scenario compare and the daily reposition advisor - are tucked into a collapsed Advanced section at the bottom; nothing was removed. For an OPEN (spot) ship, stage 1 now opens with a visual load-decision block: a colour-coded verdict (FIX HERE / BALLAST to a basin / WAIT), four headline numbers (best net $/day, the gap to break-even, the ballast days to get there, and load demand), and a bar chart ranking every reachable load region by net $/day with the break-even line marked - so the earn-versus-empty-leg trade-off reads at a glance. All $/day figures are rounded to the nearest hundred.
Forward Voyages - where this ship is likely to trade next
The Forward Voyages tab projects the ship's next few employment legs: starting from where it is now, a chain of load region → discharge voyages, each with a projected date window, voyage days timed by this ship's own realized speed, an estimated daily hire, and a confidence mark. A horizon line sums the total days; a survey-due note flags any dry-dock window that falls inside it.
It is built from how the peer fleet of this class typically employs a ship from each position (feasibility + observed discharge patterns + port activity), priced with the trade-balance rate model and timed by the ship's operational profile. Treat it as a projection, not a committed schedule or advice - confidence is low while the voyage history is thin, and both the accuracy and the horizon grow as coverage builds. This is the path toward a true forward (eventually 12-month) schedule.
Each leg is shown port-to-port - the projected load port and discharge port (with regions) and the days for that hop - so the chain reads as a sequence (load A → discharge B, then B-area → discharge C, and so on). Two earning estimates sit side by side per leg: a Model rate (the trade-balance lane model) and an FFA rate (the ship's FFA class spot scaled to that lane). As more voyages are observed the predicted ports, timing and both rates auto-refresh - the projection gets sharper and longer on its own.
The chain is a rotation, not a loop. Each step remembers the load and discharge ports it has already used earlier in the same projection and down-weights them, so the sequence moves through the ship's realistic round of trades instead of repeating the single most-likely hop every leg. A ship with only one strongly observed pattern can still show it more than once - the repeat is suppressed only where the data offers a competitive alternative.
Port time is now observed, by tonnage. Each leg’s days include the real turnaround at its load and discharge ports - the median berth (load/discharge) plus anchorage wait that vessels of this ship’s DWT class actually record there, drawn from the port pages’ "Turnaround by tonnage" table. Hover the Days cell to see the split (ballast + laden + port, with the load and discharge port days broken out); a small "incl. N d port" note marks legs timed from observed turnaround rather than a flat estimate. Where a port has no class history yet the leg falls back to a modelled port time and the header says so. As ports accumulate calls the port time - and therefore the whole horizon - converges on reality, the foundation for accurate net 365-day voyage totals.
Tonnage-scaled realism. Every next-load pick - here, in the annual schedule and in the scenario compare - runs through the same rule: the candidate must be a real, reachable load port (the ballast.json feasibility matrix + the ship’s age/size limits), within her honest ballast range for her deadweight (a bigger ship can reposition further), and the onward laden leg must clear a size-scaled minimum (a Capesize or Panamax trades ocean voyages, not a few-hundred-mile coastal hop). That floor is why a Panamax now projects a realistic handful of long-haul voyages a year rather than a string of short hops, and why synthetic non-port positions never appear as a suggested load or discharge. The projection also only offers a discharge the vessel can physically reach: each port’s real size ceiling is learned from history (the largest tonnage at least two different ships have actually brought in laden), so a big bulker is never routed to a restricted river port it cannot enter - a one-off bad position never lifts that ceiling - while navigable rivers that genuinely host large ships (e.g. the Yangtze or the Paraná upriver) stay open, with no hand-maintained river list. Sea-river vessels keep their river ports.
Cargo Routes tab. The Cargo Routes page - its own card on the ship hub (and a tab on the classic view) - answers a different question - not where this ship will go, but what cargo lanes are actually moving around her right now, for her size. It snaps her live position to the region she is in (or, if she is mid-ocean, the region she has declared she is heading to), matches her to her true peer cohort - ships within ±10% of her DWT and ±3 build-years, the same definition the Benchmark tab uses - and pulls the matching laden trade lanes straight from the fleet-wide Cargo Routes engine - load → discharge, voyage count, her estimated TCT (the indicative daily time-charter rate for her size class on each lane - the live lane rate where the market prices that direction, else her band’s current market level) and average days over the last 12 months. If too few peer lanes are trading her region it gracefully widens the cohort (±15% DWT / ±5 years), and as a last resort falls back to her broad tonnage band - the line under the title always states which basis produced the rows. Each row’s Details → opens that lane’s full history page. Same laden-only engine as the main Cargo Routes board, just pre-filtered to her region and band, so you can see at a glance what employment is on offer near an open ship.
Annual schedule - a projected 12-month rotation
On the Where to load service page, below the projected forward voyages, an Annual schedule card extends the rotation to a full 12-month horizon: it keeps chaining legs until about a year of employment is filled, then prices each at today’s lane rate. You choose the objective with the Optimise for tab strip - the same rotation re-ranked for a different goal, like a Scenario Compare for the whole forward chain:
- Max Profitable - the default. Each leg is the most profitable net-TCE voyage she can reach (the classic earnings rotation).
- Familiar Routes - the profitable rotation re-ranked toward ports and basins this ship has actually traded (her trade-footprint from observed voyages), so she is not pushed into a region she never works just because the rate is high - a Black Sea ship stays a Black Sea ship. Ports in a country she has loaded get a priority boost; basins she has never touched are down-weighted (a soft preference, so a genuinely exceptional cross-basin fixture can still win and the chain never dead-ends). Ships with a strong history (≥8 countries across ≥2 basins) also get an Only familiar regions checkbox for a hard fence; a ship with no trade history yet falls back to Max Profitable, clearly labelled. Each leg shows a small tier chip (traded this country / home basin / been here / off her footprint).
- Green Routes - the lowest-carbon rotation: each leg minimises CO₂ per laden mile (short, fuel-efficient hauls and cheap repositioning), with a hard profit floor so it never recommends a money-loser. Each laden leg shows its CO₂/laden-nm.
- Activity (PAI→RAI) - each leg ballasts to the highest-PAI (busiest-loading) reachable port, then works that load’s highest-RAI (busiest) route, never a money-loser when a paying reachable leg exists (else flagged ⚠ uneconomic). This is the tab that applies the ship’s age cohort + the over-age region screen (see the age-cohort section above).
- Summary tiles - voyages per year, indicative gross & net TCE for the year, sea vs port days with a utilisation %, and distance.
- Rotation table - every projected leg with its load and discharge, the ballast nm (the empty reposition leg) and the laden nm (the loaded leg) shown as separate columns, the voyage days - which cover the WHOLE voyage (ballast steam + load-port stay + laden steam + discharge-port stay), so a short ballast can still be a long voyage - the cumulative month it falls in, the lane TCE ($/day) and the net over the band break-even. Distances follow the real sea route (searoute shipping lanes, the same path the map draws) rather than a straight line, so legs that route around land read correctly.
It is an indicative planning lens - ‘what a year of this ship’s typical trading looks like’ - not a committed schedule. Each leg is projected at its own calendar month, so the seasonal demand index tilts the chain month-by-month (built from voyage history). It sharpens as the ship’s own history accrues; a dedicated 2-year route-seasonality forecast graduates automatically as that runway fills.
A map under the summary draws the whole rotation: dashed orange ballast legs and green laden legs, with the net $/day labelled on each laden leg and load/discharge port pins you can click for the details.
The rotation is also draft-checked: each load/discharge port is compared to the deepest laden vessel ever observed calling there. Where a deeper ship has called the port is proven for her draft; where none has, the leg is flagged ⚠ - verify she fits at full draft. It is observational (a lower bound), not a charted depth.
Age-stratified PAI & RAI - scored for this ship's own age cohort
Activity isn’t age-blind. A 3-year-old eco ship and a 22-year-old hull of the same size do not see the same ports and routes: many terminals, receivers and charterers screen on vessel age, so the busiest loading ports and the busiest routes differ by age. Every tonnage band’s PAI (port activity) and RAI (route activity) is therefore computed three times - once for each age cohort: under 15 years, 15-25 years and 25 years and over - alongside the headline all-ages number.
The Annual schedule (and Activity-mode Forward Voyages) automatically scores each leg on this ship’s own age cohort. A leg ranked on her age band carries a small ●<15-style marker next to its PAI/RAI; a leg with no marker fell back to the general all-ages number because that exact port or route didn’t yet have enough same-age voyages to stand on its own. This is deliberate honesty: an age cell is only published when at least two vessels of that age actually loaded there (or ran that lane), so a 3-band split appears only where it is real - never invented.
Age also acts as a hard block, not just a tilt. Before a load region is even ranked it is dropped from the candidate set when the ship is over the empirical age ceiling for that region and size (the P90 of ages that have actually loaded there), so an over-age vessel is steered away from markets she realistically can’t fix rather than shown a busy port she would be turned away from. The header line names her cohort and how many legs scored on her own age band versus the general fallback. (The Earnings $/day view stays purely on money and is unaffected by the age tier.)
Where-to-load track record
The annual schedule now keeps itself honest. Every week the system logs the first projected loadings for tracked vessels, and as the projected windows close it grades each prediction against what the ship actually did: same port, same country, or a miss. The Where-to-load page shows the resulting track record badge - “X% first-load hit (… graded, … pending)” - a true out-of-sample score that the model earns voyage by voyage. While the first predictions are still maturing the badge simply says the record is building.
Next port forecast (Where to load)
The Next port forecast card on the Where-to-load page answers the most natural question about any ship: where does she go next? It is built from what her size band actually did - every observed move in our voyage history is counted: after discharging at port D, where did band peers sail to load next; and for a laden ship, where cargo loaded at port A typically gets discharged.
You get the top-3 candidate ports with probabilities, the evidence behind each (how many peer moves), distance and approximate sailing days. For a laden vessel the card shows the expected discharge first, then the likely reload conditional on it. Every answer states its evidence basis honestly: the most specific evidence available - exact-port history when it runs deep enough, broader cohort behaviour as an honest fallback when it is thin - and a THIN flag when the sample is small.
This is a behavioural projection, not a fixture prediction: single-ship decisions depend on private fixtures no one can see in AIS. That is why every forecast is also logged and later graded against the port the ship really loaded at next - the accuracy record builds in the open, the same out-of-sample discipline as the annual schedule and the market forecast.
Deep-history overlay: the suggested load ports now include ports that regularly serve this ship's size across the full berth-call record - marked with a green dot - even if no peer loaded there in the recent window. A quiet week no longer hides an established load port for her class. The live peer-demand ranking is unchanged; these are added below it, clearly flagged.
Scored from where she opens: a laden ship (or one steaming to a declared open port) is scored from the country she discharges in - she ballasts to her next load from there, so the candidate load regions are the ones ballast.json says she can reach from that open region for her tonnage, not whatever is near her current mid-voyage position.
Operational feasibility - vessel age & trading history
The where-to-load recommendation and the My Fleet open-tonnage board check each candidate against what the ship can operationally do, so the engine never steers a vessel into a market it realistically can't work. Two checks re-weight every candidate (the candidate list is unchanged - only the ranking moves):
Vessel age vs market - learned from real data. For every country and ship-size class we measure, from our own voyage history, the ages of the ships that have actually loaded there, and take the practical ceiling (the 90th-percentile age). A vessel over that empirical ceiling for a market is never recommended there - it still appears in the candidate list, marked with the reason, but it can't be the headline pick. This is fully data-driven: which markets are age-strict and at what age emerges from the data, not from a fixed rule - iron-ore majors (Brazil, Australia) come out young and strict for big ships, while scrap and small-bulk ports run far more lenient, and the ceiling auto-updates as more voyages accrue. It is an observed-fleet-age signal (a proxy for terminal and charterer age vetting), not a published policy.
Trading history. The engine also compares each candidate against the countries the ship has actually traded; a region she has worked ranks at full weight, one she has never been to is nudged down slightly. Ships with little or no history aren't penalised - they rank exactly as the pure-earnings model would, so the safeguard only ever removes operationally-implausible advice, never invents it.
Country-level recommendations. Where-to-load now ranks individual countries (not broad basins) for every ship size: each reachable country is valued by its region's live $/day, then re-weighted by the empirical per-country age ceiling and the ship's own trading history, so you see exactly which countries pay best and will take your vessel given her age. The top 20 are shown (with a ‘show more’), each tagged with its basin.
Scenario compare - optimise for cost, money or carbon
Right under the next-port forecast, the Scenario compare strip answers the question every owner actually argues about: follow the market, or optimise? It scores the same candidate universe as the Reposition advisor and the live-market cards - every load region that is ballast.json-reachable from where she next opens, vetted for her age and size, drawn from next_voyage_options and anchored on her open/discharge region - if she is laden or steaming to a declared open port, the search starts from that region's country (she ballasts to her next load from there), not her mid-voyage AIS waypoint. Out-of-range now means not ballast.json-reachable for her tonnage, not merely far. Each region carries one net round-trip TCE; the four policies simply re-rank that single set:
- Market-follows - the region her size band is actually heading to in the largest numbers (the behavioural baseline, ties broken by nearest).
- Least ballast - shortest empty positioning leg.
- Max earnings - best net TCE/day after the ballast leg dilutes the voyage. Because it is scored on the same engine, Max earnings now equals the Reposition advisor's recommendation - the two surfaces no longer disagree.
- Greenest - lowest CO2 per laden day (transport-work efficiency, the same lens CII uses).
Each tile reads load region → discharge region with the single net TCE/day figure, the empty miles, the CO2 per laden day, and the dollar delta against Market-follows - so a trade-off like “+$4,000/day AND less CO2 by NOT following the crowd” is visible at a glance. Rates come from the live lane model, fuel from her class profile at the latest VLSFO price. A screening comparison, not a fixture calculation - the assumptions are printed under the strip.
Ranked by activity (PAI): the reachable load regions are ordered by their Port Activity Index - how busy the busiest loading port in that region is for her tonnage - with the net $/day on every card, so you see where the cargo actually is first and the earning rate alongside. The green-highlighted card stays the best-$/day pick.
Idle cost - the demurrage meter
Idle cost (demurrage meter). The performance tab now shows the opportunity cost of waiting: the days the ship sat at anchorage (awaiting a berth or orders) valued at her band's daily market hire - the money she could have earned steaming a cargo instead. Berth time (working cargo) is excluded; that is productive. It is indicative (hire is the live band rate, not a fixture), but it puts a dollar figure on idle time that the utilisation percentage alone hides.
Where to load: Demand vs Supply for ships like her + busiest load ports
On the Where to load service page, below the “Where should she load today?” verdict, two reads make the call concrete. Demand vs Supply (ships like her) runs the same demand-vs-supply verdict you see on the Market page, but scoped to her peer cohort - every ship within ±10% DWT and ±3 build-years of her. For each region those peers loaded, a coloured chip reads demand-led (cargo getting abundant), supply-led (ships getting scarce), cooling or balanced; the region recommended above is marked with a ★. Demand is read off how heavily the cohort actually loaded (median load factor); supply from her band’s inbound-ballast change. It is a present-state positioning read, not a forecast, and a single cohort slice is thin - regions without enough loads show ‘thin sample’ honestly.
Busiest load ports. Once a region is recommended, the page lists the specific load ports inside that region that ships like her actually use - ranked by peer demand, each with a PAI loading-activity badge, the number of peers that loaded there, and the ballast distance. So the advice is ‘load at this port in the region’, not just the region. Every port shown is guaranteed to sit inside the recommended region.
Vessel particulars (measured) - speed, consumption & capacity
The right-hand Performance & capacity card on a ship page shows her measured particulars - drawn from a curated per-ship database, not guessed from her size band. When we hold them, you see her real:
- Speed & consumption curve - warranted knots and tonnes/day of IFO (plus MDO) for both the laden and ballast legs, and the in-port working burn. This is the heart of an accurate voyage cost.
- Draft and TPC (tonnes per centimetre), grain cubic (m³ and ft³), and holds / hatches - the numbers that decide whether she cubes-out or weighs-out on a given cargo and fits a given berth.
- Gear - her cranes and their SWL, or whether she is gearless, plus grabs.
- Fitted flags - ice class, CO₂, AHL (alternate-hold loading), laker, logger.
These are warranted, approximate figures (a ship is quoted with an about-half-a-knot and about-5% tolerance) and the card is display-only for now - it does not change the earnings, TCE or rankings numbers elsewhere on the site. The card appears only for ships we hold particulars for, and carries a measured tag so you can tell a real curve from a band default. A later step will let these measured curves drive the per-ship voyage P&L and CII once each ship's figures are confirmed.
Agency fee (PDA) estimate
The ship page gives the agency fee two ways. The Agency fee (PDA) estimate card has a port picker - start typing a port name or LOCODE, choose it, and see her indicative agency fee there. And on the voyage timeline, each loading / discharge call now carries an Est. PDA line, so you can read the agency-fee component port-by-port across her recent voyages (anchorage calls included).
It is an indicative agency-fee component only - a quick size-and-port-scaled figure, not a full proforma DA (it excludes pilotage, towage, port dues, cargo-handling). Always confirm with your agent. The raw rates are commercial and members-only; the page shows only the computed fee.
One engine behind every $/day on this page
The same ship, the same number, everywhere. Every earnings-per-day figure on a ship’s page - the Market tab’s “best net TCE from here,” each leg of the forward voyage chain, and the Fix This Cargo quote - is now computed by the one voyage scorer that drives the My Fleet board. So a hull can no longer show one $/day on one card and a different $/day on another: they all run the full-cycle net time-charter equivalent (hire minus ballast bunkers, port days and canal tolls), from her real open position.
Where a page also shows the raw lane rate, it is now labelled plainly as gross hire and kept as a secondary column, so you can see both the headline market rate and what this specific ship actually nets after repositioning. In the Speed & carbon optimiser the sweep still holds the cargo’s gross freight fixed (that is the correct basis for a speed decision - netting it would double-count fuel the sweep is already re-optimising), and the ship’s net employment TCE is shown right beside it as the board-consistent reference.
Route Yield Calculator (July 2026)
The ship page now has a Route Yield section: pick any load region and any discharge region and see what that trade pays for this vessel - the market lane rate (position-neutral daily hire for the size class, the same figure the globe and board publish) next to this ship's net daily (its expected TCE from its current position, after the ballast leg and its real fuel and speed - the same engine behind the fleet board). Hover any basin on the built-in map to see today's lane rates from there to every other basin for this ship's size class, or pick two exact ports (e.g. Izmir to Jebel Ali): regional rates are referenced at each basin's bunker hub, and the hub-to-port steaming legs are added at the ship's own speed and consumption for a port-adjusted daily figure. A forward strip also projects what she would earn on the same route in each of the coming months, re-anchored month by month on the forward curve for her size class.
Max-Lift Intake Envelope (Route Yield)
On the Route Yield page, picking a load and discharge port also runs the Max-Lift Intake Envelope - an evidence-backed answer to one question: how many more tonnes can this ship provably lift on this pair? The envelope is the tightest of four limits: the deepest observed laden departure draft at the load port, the deepest observed laden arrival draft at the discharge port (both from ships in the same DWT band, with dated examples you can verify with your agent - sister ships are highlighted), and the published maximum draft at either end. Metres convert to tonnes via the ship's own TPC.
The card is honest by design: a single observation is labelled thin evidence, gaps smaller than the 0.30 m draught noise floor are called out as measurement noise, fresh-water ports are flagged (no allowance applied yet), and if nothing is observable it says so instead of guessing. When the envelope is deeper than the ship's marks, that is proof peers sailed full; when it is shallower, the card shows the tonnes the port provably costs her.