Dev blog 2026-10-22 · Keel 0.5.2.1

Marks, Notches, and Salt

Three currencies, an open market, and a promise about money.

Marks pay for what you use, Notches raise what you keep, and Salt is taken in a fair fight. This post tours how each is earned and spent, how the market and the broker work, what insurance and a lost hull cost, how pilots trade, and what we promised about money.

Everything here is live in Keel 0.5.2.1 unless a line says coming in 0.5.3.

The Market window open on the Plate book. The Sellers table lists one order of 5 Plate at 2,000 Marks. The Buyers table lists the broker at 1,000 Marks with no tax. A 30 day price history chart and a Buy now form sit below.
The Plate book in the Market window. The broker bids 1,000 Marks and never sells, and one pilot has 5 Plate resting at 2,000. A store capture from 2026-10-21 on a stocked test account, so the wallet and the fleet are not typical.
The problem

One purse cannot do three jobs.

If a single number paid for your fuel, your upgrades, and your Carrier, the pilot who farmed longest would own all three.

MarksWhat can I afford this evening? Earned and spent all the time.
NotchesHow good is what I keep? Earned slowly, spent one grade at a time.
SaltHave I earned a Carrier? Taken in fair fights, spent on a Spool.

So we split the purse, and the split is on purpose. Marks buy Notches at a fixed rate. Salt itself is in no order book and in no trade offer.

We have not drawn every line well. Since D72 Salt has come only from fair kills on other pilots, and a Carrier needs a Spool that costs 40 Salt. A pilot who never fights pilots has no road to a Carrier. Our answer is Salt from incursion clears, coming in 0.5.3.

What we wanted instead

Three rules for three purses.

The rules come from the economy section of our rules document, and each purse has a job that the others do not do.

Pilots are the market

Marks come from selling what you looted or mined, to the broker or to other pilots. The broker only buys, so everything listed on the market was found, built, or mined by a pilot.

Power is bought a step at a time

A Notch raises one fitted module one grade. The steps cost 5, 25, 125, and 625 Notches, and a module cannot skip a grade.

Salt is taken in a fair fight

A kill is fair only when the dead ship's fleet in that sector had at least half your power, so a fleet far weaker than yours pays nothing. Salt cannot be placed in an order or a trade.

What we built

Three purses, each with a short list of ways in and out.

Marks are money. A Notch raises a grade. Salt buys a Spool. Every number below is in the server code.

10,000Marks buy 1 Notch, 1 to 1,000 at a time.
780Notches take one module from Common to Ultimate, as steps of 5, 25, 125, and 625. At the buy rate that is 7,800,000 Marks.
40Salt buy one Spool, which crafting a Carrier needs.
100,000Marks arrive in the alpha starter kit of a new account.
MarksIn: selling raw units, junk, and modules to the broker or to other pilots. Direct trade. Bounties and insurance payouts. Two tutorial topics, 35,000 once each. Out: market fees and tax, blueprint copies from the Haven shop and from merchants, insurance, bounties, and Notches.
NotchesIn: fully mapping a layer, 1, 1, 2, 3, 4, or 6 Notches by layer, paid again on each new shape after a storm. An incursion clear on Layers 3 to 6, which shares a pot of 10, 15, 23, or 34. The mining tutorial, 5 once. Or buy them with Marks. Out: one grade on one fitted module. Nothing else in the code takes a Notch.
SaltIn: a fair kill of a pilot on Layer 3 or deeper pays the dead ship's class, Patrol 1 up to Carrier 5, plus 8 XP, and a quarter more in a Rift. A victim pays out at most once an hour. Coming in 0.5.3: an incursion clear pays Salt to each contributor too. Out: Spools, at 40 each.

The pay ladder under Marks

A kill does not pay Marks directly. A dead NPC leaves raw units in your hold, and the broker pays 1,000 Marks a unit. How many units, and what a pilot's pocket is worth, climbs with the layer.

