Dev blog 2026-10-22 · Keel 0.5.3 development

Building a Dreadnought

One huge ship that a whole charter builds, feeds, and risks.

We added a sixth hull class that a charter owns together. It takes a rare blueprint, a bill of materials that every member can fill, three days in a shipyard, and a fuel bay that drains for every hour the ship is out. This post follows one Dreadnought from the merchant's counter to the day it is lost, tours the code, and says what we have not pinned.

The Dreadnought is coming in 0.5.3. It is not in a build yet, so every number here is the number in the code today, and some are starting values that testers will tune. It is also the only ship that can light a Titan Beacon. This post stops short of that.

The Charter screen in an early alpha build, with a charter of one member, the services its Shard sum opens, and a Structures card. On the right, the sector card lists the charter's online Post and Storehouse, each with a Pack up button, and a Jump button to an Outpost.
The Charter screen, and a sector with a Post and a Storehouse, in an early alpha capture from before the hangar existed. There is no Hangar tab here yet. The Post and the outposts are where a Dreadnought is put down.
The problem

Five hull classes, and every one of them belonged to one pilot.

The top of the ladder was the Carrier, class 5. A charter could add up its Shard and build a Post, a shipyard, a storehouse, and a fuel bay, and still end up with nothing it had made together.

We wanted a ship that the whole charter builds, owns, and feeds. We wanted it slow, huge, and easy to lose, so that taking it out is a decision and not a habit.

Two parts of it started as a tester's suggestion: a ship that cannot move while it makes its stand, and one that can be put down on a chosen sector.

The Raider Carrier sprite: a grey and white ship inside an orange hexagon.
The Raider Carrier, class 5, from the live art set. Until the Dreadnought, this was the top of the ladder.
What we wanted instead

Three rules for a ship nobody owns alone.

These come from the decisions we wrote down before the build began. The rest of the design follows from them.

The charter owns it

A Dreadnought lives in the charter hangar, not in a pilot's fleet. The lead may always take it out and trusts any member with the permission. A member cannot leave with it out, and a kick sends it home.

Everyone pays in

One pilot buys the Keel at the top of a faction's standing. The bill is filled by any member from the stash. The Keel Plates in it only drop from incursion clears on Layer 4 and deeper, and in the Rifts.

It is a commitment

It flies alone, with the pilot's own fleet berthed. It burns charter fuel every hour it is out. If it is destroyed it is gone for good, and the charter starts again from a new Keel.

What we built

One hull, one bill, one fuel bay.

A Dreadnought is class 6. A charter keeps one, or two once its Shard sum is high enough. It is built once, in a shipyard, from a bill the members fill, and it burns Helium-3 from the charter bay for every hour it is out.

72 hShipyard build, divided by the build speed. The clock waits while the yard or the Post is offline.
3,180,000Marks for the Keel, plus 10 standing. That is five Carrier hull copy fees at today's prices.
300, 750Charter Shard sum for the first Dreadnought, then for the second.
20Keel Plates in the bill, with five Carrier bills and 10 extra Remnants.
12 xA Patrol's hull and shield. A Carrier is 4.5 x. Volley is 2.5 x, against a Carrier's 1.15.
6 s, 8 sMove cooldown and lock time. A Carrier has 1.75 s and 4.0 s.
72Power grid, against a Carrier's 44. Slots are a Carrier's plus 2 weapons and 1 system.
-0.10Base evasion, against a Carrier's 0.0. A stand-in in the tuning file.
200Helium-3 an hour from the charter fuel bay, while it is out. A day out is 4,800.
10 minOne cooldown for every deploy and recall, shared by the whole charter.
60 sSiege: rooted, with no early exit.
3 x, +0.30Siege damage multiple, and resist added to every damage type.

The bill, written out

For a Raider Dreadnought, this is what the code asks for.

  • 500 Plate, 250 Cell, 250 Cable, 250 Trace, 5 Frame, 5 Spool, and 5 Breach Coil. That is five Carrier hull bills, each line rounded up.
  • 35 Raider Remnants. The five Carrier bills carry 25, and the Dreadnought adds 10 of its own.
  • 20 Keel Plates. A pilot over 5 percent of an incursion clear on Layer 4 or deeper, or in a Rift, gets 1. They cannot be traded.
  • The Sentry bill swaps the Breach Coil for 5 Phase Lens, and the Breaker bill for 5 Plasma Coil. Everything else is the same.
