A Diablo-like roguelike for the terminal.
Every torch, campfire, crystal, lava pool and spell casts real, colored, flickering light.
You see only what the light reaches.
Nothing to install:
ssh medv.io -p 2222Or run it locally:
go run github.com/antonmedv/termablo@latestAdd -seed 42 and the world is the same every time. Share the seed, race a friend.
2026-10-10: The Cinder Sanctum, the Ember Cult's chapel under the town's own graveyard, with two new side quests: bring Hadrik back the coal the Cult stole from his forge, and put out the Cinder Prior for Brother Aldous. Also the Gravewardens' Barrow, and two new faces in Emberhold.
See UPDATES.md for more.
A king once carried a coal up out of the Abyss and built a town around it. The dark cannot cross light taken from it, so it climbs toward the town instead. You are the stranger they hire to go down and meet it.
docker compose up -d # then: ssh localhost -p 2222or, without Docker:
go run github.com/antonmedv/termablo@latest -ssh :2222Built with Bubble Tea and Wish.
Nobody tuned the numbers by hand. Two scripted players, a fighter and a
caster, play the game to the end over many seeds. How deep they get, what
kills them and what their gold does is held against a set of goals
(internal/balance), and every number in the game's formulas is a knob
(rules.go) a balance pass may turn.
make knobs # every knob: value, range, meaning
make eval OUT=balance/runs/a.json SEEDS=96 # both builds over 96 seeds, scored
make eval OUT=balance/runs/b.json SEEDS=96 RULES=try.json # knobs laid over the defaults
go run ./cmd/balance compare balance/runs/a.json balance/runs/b.json
go run . -bot fighter -seed 7 # watch one runA rules file is a JSON overlay, {"WakeRange": 12}. The score is the
weighted distance outside the goals, lower is better; compare pairs
the two runs by seed and says whether the difference is noise. Every
decision goes in balance/LEDGER.md, every pass
ends in balance/REPORT.md. In Claude Code,
/balance runs the whole loop; the runbook is
docs/balancing.md.

