Guides › Daily News

The Freight Report - the shipdata.net daily dry-bulk market report

The Daily News page is shipdata.net's plain-English daily market read. It turns the same live fleet observability that powers the DBPI and the route engine into a written report - a one-line headline, a global supply/demand read, a section per tonnage band with its busiest lanes, and a closing forward-looking Outlook that projects where the market is heading from momentum and leading indicators.

What the page is and how to reach it

Daily News lives at three routes, all public (no login required) and all server-rendered as static HTML so they index cleanly for search engines and load instantly:

You can reach News from two fixed places on every public content page: the News link in the sticky top navigation bar, and the News link in the footer. The nav order is News, Guides, Market, About, Sign in, and a Register button; the footer reads © shipdata.net - dry-bulk fleet intelligence followed by News, Guides, About, Market links.

Why it matters: this is the one place on the site where the raw numbers are interpreted for you in narrative form. The Market page gives you the index and the rates; News tells you what they mean today and what changed since the last report - the kind of morning read a desk would otherwise write by hand. Because every figure is computed from shipdata.net's own positioning data, there is no external rate survey in the loop.

The index page (/news) - element by element

The index opens with an <h1> heading "Market News" and a lede line (styled .lede): "A fresh, plain-English read of the dry-bulk market - published daily." Below it is the report list.

How to use it: scan the titles down the page to read the market's tone day by day - a run of "firming" headlines followed by "holding" or "softening" is itself a signal. Click any row to open the full report for that date.

A single report (/news/<date>) - page chrome and meta line

Opening a report renders inside the shared content shell (_content_page), with these fixed elements around the body:

The shell is theme-aware: it reads your saved dark/light preference from localStorage before paint, sets per-page SEO/Open-Graph meta (title, description, canonical URL /news/<date>, og:type=article), and defers /static/ui.js so site-wide widgets (e.g. the command palette) are available.

Invalid or missing dates: the route only accepts a strict YYYY-MM-DD pattern (the path segment is truncated to 10 characters and matched with re.fullmatch(r"\d{4}-\d{2}-\d{2}")); anything else returns a plain 404 Not found. A validly-formatted date that has no stored report also returns 404. So a 404 here means "no report for that day," not a broken link - there is no report for days the generator did not run, and only dates that appear in the index are guaranteed to resolve.

The report body: headline, global section, band → region breakdown, outlook

The body is authored to a fixed five-part structure, and the renderer (_news_body_html) supports a deliberately tiny markdown dialect: it splits the text on blank lines into blocks; any block whose first line begins with # or ## becomes a section heading (rendered as an <h2>); a ### line becomes a smaller <h3> sub-heading (used for the per-region rows); the leading hashes are stripped; **bold** becomes <strong>, single newlines inside a block become <br>, and everything is HTML-escaped first - so the report text can never inject markup. The structure you will see, top to bottom:

First-report caveat (built into the prompt): the generator instructs the model to only describe a day-over-day change where an actual "d/d" figure is present in the data. On the very first report (no previous snapshot to diff against), there are no d/d figures, so the report describes current levels only and makes no claim about "yesterday." That keeps the earliest reports honest rather than inventing a trend.

How to read it as a charterer/broker/owner: start with the global section to set your bias, then jump to the band you trade. Within the band, read it region by region - the per-region paragraphs are your tactical read - a lane firming on "ballast pull building" tells you owners are repositioning empty toward that load area (tightening supply there), while "congestion" firming tells you tonnage is stuck (tightening for a different reason). The stated reason matters because it tells you whether the move is likely to persist (structural flow) or unwind (a queue clearing).

The Outlook (forward view) - the predictive section

The report now closes with a dedicated ## Outlook (forward view) section: a forward read of where the market is likely heading over the coming days and weeks. It is not a restatement of today's levels - it is a directional projection, and it is grounded only in the forward-leaning signals the engine actually has.

What feeds the Outlook:

What it outputs: a clear directional call - firming, softening, or range-bound - for the overall market and for the bands with the strongest signals, each with its reason (e.g. "Panamax likely to firm: South Brazil → North China ballast pull building while the band already trades above balanced").

How honest it is: the prompt forces the model to state this is a model-and-momentum scenario read, not a guarantee, and to keep it as market commentary - it does not give investment or trading advice, does not tell anyone to buy/sell/charter/fix, and does not state price targets as certainties. On the very first report (no prior snapshot) it makes no day-over-day claims at all.

How it sharpens over time: today the forward signals are still thin, so the Outlook is broad. As lane coverage fills (more ships and voyages tracked) and as the day-over-day snapshot history accrues, the momentum and ballast-pull inputs get denser and the projection becomes more specific - eventually lane-by-lane. If a true forward FFA curve is later loaded, the Outlook can anchor to it (contango / backwardation = the market's own priced expectation) on top of these internal signals.

How a report is produced from our own fleet data

The data is collected by _collect_report_data (which runs against fresh live data - in practice on the production server, so the report's numbers match what you see on the Market and lane tools, not a stale local copy) and handed to generate_daily_report. The report-grade language model (run on our own infrastructure) writes only the global supply/demand narrative and the forward Outlook; the band-by-band breakdown is generated deterministically and spliced in before the Outlook, so every tonnage band always appears in full regardless of what the model chose to write. Generation requires the LLM host, so production simply serves whatever was stored; it does not regenerate on request. The build sequence:

Why this matters: the report is a written projection of the exact same engine outputs you can inspect on the Market page and the lane/route tools. If a lane paragraph says Panamax firmed on ballast pull into a load region, that is grounded in the tonne-mile ranking and the 7-day ballast trend the engine measured - you can cross-check it, and act on it, rather than taking an opaque assessment on faith.

Reading the headline scalars: DBPI and LSR

The two chips on the meta line are the report's executive summary in two numbers. Learn to read them at a glance:

How to use them together: the chips give you the day's stance in one line before you read a word of prose. If DBPI is above 1000 and LSR is high and rising, the market is tight and tightening - expect the band sections to read "firming." If DBPI is near neutral and LSR is slipping, expect a "holding" or "softening" tone with open tonnage being the named culprit. Because both scalars are stored per report, you can also page back through the index and watch them drift over weeks - the cheapest possible trend read.

Practical workflow and reading tips

A concise way to work the page day to day:

One operational note: a 404 on a /news/<date> link almost always means no report was generated for that day (the generator did not run, or coverage was too thin), not a broken site. Step back via the breadcrumb or the footer News link and pick a date that appears in the index.

More guides