The Raider Dreadnought sprite: a rust-brown delta wing with orange stripes and a dark cockpit slot.
The Raider Dreadnought, class 6. It takes the faction of the Enclave that sold its Keel.
The Sentry Dreadnought sprite: a pale silver spearhead with two thin rings around it.
The Sentry Dreadnought. Each faction has its own sprite. They are drawn to fit the same 256 pixel canvas as a Carrier, so the pictures do not show the size difference. The numbers above do.
As a pilot lives it

From a merchant's counter to a fleet of one.

The server holds every rule. The client shows a Hangar tab on the charter screen, an S key for Siege, and a marker on the map, and it asks. The server answers in plain words.

  1. Buy a KeelDock at a faction's Enclave at the top of the standing scale, 10.0. The Keel costs 10 standing, so you drop to Neutral, and 3,180,000 Marks. One Keel per pilot at a time, and it cannot be sold on the market.
  2. Open the billA pilot with the permission flies a ship to the charter's online shipyard and presses Start the bill. The Keel is spent, and the Dreadnought will wear its faction.
  3. Fill itAny member adds from the stash at an online storehouse. The Hangar tab shows a bar and who gave what.
  4. Wait three daysA full bill starts the 72 hour yard clock. The yard holds nothing else meanwhile. If the yard or the Post goes offline, the clock waits.
  5. DeployA pilot with the permission brings the whole fleet to the Post or an outpost and presses Deploy. The fleet berths at Haven, and the Dreadnought appears.

Then, out in space

  1. Fly it slowlyIts move cooldown is 6 seconds and its lock time 8. It shows on the map of everyone on its layer, scanner or not. It never uses layer travel, outpost jumps, rescue jumps, or random wormholes.
  2. SiegePress S. For 60 seconds it is rooted, hits 3 times as hard, and gains 0.30 resist on every damage type. Nothing ends it early.
  3. Feed it200 Helium-3 an hour from the charter bay. Members fill the bay at Haven. An empty bay recalls the ship, after the Siege if one is running.
  4. Refit in placeAt its charter's online Post or outpost sector, Fit and Remove work as at a berth. Nowhere else.
  5. RecallIt goes home with its damage and fit, and waits out the shared 10 minute cooldown. A ship that is locked, clamped, firing, sieged, or in its first minute cannot be recalled.
  6. Lose itA destroyed Dreadnought is gone for good. The hangar row is deleted and the charter is told. The next one needs a new Keel and the full build.
NoteBought the Raider Dreadnought Keel for 10.0 standing and 3,180,000 Marks. It is in your blueprints; a charter hangar spends it.
NoteThe Raider Dreadnought bill is open: 500 Plate, 250 Cell, 250 Cable, 35 Raider Remnant, 5 Frame, 250 Trace, 5 Breach Coil, 5 Spool, 20 Keel Plate. Add to it at a charter storehouse.
NoteThe bill is full. The shipyard starts the hull: ready in 72 hours.
AlertThe Raider Dreadnought is built. It waits in the charter hangar.
NoteThe Raider Dreadnought is out at the Outpost. It cannot fire or be locked for 60 s. Your own fleet is berthed at Haven.
NoteSiege. Rooted for 60 s: damage x3.0 and +30% resist, with no early exit.
LogYour Dreadnought was recalled to the hangar. The charter fuel bay ran dry.

Copied from the server's replies and charter notes in the code. The server fills in the faction, the bill, and the structure. A charter note goes to every online member's log and to their Journal alerts.

Flying alone

The fleet column goes quiet.

Deploy berths every other ship the pilot has. Undock, deploy, and dock are refused until the Dreadnought is recalled, and the Dock button says it docks by recall. Charter mates can escort it with their own fleets.

A pilot also cannot leave the charter with one out, and nobody can kick a pilot in the middle of a Siege.

Layer 1 in an early alpha build. The fleet column on the left lists two Patrols, one out and one berthed. A hex map fills the middle, with a few contacts and a teal marker for an up wormhole.
A pilot's fleet column in an early alpha capture: two Patrols on Layer 1. While a Dreadnought is out, every other ship in this column is berthed at Haven.
Siege

Sixty seconds of standing still.

A move is refused with a line that says how many seconds are left. The ship tile wears a SIEGE tag with the countdown, and the map marker for everyone on the layer adds a red ring and the seconds.

The resist is a flat 0.30 on every damage type, on both pools, and it still sits under the 75 percent resist cap. A new Siege may start the moment the old one ends.

The Breaker Dreadnought sprite: a violet hexagonal hull with ruled lines, a dark square cockpit, and three small pods down each side.
The Breaker Dreadnought, class 6, from the live art set. No capture of a Dreadnought in play exists yet.
Under the hood

A record on the charter, a ship row on the pilot.