Layer 134,722 Marks per pilot per pocket. A kill leaves 24 raw units.Group 1
Layer 252,083 per pilot. 36 raw units.Group 1
Layer 378,125 per pilot. 50 raw units.Group 1
Layer 4109,375 per pilot, 218,750 a pocket. 118 raw units.Group 2
Layer 5153,125 per pilot, 459,375 a pocket. 228 raw units.Group 3
Layer 6214,375 per pilot, 857,500 a pocket. 512 raw units.Group 4

Group is the party size a layer is built for, and a pocket pays that many pilots' shares. From Layer 3 up a fifth of the units arrive as Trace. The pay per pilot is a design anchor, with one hard hour being ten pockets, and it also sets the mining rate. The unit counts come from wreck_units, and the tuning sheet itself says the number of wrecks per pocket is not locked. Combat pay is on the public roadmap for balance passes.

As a pilot lives it

An evening in the economy.

The server settles every price, fee, and payout. This is one evening from the pilot's seat.

  1. Fight and haulKill NPCs and their raw units go into your hold. Deposit at Haven and they become stash.
  2. Sell or restAsk the broker's 1,000 or less and it sells at once, with no tax. Ask more and the order rests for a pilot to take.
  3. Insure and undockAt Haven, press Insure. The premium is 15 percent of the fit's value. Then undock.
  4. Lose a hullFrom Layer 2 a destroyed hull is gone. The policy pays 80 percent of what died. Surviving modules lose durability and return to your stash.
  5. Fly againBuy a hull copy at the Haven shop and build it, then Deploy. With nothing left to fly, Deploy hands out one free Human Patrol.
NoteSell order: 10 Plate at 1500. Fee 1000 paid. Tax 750 when it sells.
LogSold 1 Plate for 1500 Marks, tax 75.
NoteInsured Patrol for 49800 Marks. It pays 80 percent of the hull and lost fittings once, within 4 undocked hours.
AlertInsurance paid 64000 Marks: 80 percent of the hull and 0 lost modules. The policy is spent.
LogHull destroyed on Layer 2. Its modules went back to your stash and lost 2 durability.
LogNo ship left in space. You are at Haven.
LogYour fleet is gone, so Haven issues one free Human Patrol.

Wording is copied from the server, and the server fills in the numbers. The sell order is an example. The insurance amounts are what a fresh account's starting Patrol produces from the code, valued from each item's material bill. The server writes numbers without thousands separators.

Insurance

The clock counts time in space.

  • One policy covers one hull and pays once. You buy it at Haven for a berthed hull, not at an Enclave station.
  • The premium is 15 percent of the covered value, which is the hull plus every fitted module, valued from their material bills. A bare Patrol hull is worth 80,000 Marks, so its premium is 12,000.
  • The payout is 80 percent of what was destroyed, capped at the fit the policy was written on. A module that survives and returns to the stash pays nothing.
  • The term is 4 undocked hours, counted only while the ship is alive and in space. Raising a policy to a better fit charges the premium on the added value and keeps the clock.

A fresh account's Patrol with its three starting modules covers 332,000 Marks and costs 49,800. If it dies on Layer 2 and every module survives, the policy pays 64,000. The premium prices the whole fit and the payout counts only what died.

Clock hour
010203040506070809101112
The policy
H12HH34XXHHH
H is an hour docked at Haven, and the clock waits. 1 to 4 are undocked hours that count. The fourth ends the policy, and X is an hour out there uninsured. Schematic drawn for this post, not a capture.
Losing a hull

Loss is the stake, and you can always fly again.

Layer 1 is safeA hull taken to 0 on Layer 1 is never destroyed, so the first layer costs a pilot nothing but time.
From Layer 2 the hull is goneEach fitted module loses 2, 4, 8, 16, or 32 durability, Layer 2 to Layer 6, and one that reaches 0 is destroyed. Survivors return to your stash. Cargo drops as a wreck that lasts 10 minutes. Blueprints are not lost.
To replace itThe Haven shop sells Human hull copies, 80,000 Marks for a Patrol and 160,000 for a Frigate, and you build the hull from materials. Alien hull copies come from an Enclave merchant.
A free Patrol after a fleet wipeWhen no ship, no spare hull, and no stored fleet of yours is left, Deploy issues one free Human Patrol. It is not issued while you still own a hull, and a test pins that.
The market

