Open tonnage & Ballaster Radar - user guide
This is shipdata.net's tonnage-finding workbench, living at one URL (/radar). It answers two questions from a single screen: "who is going to be open, and where?" (browse mode) and "of all the open and soon-open ships, who can actually make my laycan at my load port?" (cargo-match mode). The behaviour flips entirely on whether the Load port box is filled. Type a port and the fleet is ranked by a 0-100 Fit score that steams each ship the real sea route from where it becomes free; leave it blank and you get the paginated open-tonnage board filterable by predicted open region and days-to-open.
What this page is, and the merge you should know about
There used to be two pages: an Open tonnage board at /tonnage and a Ballaster Radar at /radar. They are now one tool. /tonnage issues a server redirect straight to /radar, so any old bookmark lands in the same place. The board lives on as Radar's browse mode.
- One box decides the mode. The toolbar's Load port field is the master switch. Fill it (port name or LOCODE) and you are in cargo-match mode; leave it blank and you are in browse mode. The page header note states this plainly: "With a load port → ships ranked by how well they fit your cargo, steaming the real sea route from where each becomes open … Leave the port blank → browse the whole open-tonnage board."
- What it predicts. For every trackable ship the engine predicts the next time and place it becomes OPEN for a fixture, from its current AIS state plus historical median berth times. A ship at a berth opens when its time-in-berth reaches the port's median; a laden ship at sea opens on arrival plus discharge berth time; a ballaster at sea opens on arrival; a prompt ballaster with no destination opens now at its nearest port.
- Coverage honesty. The note ends "Built on AIS + the position feed (ships off AIS included)." The candidate set deliberately includes ships currently dark on AIS (pulled in via the position feed and the open-state log), which widens the net - but coverage is still partial, so treat low-confidence and stale rows as indicative only. When a candidate's AIS has gone dark/stale, the engine now prefers the position feed's declared open port and laycan over the last (often weeks-old) AIS position - so an AIS-silent ship surfaces where the market actually has it opening, not where it was last seen, and is shown at medium confidence.
- Who it's for. A charterer with a specific stem uses cargo-match mode to build a ranked tonnage list against a real laycan and load port; a broker or owner uses browse mode to watch where ballasters and soon-open ships are piling up by region.
Implementation note for the curious: the rich legacy OPEN_TONNAGE_HTML board (with IMO, Grab, Ice, State, Conf, Last-seen, Likely-loading-regions and Basis columns) still exists in the codebase and is exactly what /api/open_tonnage returns. But the page you actually land on is the Radar shell (RADAR_HTML), and its browse view renders a trimmer subset of those columns. Both modes are powered by the same underlying open-prediction engine (_estimate).
The Load port box and the two-mode switch
The first toolbar field is the control everything hinges on.
- Load port - a type-ahead text input labelled (blank = browse all), placeholder
Type port or LOCODE. After you type two or more characters it queries/api/port_searchover the full port database (all coordinated ports, not just busy ones), so obscure load ports - small coastal hubs, Bissau, etc. - are reachable. Suggestions render asBRPNG - Paranagua, BR(LOCODE - Name, Country). When you pick one, the tool extracts just the leading LOCODE token to query on. You can also type a bare name like "Bissau": the backend resolves it by exact-then-prefix name match, deliberately skipping%Anchoragegeofences so it picks the berth port rather than an offshore waiting area. - Enter to run. Pressing Enter in the port box fires the search, same as the Find tonnage button.
- How the mode shows up. With a value you are in cargo-match mode: the URL becomes
/radar?port=…, the pager hides, and the table is the ranked Fit grid (capped at the top 40). Empty box = browse mode: the URL dropsport, the board renders, and a Prev/Next pager appears. - Result-count chip. Top-right of the toolbar (pushed there with
margin-left:auto) a muted counter reports the haul. In cargo mode it reads<Port name> · N candidate ship(s); in browse modeN open ship(s) · X ballast · Y open ≤7d. Read this first - it is your one-glance gauge of how much tonnage the filters returned and how much of it is prompt/ballast. - Auto-load on open. The page always renders something immediately: if the URL carries a port it runs cargo match, otherwise it loads the board. While it works you see
Scanning the fleet…(cargo) orLoading open tonnage…(browse); on failure,Could not load radar./Could not load tonnage.
Laycan, DWT and the chartering filters (apply in both modes)
The toolbar carries two rows of filters. These apply as hard constraints - a ship failing any one is dropped entirely, not merely down-ranked (the exceptions are DWT and laycan in cargo mode, which also feed the soft Fit score, explained below).
- Laycan - a pair of native date pickers (start - end). In cargo-match mode this is the window the predicted arrival must hit to score a perfect 100 on laycan fit. Leave both blank and cargo mode simply ranks on ETA (every ship scores 100 on laycan, so confidence and size break the ties). In browse mode the radar shell does not send these dates to the board.
- DWT min / max - deadweight band. A ship below min or above max is excluded outright. In cargo mode DWT additionally drives the size-fit multiplier: a ship just outside the band is not killed on size alone but its Fit is tapered down toward a floor (so a near-miss on size can still surface).
- Segment(s) - comma-separated vessel-type names (e.g.
Supramax,UltramaxorBulk Carrier,MPP), matched against the registry vessel type, falling back to the AIS ship-type group when the registry is silent. - Gear - dropdown: any / geared / gearless. A ship counts as geared if the registry shows cranes or gears. Pick
gearlessto force gearless tonnage, orgearedwhen the berth has no shore cranes. - grab / ice - checkboxes.
grabkeeps only ships flagged grab-fitted (the backend treats0/no/n/-/noneas not grab-fitted); use it for self-discharge of coal/aggregates.icekeeps only ice-classed tonnage for high-latitude or winter Baltic / St-Lawrence business. - Max draft - metres (
step 0.1); excludes ships whose registry loaded draft exceeds your berth/river restriction. Note this filters on the ship's reference draft, not its momentary AIS draught. - Built (from - to) - year-of-build range. A ship with no recorded build year is dropped when either bound is set, so screening for "max 15 years" also removes age-unknown tonnage.
- Flag - free-text, case-insensitive substring against the flag column (e.g.
Panama,MH). Used to require open registries or screen out unwanted/sanctioned flags.
Filter values are written into the URL, so a fully-filtered radar view is shareable and bookmarkable; the page restores every field from the URL on load. Both Find tonnage buttons re-run the search.
Browse-mode-only filters: region, days-to-open, ballast
Three controls only bite when the load port is blank (the whole-board scan). The radar shell only forwards Open region and Open in to the board endpoint; ballast only is shared with cargo mode.
- Open region(s) - a free-text box, placeholder
Open region(s) - browse mode, with a tooltip stating it filters the board by the ship's predicted open region - where it will become free, not where it sits now. The match is exact (lower-cased) against the engine's coarse maritime basins (Black Sea, Mediterranean, Red Sea, Arabian Gulf, S. America, West Africa, SE Asia, etc., plus an "open sea / other" fallback). Use it to answer "how many ships open in the Med over the next week?" - Open in … d - a days number box (tooltip: only ships opening within N days). Caps the board to prompt tonnage; a ship whose predicted open date is unknown or beyond N days is dropped. Set 7 or 10 to ignore tonnage that won't free up in time for a prompt stem.
- ballast only - checkbox (tooltip: Exclude laden ships that will only open after they discharge). Pure ballasters are the cleanest prompt tonnage. This box is also honoured in cargo mode, where it drops any candidate that isn't currently in ballast.
- hide inbound - checkbox; tooltip: Cargo mode: hide ships already heading to this port (0 nm) and show only tonnage that must ballast here from elsewhere. This one is for cargo-match mode: a ship predicted to open at the load port itself shows 0 nm distance and an inbound tag; tick this to suppress them and see only genuine repositioning candidates.
Reading tip: the count chip's … ballast · … open ≤7d breakdown pairs naturally with these - read the totals first, then tighten Open in and ballast only to isolate the prompt slice.
Cargo-match result table - "who can make my laycan"
With a load port set, results render as a ranked grid, top 40 by Fit. Internally the engine first narrows the fleet to the genuinely nearby candidates, computes the expensive real sea route only for those, then sorts by Fit and keeps the top 40 - so the list is the genuinely close, genuinely well-fitting tonnage. Columns left to right:
- Fit - the headline 0-100 score, a coloured pill: green ≥80 (
.fit.hi) = strong fit, amber 50-79 (.fit.md) = workable, grey <50 (.fit.lo) = marginal. Sort your thinking around this column; the scoring math is in the next section. - Ship - clickable name linking to
/ship/<imo>(the ship's profile page). If the ship is inbound to the load port, an inbound tag appears right after the name. - DWT - deadweight, right-aligned and thousands-formatted.
- Segment - vessel type (registry type, else AIS group, else "Unspecified").
- Status - a load pill plus the AIS state text. Ballast (amber) means in ballast; Laden (green) means loaded; the state word (Sea / Port / Anchorage / Idle) follows. Ballasters are the cleanest prompt tonnage; a laden ship only shows here if it discharges within your laycan horizon.
- Potential - the open-outlook pill (see the colour key in the next section). It tells you why the ship will open: a laden-at-sea ship is High Potential (opens on discharge), a committed ballaster reads Fixed, etc.
- Open in - predicted days until the ship is free, e.g.
3.4d, or-if unknown. - Opens at - the human port name where it becomes free (its discharge port, current berth, or nearest port).
- Distance - the sea-route nautical miles from the open port to your load port.
at portmeans 0 nm (inbound). Hover the cell: its tooltip is thedistance_method- eithersea-route(true routed distance via the searoute engine) orgreat-circle(straight-line fallback when routing fails). Prefer sea-route distances for steaming estimates; a great-circle figure can understate real miles around land. - ETA - total days from now to arrival at the load port, i.e. open-in days + steaming days. Steaming uses the ship's registry service speed, with a typical ballast-speed fallback when no usable figure is on file.
- Arrival - that ETA expressed as a calendar date (e.g.
14 Jun), so you can eyeball it against your laycan window directly. - Contact - the charterer/operator company on file. This column is permission-gated: it only carries data for users entitled to contacts; otherwise it shows
-.
Sort by any column. Click a header to sort the candidate list by that column - Fit, DWT, distance, ETA, open-in-days and so on. Numeric columns sort highest-first on the first click; click again to reverse. Blanks always sink to the bottom. The cargo-match list is not paginated, so the sort spans every candidate ship shown.
How prompt tonnage ranks (2026 tuning). A ship that becomes open before your laycan opens can idle and load on time, so it now ranks near the top (it is the surest tonnage), instead of being pushed down for being “too early.” The DWT box is a soft band: ships a little outside your size window still appear, scored down somewhat - useful when you would flex on size. Two hard screens also apply, the same rules the where-to-load engine uses: a ship that cannot realistically ballast to the load port for her tonnage is dropped, and a hull over the empirical age ceiling for that load country is demoted (effectively deselected once well over it).
How the arrival date is built. The Arrival / ETA is the full picture, not just steaming time: it is when the ship frees up plus the ballast steam to your load port. Freeing up includes the time she still owes at her current or discharge port - and that port time is tonnage-graded: the median berth (load/discharge) days and the anchorage-queue wait that a vessel of her size class actually spends at that port, from real voyage history. So a Kamsarmax queuing at a congested discharge port shows a later, realistic arrival than a small ship at a quick berth - the same turnaround the forward schedule uses.
Load-basin positioning - the radar strip
Above the cargo-match results a one-line Load-basin positioning strip shows the present-state reflexivity read for the load port's basin, filtered to the bands that overlap your DWT window - so it speaks to the cargo you are actually fixing. ▲ crowding = ships piling into the basin ahead of realised cargo (overshoot-prone); ▼ squeeze = cargo present, tonnage scarce (rate-supportive). It is the same read as the Market radar - no second model - and stays silent when the basin maps to no matching cell or the weekly runway is still building. Use it to sense whether you are chasing tonnage into a crowd or into a gap before you start calling owners. Present state, not a forecast.
How the Fit score is built (laycan × size × confidence)
The Fit pill blends how well a ship fits on timing, on size and on how confident the prediction is into a single 0-100 number. Understanding each input lets you read why a ship scored what it did.
- Laycan fit (0-100). If the predicted arrival lands inside your window it scores full marks. Arriving early is only a mild penalty - the ship can wait; arriving late (past the cancelling date) is penalised much more heavily. The asymmetry deliberately favours ships that arrive on time or a touch early over ships that arrive late. With no laycan set, laycan fit is neutral for everyone and ranking falls back to size and confidence (and then ETA-driven ordering of equals).
- Size fit. Inside your DWT band there is no penalty. Outside the band size fit eases off the further out the ship is, but never all the way down - a floor means a size near-miss still surfaces with a markedly capped Fit even on a perfect laycan, while a wildly wrong size is held at that floor rather than erased. If you set no DWT band, size fit is neutral for all.
- Confidence weight. The prediction's reliability pulls the whole score down for medium- and low-confidence predictions. Confidence is high for ships seen recently with a clear state/destination, drops to med for older or weaker signals, and falls to low for stale or signal-poor ships. When a ship is AIS-dark but the freight feed carries a fresh, dated open, that reported open port + laycan is used and scored at medium confidence - more reliable than a stale-AIS guess, but never high.
- Trade-footprint affinity. A further, gentle influence: a ship that has recently traded the load port's exact country (✓ trades here) is favoured over one that has never worked that country (new to country) - from the visited-countries footprint. Matching is country-exact (no broad macro-region tier), so the badge means the ship genuinely called that country. It only nudges the ranking (a tie-breaker, never a filter); a ship with no footprint data is treated neutrally. The badge next to Opens at shows which tier applied. You can also fill the optional Discharge box (a country or a port) - the radar then adds a second, gentler affinity for the discharge end (↓ disch here / new disch), so a ship that has worked both your load AND discharge countries ranks highest. The load end still dominates (the ship must physically reach it); the discharge match is a tie-breaking bonus. The practical effect: a stale ship can never reach the very top of the list even on a perfect laycan-and-size match, which is the intended caution against acting on old positions.
Worked read: a green 90+ pill means "right size, arrives in-window, recently confirmed" - call it first. An amber 50-70 usually means one of: a few days early/late, slightly off-band, or a medium-confidence position. A grey sub-50 is a stretch - typically late arrival, well off-size, or stale.
Browse-mode board - scanning where tonnage opens
With the port box empty you get the open-tonnage board: every trackable ship with its predicted next-open, paginated 20 per page. Columns left to right:
- Ship - clickable name to
/ship/<imo>. - DWT - deadweight, right-aligned.
- Segment - vessel type.
- Flag - registry flag.
- Gear - the crane/gear description if geared, else an em-dash. Quick read for grab/crane self-discharge capability.
- Draft - reference draft in metres, right-aligned.
- Load - the same amber Ballast / green Laden pill as cargo mode. Ballast rows are prompt tonnage; laden rows only open after they discharge.
- Open in - predicted days to open (e.g.
5d), right-aligned, or-. - Open region - the coarse basin where it will become free (this is what the Open region filter matches against).
- Open port - the human name of the predicted open port.
- Outlook - the open-outlook pill, colour-keyed: High Potential (laden at sea - opens on discharge), Mid Potential (laden at anchorage - waiting to berth), Low Potential (laden moored - actively discharging), Fixed (a ballaster already committed to a fixture), and Unknown (insufficient signal). For prompt cargo you want High and Mid; Fixed tonnage is moving but already spoken for.
- Contact - charterer/operator company, again permission-gated to entitled users.
- Refixture gap - Acık Defter: this operator’s realised MEDIAN days from a discharge to the next cargo load, off actual voyage history (not a survey). A short gap means this fleet typically gets re-fixed fast - sometimes before a ship even finishes discharging - which is exactly why a ship that looks “opening soon” may never actually reach the open market. “(fleet avg)” marks an operator with too little history of its own, shrunk toward the fleet-wide median rather than shown confidently on 1-2 data points.
- P(open 7d) - Acık Defter: the probability this ship is genuinely still open - not already quietly re-fixed by her operator - within 7 days. Combines her physical ETA-to-open with her operator’s realised refixture-gap history; reads insufficient rather than a fabricated number when there is not enough data to support one. Check the sort by open probability toggle in the filter bar to rank the whole board by this figure, or set a Min P(open 7d) floor to hide ships unlikely to genuinely be available.
Pager. Below the table sit ← Prev / Next → buttons and a Page X / Y indicator; the buttons disable at the ends. The page number is held in the URL so a paged view is shareable.
Why this is new. Every other prediction on this board reads a ship’s own AIS track and berth history - real signal, but it treats every ship as if she instantly becomes true market tonnage the moment she finishes discharging. In reality many owners already have her next fixture lined up before she even berths. Refixture gap and P(open 7d) are the first columns on this board built from realised operator behaviour, not just the ship’s own physics - they read that hidden pattern off accumulated voyage history no single-source AIS tracker has.
Note: this radar browse view shows a deliberately trimmed column set. The legacy board carried extra columns - IMO, Grab, Ice, State, prediction confidence, Last-seen days, "Likely loading regions" (the feasibility hint of which basins a ship can ballast to next), and the prediction Basis string. Those are returned by the API but are not rendered on /radar; open an individual ship's profile page for that depth.
Sortable headers here too. Click any column header to re-sort the board (click again to reverse). One caveat: the browse board is paginated on the server, so a header click sorts the ships on the current page - page through with Prev/Next, or tighten the filters, to bring the tonnage you want onto one page first.
Filters that now work board-wide. The Laycan date pickers apply in browse mode too (leave the load port blank, set a window, and the whole board is filtered to ships predicted open in it). The region box is a substring match, so a partial name catches the real labels (e.g. typing part of a basin name). Prompt ballasters now carry their open region, so a region filter no longer silently hides them. In the P(open) column, the “(fleet avg)” tag now appears honestly whenever the number still leans mostly on the fleet-wide prior rather than a deep track record for that operator.
Practical workflows and reading cautions
Two end-to-end recipes the page is built around:
- Cargo-match (charterer with a stem). Type your load port, set the laycan window and a DWT band, add any hard constraints (gear, grab, ice, max draft, built, flag, ballast-only). Hit Find tonnage. Work the list top-down by green Fit pills, sanity-checking each row's Arrival date against your window and its Distance tooltip (prefer
sea-route). Tick hide inbound if you want only repositioning candidates and not ships already pointed at your port. - Browse (broker/owner monitoring). Leave the port blank. Read the count chip's
ballast · open ≤7dsplit, then set Open region and Open in to isolate, say, "Supras opening in the Med within 7 days," optionally ballast only for the cleanest prompt tonnage. Sort your attention by the Outlook pills - High/Mid are the genuinely available slices.
Cautions baked into the design:
- Partial coverage. This is free terrestrial AIS plus a position feed; not every ship is seen, and some positions are old. The confidence weighting and the Fit caps on stale ships exist precisely so old data can't dominate the top of the list - but a low-confidence row is a lead to verify, not a confirmed open.
- Predictions, not declarations. "Open in" and "Opens at" are model estimates from median berth times and current course/destination. A ship can re-fix, divert, or sit longer than the median. Treat the board as a shortlist generator, then confirm directly.
- Inbound = zero steam. A 0 nm / inbound ship needs no repositioning and will usually top the list on laycan timing; that is correct, but if you specifically need outside tonnage, use hide inbound.
- Great-circle distances flatter. When the Distance tooltip says
great-circlethe routing engine couldn't produce a sea route; real steaming around land will be longer, so the ETA/Arrival for that row is optimistic.
How the reposition recommendation is built
Every per-ship reposition surface - the My Fleet open-tonnage board, the ship page’s Reposition - live market card and Reposition advisor card, and the “Do this now” board - is driven by ONE engine, so they always name the same load region for a given hull. A region is ranked by the full-voyage TCE she would earn there, net of the ballast fuel to reach it, any Panama/Suez canal toll, and live demand. That earnings figure is then vetted for the ship’s age against each market: from real load-leg history we learn the age ceiling charterers accept in every basin for her size, and a hull over that ceiling is steered away from the screened market (it still appears, marked with an age warning, so you see the trade-off). The advisor card adds the basin’s supply/demand tightness as context. Self-discharging ships are age-exempt.
Where-to-load: measured by real loading (July 2026)
The suggested next loading ports are now ranked by ships that arrived empty and sailed loaded at each port - the true loading signature - instead of raw traffic. Busy import-only destinations (discharge hubs, shipbreaking ports) no longer appear as loading suggestions, and a port with no recent loading evidence is excluded outright.