How to use it

Three steps to knowing how many runs are left.

1 Start a build in the game, then ask.

what does my build still need Ask D47 reads your construction depot out of the journal. Nothing to set up. Ask again after every delivery and the numbers move.

2 Read the two numbers that matter.

Steel 3,200 still needed 784 in the hold 4 more runs Runs are worked out from the hold you are actually flying. Swap to a bigger ship and the figure changes with it.

! The one that stops people.

It needs a depot the journal has seen. No construction site visited this session means nothing to report. Dock at it once.
Why it works this way

What your build still needs, what you are already carrying, and how many runs are left.

1 The sum you would otherwise do on paper.

687 t the site still needs 309 t already in your hold = 378 t left to go and find at 720 t a run, that is 1 more full load Your ship's capacity comes from its own loadout, so the run count is yours rather than generic.

2 These figures are from your last visit.

you were docked the site told you everything 10:00, and D47 wrote it down now somebody else may have delivered ten minutes ago nothing on your disk says so A site reports its manifest only while you are standing on it. 6,307 of 6,330 events across 912 journals. So this is a record of where you have been.

3 Whose number is whose.

YOUR HOLD exact, and yours alone 309 t DELIVERED SO FAR everybody's, not just yours 100 of 500 YOUR CARRIER a tonnage and nothing else — Elite never writes what it is 656 t of something Said apart on purpose, because adding them together would invent a number.

Tracking a build needs no key, no account and nothing off this machine — it is subtraction over what Elite has already written to your disk. Finding somewhere to build is a different question, and it goes out to the galaxy index like every other one that leaves.

The details

What your construction sites still need, what you are already carrying towards them, what is left to haul — and which nearby systems have the bodies your next colony wants.

“what does my construction site still need” “what is left to deliver” “how far along is the construction” “what am I carrying for the build” “find me somewhere worth colonising”

Two halves, and they run on different things. Tracking a build needs no key, no account and no network: it is subtraction over data Elite has already written to your disk, the shortest supply chain of anything d47 ships. Finding somewhere to build is a question about the galaxy, so it goes to the same index and the same off switch as every other question that leaves this machine — see galaxy search.

The arithmetic you would otherwise be doing on paper

Ratraii Construction Site, Ratraii — 25.7% built, seen 2026-08-16 10:00 game time.

3 commodities outstanding, 687 tonnes in all:
  Aluminium — 400 tonnes left, 300 tonnes in the hold, 100 of 500 delivered.
  Ceramic Composites — 278 tonnes left, 112 of 390 delivered.
  Food Cartridges — 9 tonnes left, all of it in the hold, 231 of 240 delivered.

309 tonnes of that is already in your hold, leaving 378 tonnes to find.
At 720 tonnes a run, that is 1 more full load.
Your carrier was holding 656 tonnes of cargo as of 2026-08-16 09:45 game time. Elite does not
write what those tonnes are, so I cannot tell you how much of it belongs on this manifest.
You have delivered 100 tonnes here since I started reading this session, across 1 commodity. The
delivered figures above are everybody's.

A site reports only while you are docked at it, so these are its figures from your last visit
rather than live ones. Others may have delivered since.

Every number there comes off one of three places: the site’s own manifest, Cargo.json, and your ship’s cargo capacity from its Loadout.

The one thing to know: these figures are from your last visit

A construction site reports its manifest only while you are docked at it — 6,307 of 6,330 events measured across a 912-journal corpus. So what d47 holds is a record of where you have been, not a live feed. Somebody else may have delivered ten minutes ago and nothing on your disk says so.

That caveat is on the end of every answer rather than buried in a settings page, because this is the one way this capability can be wrong while looking right: the arithmetic is exact, and the moment it describes has passed.

The good news is the manifest itself has no traps in it. ColonisationConstructionDepot is a snapshot, not a delta — measured over 6,330 events and 120,208 resource rows, with RequiredAmount never moving mid-build and ProvidedAmount never once decreasing across 119,887 consecutive comparisons. So “what is left” is one subtraction over the latest event, with no history to keep:

{ "timestamp":"2025-12-17T22:23:00Z", "event":"ColonisationConstructionDepot",
  "MarketID":3960809986, "ConstructionProgress":0.056927,
  "ConstructionComplete":false, "ConstructionFailed":false,
  "ResourcesRequired":[
    { "Name":"$aluminium_name;", "Name_Localised":"Aluminium",
      "RequiredAmount":500, "ProvidedAmount":0, "Payment":3239 } ] }

Name_Localised is on every one of those 120,208 rows, which is why this needs no commodity table at all — not even the one d47 already ships for other things.

Several sites at once

Three were open simultaneously in the corpus, so this is a list rather than a “current site”. With one under construction, asking what is needed just answers; with several, d47 names them and asks which. You can also name one directly — by its station or its system, whichever you would say out loud.

A finished site keeps reporting for a while — 2 to 60 more events after it completes — so completion is the ConstructionComplete flag and never “the events stopped”. Complete and failed sites are out of the way unless you ask for them.

What is in your hold

This comes from Cargo.json rather than from the journal, and that is not a preference. The Cargo event carries its full Inventory on only 1,151 of 13,762 occurrences measured — essentially the first one in each session — and the other 12,611 carry a bare tonnage. A journal-only reader would have a correct manifest for the first minute of a session and a stale one for the rest of it. Elite rewrites the file on every change, which is the same reason your backpack and ship locker are read the same way.

Two things d47 is careful about here:

  • Carrying more than is wanted counts only what is wanted. Nine hundred tonnes of aluminium against six outstanding is six tonnes of progress, and a line reading “900 in the hold” beside “6 left” would invite a trip that buys nothing.
  • The SRV has its own hold, and Elite rewrites the same file for it. So the vessel is carried rather than assumed — eight tonnes of scoopings reported as your ship’s four hundred would be a wrong answer nobody could see was wrong.

What is on your carrier: a tonnage, and no manifest

d47 will tell you how many tonnes your carrier is holding, and will not tell you what they are. That is a measured refusal rather than a gap.

CarrierStats.SpaceUsage.Cargo is a real number Elite publishes. Nothing it writes says what those tonnes consist of. The only per-commodity signal is CargoTransfer, and building a stock model from it was tried against the corpus and reconciled against the game’s own total:

Check Result
Derived stock matched the reported tonnage 347 times
Derived stock was wrong 679 times
Commodities driven negative 11 — transfers out of stock d47 never saw arrive

Cargo reaches a carrier by routes the journal never itemises: its own commodity market, another Commander’s delivery, anything loaded before the file d47 is reading. So an itemised carrier manifest would be wrong twice as often as right, and it would look authoritative every time. The tonnage is the half d47 can state accurately.

Your deliveries, apart from everybody else’s

ProvidedAmount on the manifest is what everybody has handed in. On a build several Commanders are hauling for, “did my run land” is a different question, and ColonisationContribution answers it. Summed across the session d47 has been reading — so it is your deliveries since d47 started, not your career’s, and the answer says so.

This is where the commodity names nearly went wrong. Elite spells the same commodity three ways:

Where How it is written
ColonisationConstructionDepot $aluminium_name;
Cargo.json aluminium
ColonisationContribution $ComputerComponents_name;

Mixed case on 30 of 30 distinct symbols the contribution event writes, against 0 of 31 for the depot and 0 of 64 for the hold. A normaliser that stripped the $ and the _name; and stopped there would join the depot to the hold perfectly and match no contribution against anything — reporting a delivery you had just completed as never having happened. Names are folded to lowercase for exactly that reason.

Somewhere to put the next one

The claim rule is Frontier’s, in their own words: the System Colonisation Contact offers you “a nearby unpopulated star system (within a max distance of 15ly)”. Both halves of that are checkable against an index d47 already queries, so this narrows a hundred-odd neighbours down to the handful that hold what you want to build on.