One book per item, reachable from anywhere.

Orders do not sit in a station. Every item type has one book of sell and buy orders, and every pilot sees the same book.

A sell orderThe goods leave your stash when you list. A price at or under a standing bid fills at once. Otherwise the order rests for 7 days. Resting costs 1,000 Marks, and the seller pays 5 percent when it sells.
A buy orderThe Marks, price times quantity, are held in escrow beside the 1,000 Mark fee. A seller who crosses fills it at your price. A module order can ask for a minimum quality. Cancel or expiry returns the escrow, and the fee stays spent.
Buy nowTake any quantity in one action, cheapest sellers first.
Price historyEvery fill is logged. Each book shows 30 days of average, low, high, and volume, and the last 5,000 trades are kept. Orders show no names, and you cannot fill your own.

The broker is a bid, not a shop.

The broker sits in every book as a standing buyer. It gives pilots a floor, and it never competes with them for sales.

1,000Marks a unit for most materials and for Junk, half their reference value of 2,000. Hematite ore is bought at 700.
51,750Marks for a whole Common module, up to 231,750 for Ultimate. Grade sets the price. Quality does not.
0Tax or fee on a sale to the broker. It buys only and never sells.
5%Tax when the buyer is another pilot, taken from the seller.

The broker's half share is flagged as a stand-in in the tuning sheet. It is a starting value that testers will tune. The module price is 90 percent of the reference value for the grade, set by D82.

Between pilots

Two ways to hand goods over, and a list that does not move.

A market sale is slow and public. A direct trade is instant and between two pilots.

The marketFee and tax. Anyone can fill an order, even while you are offline. Good for prices you can wait on.
Direct tradeNo fee and no tax. With a charter mate anywhere, or a pilot docked on the same layer, and both must be online. Each side offers up to 12 lines of materials, stash modules, blueprints, and Marks. Both confirm, and any change clears both confirmations.
BountiesAt least 10,000 Marks on a pilot's head, taken from you at once. A killer is paid from the pool, never more than the loss, and never more than the loss that insurance left uncovered. The target's charter mates cannot claim it.
The recordYour last 50 trades are kept, and the Journal shows the latest ten.

What changes hands

  • Materials, stash modules, blueprints, and Marks.
  • A market buy and a direct trade hand goods over through the same two helpers, so what lands in your stash is the same either way.

What never does

  • Notches and Salt. They are not in the market's item types or in a trade offer.
  • A built ship, or a module still fitted on one. Only stash modules, materials, and blueprints move, so a hull has to be built.
  • Coming in 0.5.3: Keel Plates, Dreadnought Keels, and Titan Beacons. The market and trade both refuse them.
  • Anything in the tutorial. Direct trade is closed there.
What money buys

A list of things Marks buy, and a promise about the list.

Inside the game Marks buy what is on the left and never what is on the right. Outside it, Keel is free, and nothing is sold during the alpha.

Marks buy

  • Materials and modules from other pilots, at the price they ask.
  • Human blueprint copies at the Haven shop, class 1 to 3 modules and class 1 and 2 hulls, at the bill's reference value.
  • Alien blueprint copies from an Enclave merchant, together with standing. The Marks side is the copy's own bill value times a merchant share of 1.0, a stand-in in the tuning sheet. A Raider Patrol hull copy asks 100,000 Marks where the Human one asks 80,000.
  • Hull insurance, at 15 percent of the fit's value.
  • Notches, 10,000 Marks each.
  • Bounties on other pilots, and the fees and tax of the market.

Marks never buy

  • Salt itself. It is in no order book and in no trade offer.
  • A finished module from the NPC broker. It sells nothing.
  • A ship, directly. A copy is a recipe, and the hull still has to be built.

The promise we wrote down

It is D77, in Part 2 of our vision document. It covers cash, and it stands over every number in this post.

