Dev blog 2026-10-22 · Keel 0.5.2.1

From ore to hull

Mine it, salvage it, refine it, then build the ship.

Every module and every hull from Patrol to Carrier has a recipe. Every ingredient is something a pilot can mine, salvage or win. This post follows one chain from a belt of ore to a finished ship, then reads the code that runs it.

All of it runs in the live build, Keel 0.5.2.1. Coming in 0.5.3: a reworked Industry screen with a Jobs overview and a Blueprints tab, and a sixth class, the Dreadnought, with a bill and a build of its own.

The Industry screen on the Manufacture tab. A job preview lists the materials, the build time of 4 minutes, the fee of 1,600 Marks and the output of two Common Raider weapons of class 1 at quality 70.
The Industry screen on Manufacture, from the 0.5.2 build. Two runs of a Raider weapon, class 1, at twice the bill. This capture was raised with a development command on a copy of a save, so it shows a full set of blueprints and a full stash. The tab row has changed since, and the screen changes again in 0.5.3.
The problem

Loot alone cannot make a plan.

A wreck gives up an item about one time in twelve. On Layer 1 that item lands between quality 10 and 45, with a small bonus for the NPC's class. It never passes 70 unless it comes out intact at 71 to 100, which is about one time in 200.

A pilot who wants one particular gun cannot wait on that. A rare blueprint copy is slower still. On Layer 1 a wreck carries one about once in 500 wrecks, and on Layer 6 once in 50. Those are stand-in values.

So industry has one job. Let a pilot choose. Put in ore, salvage and Marks, and a known thing comes out at a known time for a known price.

1 in 12wrecks that drop an item, about
10 to 45base quality of a Layer 1 drop
1 in 500Layer 1 wrecks that carry a copy, a stand-in
0rolls for grade or quality in a craft
What we wanted instead

Three rules the code keeps.

Industry has no dice of its own. What goes in decides what comes out.

Put in, get out

A craft is always Common. Its quality is set by the material multiple you pay, from 1.0 to 4.0 times the bill. Nothing is rolled.

Originals are rare, copies do the work

A copy carries a count of runs and each run in a job spends one. Originals come from incursion clears, and only an original can be researched or copied.

No inbox

A finished module goes straight to the stash and takes the first free cell. A hull goes to the hangar. Identical blueprint copies merge into one row.

What we built

Gather, refine, read the recipe, run the clock.

Ore comes from shared nodes, Remnants from wrecks, and blueprints from merchants, incursions and research. Refining turns ore into the three base materials. A job turns a bill into a module or a hull on a timer.

20 sone mining cycle
5 sto refine each batch of 10 ore
120 sbase build time of one class 1 run
10jobs that can wait in the queue

Three sources

Belts and cloudsEach layer has 6 belts. Layers 2 to 6 add 3 Helium-3 clouds, and Layer 1 has none. Hematite, Lepidolite and Chalcopyrite are mined from the start and Monazite from Layer 3. A node's richness is between 0.8 and 1.2. Nodes refill on the daily tick and are re-seeded full by a storm.
WrecksPlate, Cell, Cable and Junk go straight into the hold of a ship in the same sector. Half of the stack is the dead NPC's own faction stock, Raider Cell, Sentry Cable or Breaker Plate, and a quarter each is the other two. From Layer 3 a fifth is Trace. What stays in a wreck, a dropped item or a Remnant, waits 600 seconds.
BlueprintsA blueprint is an original or a copy. Copies come from the Haven shop, from Enclave merchants, from incursion clears, from rare wrecks and from research. Originals come from incursion clears, at a 1 in 10 chance.
Remnants

The scarce ingredient sits in a wreck

A Remnant can sit in the wreck of a Raider, Sentry or Breaker NPC. The chance is 10 percent on Layer 1 and climbs five points a layer to 35 percent on Layer 6. Those are stand-in values.

A Salvager in a system slot recovers it, 8 seconds at base speed. Incursion NPCs leave no wrecks, so incursions give no Remnants. Claim jumpers are ordinary roaming squads, so their wrecks roll like any other.

Remnants are the faction part of a hull. A class 3 Raider hull asks for 3 Raider Remnants, and a Breach Coil asks for one.

10 to 35%chance of a Remnant per wreck, Layer 1 to Layer 6
8 sto salvage one at base speed
3Remnants in a class 3 alien hull
0wrecks from incursion NPCs
What a recipe asks for

Bills grow in lots of ten.

A bill counts in lots of 10 units. A module of class c asks c lots each of Plate, Cell and Cable, and c more lots of its faction's own stock. From class 3 it also asks for a component. Class 4 adds Trace and a faction component, and class 5 adds a Spool, which costs 40 Salt.