97 of the 109 systems within 15 light years of Ratraii are unpopulated. 3 are worth a look,
nearest first:

Eol Prou LW-L c8-188 — 2.48 ly, 22 bodies.
  11 landable. Rings on 2: A 5 (Rocky, pristine reserves); A 8 (Icy, pristine reserves).
  9 Icy bodies, 5 Rocky bodies, 3 High metal content worlds, 1 Class I gas giant, 1 Gas giant
  with water-based life.
  Planets 11 ls to 3,490 ls from arrival.

Eol Prou LW-L c8-266 — 2.66 ly, 18 bodies.
  11 landable. Rings on 3: 2 (Rocky, pristine reserves); 4 (Rocky, pristine reserves);
  3 (Metal Rich, Icy, pristine reserves).
  7 Rocky bodies, 6 Icy bodies, 2 Class III gas giants, 1 Class I gas giant, 1 Metal-rich body.
  Planets 10 ls to 3,133 ls from arrival.

Eol Prou RS-T d3-74 — 5.03 ly, 26 bodies.
  12 landable. Rings on 4: A 2 (Rocky, pristine reserves); BC 6 (Icy, pristine reserves);
  A 3 (Rocky, pristine reserves); A 1 (Metal Rich, pristine reserves).
  10 Rocky bodies, 5 Icy bodies, 3 High metal content worlds, 2 Class I gas giants,
  2 Class III gas giants.
  Planets 3,958 ls to 81,811 ls from arrival.

23 more are systems nobody has surveyed — the index has their stars and no planets at all, so I
cannot say what is in them. That is not the same as empty.
None of this says a system is free. A claim lasts 24 hours, lives on Frontier's servers, and is
visible only to the Commander who made it — no index outside the game holds one, so I cannot
check. These are systems worth opening in the System Colonisation Contact, which is the only
thing that knows.

That last paragraph is the whole shape of this feature and is on every answer. Look at the third candidate to see why the arrival spread is there: its planets run from 3,958 to 81,811 light seconds out, which is a very different build from the first one’s 11 to 3,490 whatever the bodies are.

And note the twenty-three. A crowd-sourced index holds what somebody has scanned and uploaded, so a system nobody has honked comes back as a star with no planets — a fifth of the neighbourhood in that example. Those are not small systems and they are not empty ones; they are systems with nothing known about them, which on a frontier is often exactly where you would go and look. They are counted rather than recommended, and counted rather than silently dropped.

What this cannot be: telling you a system is free

A claim is invisible to everybody except the Commander who made it. That is not a gap waiting on a better source; it is structural, and it was measured before this was built.

ColonisationSystemClaim carries a system, an address and a timestamp, and there is no expiry field — Frontier’s 24 hours is a published rule rather than a number in the file. There is no release or expiry event either, so a claim lapsing is written nowhere at all. And nothing outside the game holds one: the most complete live service in the ecosystem is Raven Colonial, whose API is nineteen endpoints across projects, Commanders, carriers and systems, and the word “claim” appears in none of them. It is not an oversight. A claim is server-side state that produces exactly one journal line on one machine, and crowd-fed indexes are built from journal lines — there is no line to send.

So any “is this free” answer would be stale by up to 24 hours and could not be made fresher. d47 says which systems have what you want, and the Galaxy Map at a System Colonisation Contact says which ones you can have.

What it can say, and where each half comes from

  Where it comes from
Unpopulated The system record’s own population. Frontier’s guide calls a finished colony “an Uncontrolled Populated star system”, so zero is the offline half of the rule
Within 15 ly Measured from the reference, which defaults to where you are — the range runs from the starport you claim at
Somebody is already building there The index’s is_being_colonised flag, read one way only: true excludes, false says nothing
How many bodies, of what kinds, how many terraformable The bodies the systems search embeds with each system
How many are landable, which have rings A second call, for the shortlist only — the embedded records carry neither
Nobody has surveyed this one No known planets at all, which is what an unscanned system looks like in a crowd-fed index