Nothing is soldKeel is free to play. Nothing is sold during the alpha.
Money is the community's callThe monetization plan goes to a community poll before anything is sold, and every later change to what money buys is polled too.
Lines that stayNo loot boxes, no random odds for money, no energy bar, no starter packs. Cash never buys Shard levels, ships, Salt, drop odds, or deploy slots.

None of this freezes a number. A balance tweak to an existing number is not polled, and a large shift gets a feedback thread of at least 48 hours first. Polls begin when we announce them. Until then we act directly, and each build's patch notes list what changed.

Under the hood

Four small mixins and a table of constants.

The market, trade, insurance, and bounties are 1,065 lines in four server files. Each is a mixin on the world, so they share its accounts, its log, and its save.

The bookmarket.py, 466 lines. One list of orders for the whole world. A sell takes the goods, a buy takes the Marks, and _settle moves both and writes a history row.
The resttrade.py at 252 lines, services.py at 215 lines with insurance and saved fittings, and bounty.py at 132 lines with bounties and the leaderboards.
The numbersrules.py holds the tax, Notch, Salt, and pay tables. industry_rules.py turns a material bill into Marks with bill_value and broker_price. The tuning sheet mirrors most of them.

One event, as a call chain: a hull dies with a policy on it

  1. The hull hits 0A hit drives the hull to 0, and the layer decides whether it is destroyed. Layer 1 never does._hurt_ship, _apply_pools
  2. Modules take the hitEach module loses the layer's durability. Survivors go to the stash, the rest count as lost, and the cargo drops._destroy_hull, _drop_cargo
  3. Value the lossThe hull's bill value plus each lost module's value, scaled by its worn durability._loss_value, _bill_worth
  4. Pay the policy80 percent of the smaller of the loss and the insured value. The policy is spent._insurance_payout
  5. Bounty on the restThe killer's bounty claim sees only the loss that insurance did not cover._note_kill, _bounty_claim
  6. Salt, the record, a way backA fair kill pays Salt to the killer. The loss is recorded with its payout. With no ship in space the pilot wakes at Haven, and Deploy can issue a free Patrol._pay_salt, _record_loss, _deploy

The main functions

_market_sellmarket.py

Takes the goods out of the stash, fills against the best bids and the broker's bid, and rests the remainder with the 1,000 Mark fee.

_settlemarket.py

Moves goods and Marks for one fill, takes the 5 percent tax from the seller, and writes the history row. A sale to the broker pays no tax.

_market_bidmarket.py

Fills against the cheapest sell orders, then rests what is left with its Marks held in escrow.

_trade_settletrade.py

Rechecks both offers against what each side holds now, then moves everything. If anything is missing it resets the confirmations and moves nothing.

_insureservices.py

Prices the policy from the covered value, takes the premium, and starts the 4 hour clock. Pressing it again on an insured ship raises the policy.

_insurance_payoutservices.py

Pays 80 percent of the loss, capped at the insured value, and spends the policy.

_pay_saltcombat.py

Compares fleet power in the sector, allows one payout per victim an hour, and pays the dead ship's class number.

_deployworld.py

Hands out the free Human Patrol when nothing is left to fly.

broker_priceindustry_rules.py

The broker's bid for a material, or for a whole module by grade.

Choices we are happy with

One pair of helpersA market buy and a direct trade both move goods through _take_goods and _give_goods, so a module lands in your stash the same way either way.
The broker as a bidThe broker is a standing bid in the book, not a vendor with a price list. It never sells, so every item for sale was made by a pilot.
Escrow up frontA sell order takes the goods and a buy order takes the Marks before it rests. No order promises what the account no longer holds.
A bounty cannot beat the lossA kill never pays more than it cost, and never more than insurance left uncovered. A pilot's alt cannot farm its own bounty.
The client side

The server prices it. The client shows it.

  • The server sends the market's fee and tax in each book view. market_window.gd previews a sale from them, and only the server settles it.
  • The Insure button in fitting_panel.gd reads the cost, the payout, and the minutes left from fields the server puts on each ship.
  • The server owns every balance of Marks, Notches, and Salt. The client only shows what the snapshot says.