Class 1Plate 10, Cell 20, Cable 10. 2 min a run. Fee 1,000 Marks.Haven
Class 2Plate 20, Cell 40, Cable 20. 4 min a run. Fee 1,600 Marks.Haven
Class 3Plate 30, Cell 60, Cable 30 and a Capacitor. 6 min a run. Fee 2,520 Marks.Haven
Class 4Plate 40, Cell 80, Cable 40, Trace 40, a Capacitor and a Breach Coil. 8 min a run. Fee 4,360 Marks.Shard 50
Class 5Plate 50, Cell 100, Cable 50, Trace 50, a Capacitor, a Breach Coil and a Spool. 10 min a run. Fee 5,360 Marks.Shard 200

A Raider weapon at the base multiple with no efficiency research. Class 4 and class 5 jobs need a charter Shard sum of 50 and 200. The fee is one percent of the bill's value at 2,000 Marks a unit of mineral, with a floor of 1,000. Build time is 120 seconds times the class, per run.

Human billsA Human module spreads its faction lots over Plate, Cell and Cable. A class 1 Human module is 14 of each and a class 2 is 27 of each.
Hull billsA hull asks Plate 2c lots, Cell c lots, Cable c lots and c Remnants of its faction. Humans need no Remnants. A class 3 Raider hull is Plate 60, Cell 30, Cable 30, 3 Raider Remnants and 1 Frame. Cruiser and Carrier hulls also need a charter shipyard, one at a time.
ComponentsComponents are built from their own copies. A Capacitor is Cell 4, Plate 1 and Cable 1. A Breach Coil is one Raider Remnant and 2 Cell. These are stand-in values.
The sixth classThe Dreadnought is not an industry job. Coming in 0.5.3, it is a sixth class with a bill of its own, built in a charter hangar from a Keel.
Quality

Pay more, get a better module, within limits

The material multiple is a dial on the job. These are stand-in values.

  • 1.0 times the bill gives quality 40.
  • 1.5 times gives quality 55, and 2.0 times gives 70.
  • 3.0 times gives quality 85, and 4.0 times gives 100.

Quality moves a module's main number only a little, about 6.5 percent between quality 40 and quality 100. It also sets how often a module can be repaired, because a repair spends 10 quality.

6.5%stronger main number at quality 100 than at 40
10quality spent by one repair
4repairs on a quality 40 craft
10repairs on a quality 100 craft
Efficiency and copies

An original can be researched and copied

Material efficiency trims the bill and time efficiency trims the clock. Each has 10 levels, and each level of time efficiency takes 2 percent off the build time. The first level of a class 1 original takes 105 seconds and the tenth takes 256,000. One track comes to about 5.1 days, and the clock scales with the class.

A copy job makes copies of an original in 80 percent of the base time and ignores time efficiency. A pilot with no original can research a Human module toward a 1-run copy. Researching a module adds 50 progress, scaled by its grade, quality and durability, and 100 makes the copy.

10levels of material efficiency and of time efficiency
2%of build time per level of time efficiency
5.1 daysfor one track on a class 1 original
80%of the base time for a copy job
What a fit needs

A module costs grid, and the hull sets the budget

Every module spends power grid equal to its rank, 1 to 10. The hull sets the budget: 8 on a Patrol, 14 on a Frigate, 22 on a Destroyer, 32 on a Cruiser and 44 on a Carrier. A hull also takes only modules of its own class and below.

  • Go over the grid and the game answers: That fit is over the Patrol power grid of 8.
  • A mining laser or gas harvester takes a weapon slot. A Salvager takes a system slot.
  • A Patrol has one slot of each kind. A Cruiser or Carrier has 2 weapons, 3 systems and 2 holds.
  • Fitting works only while docked.
The fitting screen on a Patrol with the power grid reading 3 of 8 and a list of fitted modules.
The fitting screen on a Patrol, grid 3 of 8. An early alpha capture from 2026-10-20. Damage names and the cargo figure have changed since, so read it for the shape of the screen and not for the numbers.
The gear guide

Nobody types the stats

The gear guide answers what a module does at every grade and rank. It lists 15 modules for four factions at five grades and ten ranks, 3,000 stat lines in all.

We write none of it by hand. A script, tools/make_gear_guide.py, builds it from the same server functions that work out the stats, rules.item_lines and industry._faction_line. The release script refuses a release when the file is stale. The client draws it in gear_guide.gd. The miner, harvester and Salvager show no stat line yet.

15modules in the guide
3,000stat lines
152 KBthe file, about
82lines in the script that writes it
As a pilot lives it

A night of mining ends with a ship on the pad.

