Balk · Engineering

Feature Gravity

22 October 2026

I don’t really think about code anymore.

It’s a description of where my attention went. Balk is a Java server, a React client, and Postgres. On a normal day about thirty pull requests land. That number swings and doesn’t track features or big work. It’s just how the tooling decides to chunk the things I ask for. Writing the code is cheap. Changing it is cheap. Large refactors across the codebase seem effortless. So the cost moved. What is possible has changed.

Three things I believe that inform the rest

Tests are your intellectual property. Build your datasets. Label your complicated business cases. Make it easy to generate a vast number of test cases quickly. The tests are what let the code be cheap.

If the output is correct, it is correct. I don’t care what the code looks like. I care whether it does the right thing. If something about the code matters to you, measure it and gate it in CI.

All code is technical debt. Every line is a liability the moment it exists, and it’s subject to change at any time for any business need.

Proving the code is right is now my most important cost.

What feature gravity is

Feature gravity is the pull a feature exerts on everything that comes after it: the cost of every change it touches, every test it adds, every piece of context it occupies. Not the cost of writing it. The cost of owning it.

The name is borrowed from data gravity, where enough data in one place eventually drags the compute to it and the cloud-agnostic dream meets the S3 bill. Features do the same thing to a codebase. Enough of them and every new change is made in their field.

The older vocabulary gets close but doesn’t quite land anymore:

Any discussion of technical debt or maintenance cost that hasn’t been revisited since the new coding tools arrived is describing a different world.

What one feature weighs

We have an onboarding flow. The feature is: you must fully explain the game to new users. That single sentence took on a ton of weight. Change a rule and a lesson gets rewritten. Almost every new feature has to interact with onboarding, or at least stop and consider whether it should. The onboarding flow is constantly reworked, and none of that rework is the onboarding flow’s fault. It’s gravity.

That’s the obvious example. The less obvious ones are in the pipeline.

Every pull request has to pass five checks before it merges:

CheckWhat it coversSize todayTypical run
ServerJava tests against a real PostgresJava tests against a real Postgres~1,100 tests5¼ min
FrontendUnit tests, types, buildUnit tests, types, build~600 tests2½ min
BrowserWhole games played end to endWhole games played end to end55 tests9 min
PicturesEvery screen compared pixel by pixel to an approved imageEvery screen compared pixel by pixel to an approved image334 images5 min
ScriptsDeploy and release scriptsDeploy and release scripts4 suites1¼ min

One full run of all five is a round. A round is the unit of cost, and every feature adds a variable amount of weight to it.

None of this is the cost of writing the feature. It’s the cost of the machine that proves the feature still works, growing a little every time.

Measuring the machine

If a round is the unit of cost, then the pipeline is where feature gravity shows up as money, and that’s a thing you can measure and drive down.

We left GitHub Actions this month, for two reasons. One was a run of outages this year.GitHub’s availability reports: Actions jobs delayed or failed 9 July 2026, 03:29–13:39 UTC; github.com degraded by a DNS fault 19 July, 18:00–20:11 UTC; self-hosted and larger runners cut off 19–20 July, 23:05–03:55 UTC; ten incidents in April. github.blog The other was control: to run things more freely and to keep the bill down by being able to move clouds. What we built is a small fixed coordinator and workers rented by the second from a job queue, the same shape AWS documents for scaling on a queue’s backlog.“Scaling policy based on Amazon SQS,” Amazon EC2 Auto Scaling User Guide. docs.aws.amazon.com The coordinator holds the code, the queue and the results, and is always on and small. Workers are made when jobs wait, from a prepared image, and deleted after five idle minutes. With no work, there are none. Spend is capped in code. A release is built on the workers and goes live when a person presses Put live. This month the workers were DigitalOcean droplets. Next month, whoever is cheapest.

Round time, median wall clock

7–9 Oct · own forge, one machine, one heavy job at a time40–60 min
11–12 Oct · rented workers17.7 min
14–18 Oct · after the fixes8.8 min
18–22 Oct · bigger browser suite9.8 min

That last row is feature gravity in a chart. Nothing about the pipeline got slower between the 18th and the 22nd. The browser suite got bigger.

What a round costs: machine-minutes per round

11–12 Oct39
14–18 Oct19.3
18–22 Oct23.4

Against GitHub’s hosted runners

11–18 Oct · 202 check-hours
Ours: workers + coordinator$35.59
GitHub-hosted, 2-core$72.72
GitHub-hosted, 4-core$145.44
15–22 Oct · ~123 check-hours
Ours: workers + coordinator$22.33
GitHub-hosted, 2-core$44.25
GitHub-hosted, 4-core$88.51
Ours is every billed minute, boots and idle included, plus a week of the $14-a-month coordinator. GitHub’s is the same check time only. The two weeks overlap on 15–18 October.GitHub, “Actions runner pricing”: Linux 2-core $0.006, 4-core $0.012 a minute. docs.github.com. Our borrowing record and round reports to 18 and 22 October 2026. Round reports: 11–12 October (45 rounds), 14–18 October (231), 18–22 October (214). October to the 22nd: $53.83.

Why machine-minutes per round rose while cost per round fell: the two measure different windows, and the first cost week carries the slow rounds of 12–13 October, so check time per round fell from 25.7 to 19.9 minutes between the two cost weeks even as the last four days’ rounds grew heavier than 14–18 October’s.

Where a billed minute goes, 15–22 October

Checks54%
Tails18%
Boots16%
Idle13%

We are nowhere near the bottom. Three browsers per machine are on trial. Reusing green results saves 1.9% on trunk alone and about a quarter of machine time if any green result counts. How many workers to keep warm, and for how long, falls straight out of the billed-time split above. One OpenTofu file per cloud: DigitalOcean is $0.00139 a minute today; Google Cloud spot lists $0.00064.Our price survey, October 2026, 4 CPU / 8 GB, list prices per minute; clouds that bill by the started hour left out.

What it costs to build the Alpha “MVP” of Balk

List prices, October 2026, before tax.Anthropic, “What is the Max plan?”: Max 20x, $200 per month. support.claude.comDigitalOcean list prices from our own records: the live server and backups (monitoring notes), the coordinator after its move, prepared images (about 15 GB at $0.06/GB each); workers from our borrowing record at October’s pace.

ItemPer month
Claude Max 20x plan$200
Rented check workers (October to the 22nd: $53.83)~$77
The coordinator: 1 CPU / 2 GB and its disk$14
The live site’s server: 1 CPU / 2 GB$12
Off-site database backups (object storage)$5
Prepared machine images for the workers< $2
Email (free tier)$0
Total~$310

The nice thing about “Feature Gravity” is we can turn it off. Our live site in theory can handle 2k active users based on our internal load testing. I know some flaws in that, but if we have 2k active users I have a business model that shows something very profitable to throw compute at. This feels like running a sub 30 second mile compared to a year ago. This feels like magic. What happened to the software engineers that liked to build? Message me if you want to build something. I love tinkering with computers.

Numbers are from our check results, research notes, borrowing record and merge history, 25 September – 22 October 2026. balk.club