What the code looks like in numbers
1,065server lines in those four files
649lines in the client's market window
5market tests, four on orders and one on quantity
4server files for the market, trade, insurance, and bounties
What the tests prove

What is pinned, and what is not.

The tests live in test_alpha.py and run on every commit. Two socket checks run a real server. alpha_check.py drives a trade and a blueprint sale and purchase. playtest_check.py covers insurance, a bounty, Salt, a market bid, a cancel, and a 25 unit buy.

Pinned

  • test_sell_order_rests_then_a_buyer_takes_one_unit: a sell order rests, and a buyer takes one unit of it.
  • test_buy_order_escrows_and_fills_when_a_seller_crosses: a buy order holds its Marks, and a seller who crosses fills it.
  • test_broker_buys_materials_at_half_and_modules_at_ninety: the broker's two prices.
  • test_no_fee_money_no_resting_order_and_expiry_returns_goods: no fee money means no resting order, and an expiry returns the goods.
  • test_both_confirm_then_goods_and_marks_move: both sides confirm, a change to an offer clears the confirmations, and then goods and Marks move.
  • test_137_insurance_lapses_after_four_undocked_hours: the clock counts only undocked time.
  • test_insurance_caps_at_the_insured_fit_and_worn_value: the payout never beats the cover.
  • test_bounty_pays_only_the_uninsured_loss: insurance comes off the bounty.
  • test_a_wiped_fleet_gets_one_free_patrol_and_only_then: a wiped fleet gets one free Patrol and not a second.
  • test_salt_from_one_victim_pays_once_an_hour: no Salt farming one pilot.

Not pinned, or thin

  • The minimum quality on a buy order has no test.
  • The tax. A helper with a 1,000 Mark floor exists and has a test, but the market never calls it. A 1,100 Mark sale pays 55 Marks of tax. Our design spec names the floor, and the market code takes plain 5 percent.
  • The Notch steps at 125 and 625, and the rule against skipping a grade, have no test. We ran them by hand and they behave.
  • The six pay values are pinned only in part. A rounding test holds three of them and another holds the 1.4 ratio. A table of all six is still to write.
  • A Spool is an ordinary material, so it can be listed and bought for Marks. No rule or test says whether it should be.
  • No test scans the client and the server for a price in cash. The promise that nothing is sold rests on there being no such code, and our design notes list that scan as still to write.
  • The market's 1,000 Mark fee, the 7 day lifetime, and the starter Marks are not in the tuning sheet. BROKER_SELL is in the sheet, and nothing reads it.
What we learned and what is next

The lessons were small, and the playtests found them.

The broker is a bid, not a shopA stabilization pass found the broker showing as an endless seller at 0 Marks, and Buy 1 read 0 Marks. It was logged as a major issue. The broker quote now carries no sell price, the label says it never sells, and a test pins it.
Selling has to beat breaking downD82, from a tester report, set the broker's module price at 90 percent of its reference value, which is more than breaking the module down returns.
A policy has to grow, and has to endA report led to Raise policy in 0.5.0, so a refit can be covered. Another led to D88, and 0.5.1 gave a policy a term of 4 undocked hours.

Where we would push next

  • Salt from incursion clears is coming in 0.5.3, so a pilot who never fights pilots can reach a Spool. Layer 1's training incursion pays none on purpose, because it returns 5 minutes after a clear on a safe layer.
  • The public roadmap lists balance passes for mining, combat pay, structure prices, and insurance in its Next column. No version is fixed.
  • Settle the tax. The design spec says a 1,000 Mark floor and the market takes plain 5 percent. That is an open question, and any change goes in the patch notes.
  • Contracts pay XP only in the code today, while our rules document says they pay more. Whether to build that or change the document is an open question, not a promise.
Join the open alpha

Come and haggle with us.

Keel is free to play on PC, and the open alpha is where the economy lives. Find us in the Keel Discord, tell us what the market 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 resting a sell order above the broker's 1,000 Mark bid, then watch My orders.