The pilot fills a hold and spends a bill. The server counts every unit, runs every clock and keeps the stock. The client shows a preview and a countdown.

  1. Fit for the jobAt Haven, fit a mining laser, or a gas harvester for Helium-3. Add a Hold module to stay out longer.
  2. Mine, and mind the noiseThe ship gathers on its own in a node's sector, one cycle every 20 seconds. Mining drops the cloak. For every 90 seconds a node is worked, a claim jumper squad is sent.
  3. Deposit and refineDock at Haven and Deposit. Refine ore in batches of 10, 5 seconds a batch. Hematite gives half its weight as Plate and a tenth each as Cell and Cable.
  4. Get a blueprintBuy a copy, win one from an incursion, or research one from modules you already own. It lands in the blueprint list.
  5. Start the jobPick the runs, 1 to 10, and a material multiple. The screen previews bill, time and fee. The server takes them at the start. The result goes to the stash.
LogClaim jumpers inbound from 5, 9. The mining noise drew a Raider squad.
LogThe hold is full. Mining stopped. Dock at Haven and Deposit, or fit a Hold module.
LogSalvaged a Raider Remnant.
LogDeposited. The hold is in the stash.
LogRefining 100 Hematite into Plate 50, Cell 10, Cable 10. 50 s.
LogManufacturing started: 2 Common Raider weapon, class 1, quality 70. 4 min 00 s. Fee 1600.
LogJob done: 2 Common Raider weapon, class 1, quality 70. It is in your stash.

The wording is the server's. The sector numbers, the faction and the items are filled in by the server, and the examples here are samples.

The stash

Where every input waits

The stash holds materials, a grid of modules and the blueprint list. Jobs take their bill from the materials, and a finished module lands in the grid, 12 cells by 6, in the first free cell.

A charter storehouse is a second source. Any member can deposit. Only a lead or a quartermaster can withdraw, with a ship in the sector and the storehouse online. Blueprints stay with pilots.

The stash screen on a new account with an empty grid of module cells.
The stash on a new account, an early alpha capture from 2026-10-20. The grid is empty. The tab still reads Fittings here and is called Modules now.

Four ways to get a copy

The Haven shopHuman copies only, bought with Marks, 47 rows: 6 component copies, 39 module copies and 2 hull copies. The price is the value of the bill. A class 1, 2 or 3 Human weapon copy costs 84,000, 162,000 or 252,000. A class 1 or 2 hull copy costs 80,000 or 160,000. A component copy gives 10 runs and costs 120,000, or 240,000 for the Remnant ones.
The Enclave merchantsEach faction Enclave sells copies of its own modules, classes 1 to 5, and hulls. A copy costs standing with that faction and Marks equal to the value of the bill. Standing for a module is 0.2 at class 1 up to 1.5 at class 5, a stand-in. A buy takes up to 20 module copies or one hull.
Incursion clearsA clear pays a copy to the top contributor and one to every other contributor over 5 percent. There is a 1 in 10 chance at an original.
Wrecks and researchA rare wreck holds a Human 1-run copy of a class 1 to 3 piece. The log reads: A Human weapon copy, 1 run, came out of the wreck. Research turns modules you own into a 1-run copy.
Under the hood

Tables in one file, work in another, a screen that only draws.

The rules and the world's side of industry fill two server files of 355 and 914 lines. The shape is simple. Constants and pure functions price a job. A mixin on the world runs the clocks.

Rulesserver/industry_rules.py, 355 lines. Constants and pure functions: bills, build times, fees, research steps and node sizes.
The world's sideserver/industry.py, 914 lines. Gathering, salvage, refining, the job and queue code, the shop and the Industry view. _spawn_wreck and _place_stash live in server/world.py.
The screenclient/features/industry_panel.gd, 620 lines. It sends a request, draws what comes back and counts a timer down.

One job, as a call chain

  1. AskThe screen asks for a view and a preview of a job._industry_view, _job_preview
  2. PriceThe bill, the time and the fee come from pure functions, and a gate checks the class and the Haven.blueprint_bill, job_bill, job_seconds, job_fee, _job_gate
  3. StartThe bill and the fee are taken, copy runs are spent, and the job gets an end time._job_start
  4. WaitA busy slot sends the job to the queue, and a freed slot starts the next one._job_queue, _start_queued
  5. FinishEach tick finds jobs past their end time and delivers them._tick_jobs, _finish_job
  6. DeliverA Common item is built and placed in the first free stash cell._crafted, _place_stash

The main functions

module_billindustry_rules.py

Builds every module and hull bill from lots of 10, so the whole ladder is one function and a few constants.

job_billindustry_rules.py

Scales a base bill by runs, the material multiple and efficiency. It rounds up and never asks for fewer units than runs. A Spool is never scaled.

_job_previewindustry.py

Serves the Industry screen and the job start alike, so what the pilot reads is what the server charges.

_gather_cycleindustry.py