Two things it deliberately does not do. It does not rank systems by quality, because a “colonisation score” is a number d47 would be inventing; it filters on what you asked for and orders by distance. And it does not tell you which facility wants which body — Frontier publishes the facility list and not one figure behind it, so the strategy half is a web search with a source attached, never a table shipped in d47’s own voice.

Two traps in the index, both of which read as right answers

Neither of these produces an error. Both were measured on 2026-08-16 and both are the reason this tool decides things locally rather than asking the index to decide them.

The population filter does nothing. Within 15 light years of Sol, where 48 of the 51 systems are populated, asking for population 1 and upwards returned 51 — identical to asking for population exactly 0, and identical to a filter key the service has never heard of. It is a real field with a published range, and only the range shape is dropped. So the filter is gone from galaxy search altogether, and this tool sorts by population instead and applies the rule to what comes back.

is_colonised: false returns the colonised ones. The value is discarded; the filter means “true” whenever it is present. Asking for "false" returned the same sixteen systems as "true", and so did asking for "banana". Neither flag is ever sent.

What this does not do

Planning — an objective, which facilities to build and in what order — is not here. It lives on the checklist, beside your ship builds, because a colonisation build is the same shape of long-lived intent as an engineering one. There is also no costed facility table anywhere in d47: the figures exist only inside GPL-3.0 source or an unlicensed community spreadsheet, so there is no licence-clean route to them. See the colonisation spike.

Predicting a site’s manifest before you have seen it is the same problem, and for the same reason. A site tells d47 what it wants; d47 does not guess.

Tools

get_construction_sites

Every site your journal has reported: where it is, how far along it is, how many commodities are outstanding, and when you last saw it.

{"type":"object","properties":{"include_finished":{"type":"boolean","description":"Also list sites that are complete or have failed. Default false \u2014 a finished site cannot be hauled to."}},"required":[],"additionalProperties":false}

get_construction_needs

The hauling list for one site: every commodity still outstanding, how much is left of each, how much is already aboard, and how many runs the ship’s capacity implies.

Ask for where_to_buy and it also works out which stations between them stock the whole list (list.md Phase 50) — fewest stops first, ties broken on what the trip costs and then on distance. That half is a covering problem rather than the trade planner: the cargo is decided before the Commander leaves, the objective is trips rather than credits, and the binding constraint is supply where you buy. It fetches nothing new — the sweep and the cache are the trade planner’s own.

Two things it will not do. It never recomputes what the site owes: the depot event is a snapshot rather than a delta, measured over 6,330 events, so the outstanding list is a fact off the Commander’s own disk. And it never derives what is on the fleet carrier — reconciling CargoTransfer against CarrierStats came out wrong 679 times against right 347 — so a carrier figure is one the Commander typed on the Checklist tab’s Sourcing page, taken off the shopping list, and dated wherever it is used.

{"type":"object","properties":{"site":{"type":"string","description":"The station or system name of the site. Leave out when only one is under construction."},"where_to_buy":{"type":"boolean","description":"Also work out which nearby stations between them stock the whole list."}},"required":[],"additionalProperties":false}

find_colonisation_candidates

Unpopulated systems within claim range that hold the bodies a colony wants, and the sentence saying what that does not mean.

{"type":"object","properties":{"body_type":{"type":"string","description":"A kind of planet the system must hold \u2014 for example \u0022Earth-like world\u0022 or \u0022Class I gas giant\u0022."},"landable":{"type":"integer","description":"At least this many bodies that can be landed on."},"limit":{"type":"integer","description":"How many to return, 1 to 5. Default 3."},"max_distance":{"type":"number","description":"How far to look, in light years. Defaults to 15, the furthest a claim reaches, and capped there."},"near":{"type":"string","description":"Search out from this system. Defaults to where the Commander is, which is where they would claim from."},"rings":{"type":"boolean","description":"Only systems with a ringed body in them."},"terraformable":{"type":"boolean","description":"Only systems with at least one terraforming candidate."}},"required":[],"additionalProperties":false}