it is 2:57 on friday afternoon. the general contractor wants your number, the drawings have holes in them, and payroll still hits monday whether you win the job or not.
that is Bid Day: Subcontractor Tycoon, the terminal game we built around a problem I have dealt with for most of my working life.
why we built it
people outside construction often think bidding is simple: count the work, add a markup, send a number. anyone who has bought a job too cheap knows better.
an estimator has to decide how much time to spend on the bid, what the field can really produce, which scope gaps need a qualification, how much uncertainty belongs in the number, and whether the company can carry another job while waiting to get paid. those decisions are connected.
and most estimating software is built to produce an answer, not teach what happens after the answer leaves your desk.
I wanted a small game where a bad decision could hurt without costing a real company $40,000. something an estimator, project manager, student, or curious person could play in a terminal and then argue about with another contractor.
no customer files. no real pricing. no painful monday meeting.
what you do in the game
each week opens with a fictional request for proposal. you read the scope, the general contractor profile, the documents, the bid field, the estimator note, and the payment terms.
then you make five decisions: diligence, production, risk response, markup, and contingency. you can also pass on the job, which is sometimes the smartest button on the screen.

the screenshot above is a real run using fence and gates with seed 4242. the sell price changes as you adjust the bid, but the game does not reveal the future field cost while you are still estimating. you earn that bad news later, just like the rest of us.
after you submit, the game decides whether you win. closing the week moves work through field cost, billing, retainage, collections, overhead, crew capacity, and trade-specific events.
winning every job can sink you.
six trades, six different headaches
the first version started with fence because that is the trade I know. the current game has six subcontractor businesses:
- division 03, concrete
- division 07, roofing and waterproofing
- division 09, drywall and ceilings
- division 23, HVAC
- division 26, electrical
- division 32, fence and gates
the controls stay familiar, but the businesses do not act the same. concrete has pour sequencing and pump cash. roofing has weather and dry-in pressure. HVAC has long-lead equipment, controls, startup, and testing. fence has gates, soil, mobilization, and access-control handoffs.
that difference matters. changing the trade name on the screen would have been easy. changing the cost mix, crew limits, scope clues, events, and cash timing took the real work.
how to play it
this is a source project on GitHub right now, not a game you buy from an app store. you need Git, Python 3.11 or newer, and a small Python tool named uv.
open a terminal and run:
git clone https://github.com/ContractorKeith/terminal-construction-tycoon.git
cd terminal-construction-tycoon
uv run bid-sim
git clone copies the project to your computer. cd moves the terminal into that folder. the first uv run creates an isolated Python environment, installs the locked project dependencies, and starts the game.
Bid Day is not on PyPI yet, so use the GitHub source and do not grab a similarly named package by mistake.
the game works best in a terminal around 120 columns by 40 rows. use Tab and Shift+Tab to move, arrow keys and Enter to choose, H for the field manual, and Q to quit. a mouse works too.
to list the trades:
uv run bid-sim --list-trades
to play a short concrete campaign with a repeatable seed:
uv run bid-sim --trade concrete --seed 4242 --weeks 4
the same trade, seed, campaign length, and decisions produce the same result. so if you find a strange outcome, somebody else can replay it instead of trying to debug a contractor story that starts with “I think it was the third job.”
who might use this
a construction-management instructor could use one seed for a class and compare why each group priced the same risk differently. an apprentice estimator could see why markup and margin are not the same percentage. a subcontractor owner could hand it to a new project manager before giving them a live backlog report.
and contractors can use it for what contractors do best: disagreeing about the right number after somebody else already bid it.
it is still a game. it is not takeoff software, an accounting system, or advice about what your real company should bid.
help us make it better
the project is MIT-licensed and open on GitHub. the repo has a contribution guide, a roadmap, and an issue tracker.
good first contributions include a better fictional scope clue, a repeatable scenario, a gameplay test, terminal accessibility work, documentation fixes, or a proposal for another CSI division that actually behaves like a different business.
please do not submit real customer documents, private pricing, or employer bid data. fictional examples are enough.
but do tell me where the game feels wrong. share the trade, seed, campaign length, and the decisions you made. that gives us something we can replay, check, and fix.
ContractorKeith