The hangar is one block of 504 lines at the bottom of structures.py, plus small hooks and rule rows across the rest of the server. The first commit for it touched 22 files and added about 1,300 lines, 558 of them tests.

The recordstructures.py keeps the hangar on the charter: a list of Dreadnoughts, one open build, and one cooldown. A Dreadnought in the hangar is only a row.
The shipOut of the hangar, the row becomes an ordinary ship in the pilot's ships, flagged as a Dreadnought. Combat, snapshots, and losses treat it as any ship.
The rulesrules.py holds the class 6 rows and the Siege numbers, industry_rules.py the bill, and factions.py the Keel and its price.

One Dreadnought, as a call chain

  1. BuyThe Enclave station, the standing, one Keel at a time, and the Marks are checked. The Keel is a one-use blueprint._keel_buy, _keel_fee, _blueprint
  2. OpenThe permission, the Shard sum, a free build slot, and a free online yard are checked. The Keel is spent and the bill is made._hangar_build, _hangar_yard, dread_bill
  3. FillStash materials move into the bill, clamped to what is still needed, with who gave what. A full bill starts the clock._hangar_give, _hangar_try_start
  4. BuildEvery server step the clock is checked, and it waits while the yard or the Post is offline. At the end the hull joins the hangar._tick_hangars, _hangar_finish
  5. DeployThe fleet is berthed, a ship row is made, hull and shield are filled, and the arrival flag is set._dread_deploy, _berth_one, protect
  6. Fly and endFuel burns each step. Siege, recall, and loss each fold the ship back into its row, or delete the row._tick_dread, _dread_siege, _dread_store, _dread_lost

The main functions

_hangar, _can_dread, _dread_capstructures.py

The hangar record is made on first use. The permission is the lead, or a member the lead flagged. The cap is 2 once the Shard sum reaches 750, and 1 below that.

dread_billindustry_rules.py

Five Carrier hull bills, rounded up per line, plus 20 Keel Plates and 10 more Remnants of the Keel's faction.

_keel_buy, _keel_feefactions.py

Checks the station, the standing, and the Marks, then makes the blueprint. The fee is the Carrier hull copy's fee times 5, and the standing spend never takes you below zero.

_hangar_buildstructures.py

Refuses with a plain sentence for each missing piece, so a pilot is told which one. On success it spends the Keel and opens the bill.

_hangar_give, _hangar_try_startstructures.py

Adds to the bill and records the giver. The clock starts the moment the bill is full and a charter yard is free.

_tick_hangars, _tick_dreadstructures.py

Called from the structure tick every server step. One finishes builds. The other carries a float remainder of fuel, ends a Siege when its timer lapses, and recalls on an empty bay.

_dread_deploystructures.py

The longest function in the hangar block. It checks the permission, the fuel, the cooldown, the target, the fleet, and combat. Then it builds the ship row and sets the arrival flag.

_dread_recall, _dread_storestructures.py

Fold the ship back into its row with its damage and fit, restart the cooldown, and put the pilot's selection right again.

_dread_siege, siege_effectsstructures.py, rules.py

Sets the timer and adds a flat resist effect on every damage type. The shot path in combat.py multiplies the volley by 3 while the timer runs, and the move path refuses while it runs.

_dread_loststructures.py, combat.py

Called from the hull destruction path. It deletes the hangar row and writes the charter a note. The count of Dreadnoughts built, which Leaders reads, stays.

_hangar_view, _dread_markersstructures.py

What the snapshot carries: the Hangar tab block, and a marker for every Dreadnought on the viewer's layer, with no scanner check.

Four choices we are happy with

A row until it flies.Only the live ship is a ship. Because the hangar copy is data on the charter, combat, the snapshot, and loss paths needed almost no new code.
One cooldown for the charter.A deploy, a recall, an empty bay, and a pilot leaving all restart the same clock on the hangar record. There is no per-pilot way around it.
Berthing is not a teleport.Deploy needs the whole fleet standing at the target sector. Otherwise it would berth a ship from a Rift at Haven, cargo and all, for free.
Loss is final and written down.The row is deleted, the charter gets a note, and the pilot's Losses list gets the hull. The Dreadnoughts built count stays for Leaders.
The client side

The server owns it. The client asks and draws.

  • charter_panel.gd shows the Hangar tab only when the server sends a hangar block. Start the bill, Deploy, Recall, and the trust boxes send ops, and the server refuses in plain words.
  • dread_view.gd is read-only helpers: names, clocks, and the map marker, a two-ring hex in the faction colour with the charter name and the Siege seconds.
  • main.gd shows the Siege button, on the S key, only on a Dreadnought, hides it while docked, and reads its tooltip from the siege length the server sends.
  • The cooldown, the fuel hours, the cap, and the permission all arrive in the snapshot. The client decides none of them.