Runs for each ship with a laser or harvester in a node's sector. It fills the ship's own hold, stops at full and drops the cloak.

_spawn_wreckworld.py

Runs when an NPC dies. It puts the raw stack into holds in the sector, then rolls the dropped item, the Remnant and the rare copy.

_start_queuedindustry.py

Starts the first queued job of each kind whose slot is free, anywhere. A job that cannot start is dropped with its reason.

Choices we are happy with

One preview, two callersThe view and the start share _job_preview, so a screen and a charge cannot disagree about a price.
Bills from lotsOne function builds every bill, and the shop price is the bill's value. A new class changes constants and not tables.
Nodes sized by layerA belt holds more on a deeper layer so it lasts about 4.8 hours for one Common Human laser, and a cloud about 10.4 hours, on every layer. A test pins it.
A guide from the rulesThe gear guide is generated from the functions the server uses, and a release check fails when it is stale.
The client side

The server owns the stock and the clock

  • industry_panel.gd asks for a view with a blueprint, a kind, the runs and a multiple, and draws the preview, the tiers and the lines that come back.
  • It counts job timers down for show and asks for a fresh view once at zero. The server decides when a job is done.
  • It sends the requests job_start, job_queue, refine and shop_buy. It prices nothing itself.
  • The client self-test builds the panel from a canned view and checks its tabs.
What the code looks like in numbers
914lines in industry.py
355lines in industry_rules.py
620lines in industry_panel.gd
42commits that touched the two server files
What the tests prove

What is pinned, and what is not.

The industry tests live in server/test_alpha.py and run on every commit. alpha_check and playtest_check drive the wider loops through real sockets.

Pinned

  • test_a_laser_mines_ore_into_the_hold_and_noise_draws_jumpers: ore reaches the hold and the noise sends a squad.
  • test_salvager_recovers_a_remnant: a Salvager takes a Remnant out of a wreck.
  • test_loot_quality_is_damaged_and_rarely_above_70: the quality bands of dropped loot.
  • test_refine_and_reprocess_at_haven and test_refine_uses_whole_batches: refining and break-down, in whole batches.
  • test_manufacture_is_common_and_quality_rises_with_materials: a craft is Common and the multiple sets the quality.
  • test_hull_bill_uses_the_faction_remnant: a hull bill asks for its faction's Remnant.
  • test_class_4_needs_a_charter_yard_and_the_shop_sells_copies: the class gate and the shop.
  • test_queued_jobs_start_when_the_slot_frees and test_135_cancel_pays_the_finished_runs: the queue and the cancel.
  • NodeSizeD87Test, five tests: node sizes follow the layer.

Not pinned, or thin

  • No test holds the Remnant chance or the wreck copy chance, and both are stand-ins.
  • No test holds the research clock or the copy time.
  • The mining hour is pinned by its formula. We have not measured a real hour against a combat hour.
  • playtest_check moves a job's end time into the past instead of waiting for it.
  • We did not trace a job that ends while its pilot is offline. We have not tested it either.
  • Every original we can find in the live game is a class 1 Human one, from incursion clears. The class 2 to 5 research steps have no live original to run on.
  • The design document describes a daily withdrawal cap on the storehouse. We found none in the code.
What we learned and what is next

Testers found the holes, and the numbers moved.

Crafts looked lostCrafted modules once waited in an inbox until the next dock, so they looked gone. A tester report on 2026-10-19 sent them straight to the stash.
Break-down was a trapBreak-down once returned a quarter of a bill. It now returns 80 percent, for minerals only. Components, Remnants and Spools are lost.
Mining crawledTester reports said mining was slow. We raised the rate twice, in D78 and D86, and D87 then sized nodes by layer so a belt lasts the same hours everywhere.
A cancel keeps the runsA cancel now pays the runs already finished, returns the unfinished share of the bill and the copy runs, and keeps the fee. Report 135 asked for it and a test pins it.

Where we would push next

  • Coming in 0.5.3: a Jobs overview tab and a Blueprints tab on the Industry screen. Favourites come later.
  • The public roadmap lists role hulls in the shop and in industry under Next, with no version fixed.
  • The roadmap lists balance passes for mining, tuned in batches from tester reports.
  • We would like a measured mining hour next to a combat hour, so the stand-in rates can be judged on data.
  • Stat lines for the miner, harvester and Salvager in the gear guide, which show none today.
Join the open alpha

Fill a hold, then build the thing you flew.

Keel is free to play on PC, and the open alpha is where industry lives. Find us in the Keel Discord, tell us what a night of mining did to your evening, and file a report from inside the game when something looks wrong.

Players whose reports become fixes are credited in game. Try this first: fit a laser, fill the hold, refine a hundred Hematite and start one class 1 job.