What the code looks like in numbers
504Lines in the hangar block of structures.py
22Tests in DreadnoughtHangarTest
18Server files that mention a Dreadnought, tests included
101Lines in dread_view.gd
What the tests prove

What is pinned, and what is not.

The server tests live in test_alpha.py, in DreadnoughtHangarTest and DreadnoughtKeelTest, and they run on every commit. The client self-test also builds the Hangar tab and the Siege button from a canned snapshot. Here is what they hold, and the gaps we know about.

Pinned

  • test_a_keel_needs_friendly_ten_standing_marks_and_the_enclave: 9.9 standing is refused, 10.0 buys, and the wrong station is refused. After a buy, standing is 0.0.
  • test_buying_a_keel_spends_standing_and_marks_and_names_the_faction: the fee equals the Carrier copy fee times 5, the Keel is one run, and a second is refused.
  • test_the_bill_fills_with_who_gave_what_then_the_yard_builds_for_72_hours: contributions clamp to the bill, the giver is recorded, the yard is busy for 72 hours, nothing arrives early, and the built count goes up.
  • test_a_second_dreadnought_needs_the_higher_shard_sum: the cap is 1 until the charter sum reaches 750.
  • test_deploy_berths_the_fleet_and_waits_the_cooldown_and_the_fuel: under 200 fuel is refused, the fleet is berthed, and undock, deploy, and dock are refused.
  • test_deploy_needs_the_whole_fleet_at_the_target_sector: a ship in a Rift or in the wrong sector blocks the deploy and is left alone.
  • test_fuel_burns_two_hundred_an_hour_and_an_empty_bay_recalls: 3,600 one-second steps burn exactly 200, and an empty bay recalls the ship.
  • test_siege_roots_triples_damage_adds_resist_and_blocks_recall_until_it_ends: the shot is 3 times, resist rises by 0.30, moves and recall are refused, and all of it is gone when the timer ends.
  • test_a_destroyed_dreadnought_is_gone_for_good: the row is deleted, the loss is logged, and the built count stays.
  • Wormholes, layer travel, outpost jumps, rescue jumps, leaving, kicking, a restart, and the no-scanner marker each have a test.

Not pinned, or thin

  • No whole-server check covers it. As of this writing alpha_check.py, playtest_check.py, and load_check.py have no Dreadnought loop, so the 25 ms step target has not been measured with one out.
  • Siege damage is pinned through the shot function, with a timer set by hand. No test fights a real 60 seconds against a real target.
  • Every test deploys to an outpost. A deploy to the Post, or into a Rift, has no test of its own.
  • The Marks test pins the multiple of 5, not the figure of 3,180,000. That figure comes from today's reference prices, and the Marks share behind it is a stand-in.
  • Nothing says the numbers are balanced. The class rows are approved starting values, and only the evasion is marked a stand-in in the tuning file.
  • The Hangar tab and the help topic say a Keel is for a Friendly pilot. The server needs 10.0 standing to spend, so Friendly alone is not enough.
What we learned and what is next

Small lessons from a very big ship.

Berthing is a teleport if you let it.Our first deploy berthed every ship the pilot had in space, wherever it was. A later commit made it need the whole fleet at the target sector first.
Plan for the day someone leaves.A ship that one member flies and the charter owns needs a rule for a kick, and a rule for a leave. A kick now sends it home, a leave is refused with one out, and a kick is refused in the middle of a Siege.
Write the price down.We had been told 10 standing plus the usual Marks, with no Marks figure. We charged five Carrier copy fees, the same multiple as the bill, recorded the 3,180,000 Marks beside it in the proposals file, and asked again before keeping it.

Where we would push next

  • Add a Dreadnought loop to the live-socket checks, and measure the 50 ms step with one out against the 25 ms target.
  • Test a deploy to the Post and into a Rift, and a Siege that runs out in real time.
  • Reword the Hangar tab so it says a Keel needs 10.0 standing, not Friendly.
  • Tune the starting values with testers. The evasion, the Marks share, and the rest are numbers we expect to move.
Join the open alpha

Come and build the big one.

Keel is free to play on PC, and the open alpha is where the Dreadnought will land in 0.5.3. Find us in the Keel Discord, tell us what a Dreadnought did to your charter's evening, and file a report from inside the game when something looks wrong.

Players whose reports become fixes are credited in game. Start with the Keel: pick a faction, take your standing with it to the top, and see how far your charter's Shard sum is from 300.