O.R.B.S.

Operational Relic Bewitching System · a game in development at Blackhearth Games

/tower

O.R.B.S. — Operational Relic Bewitching System

scrying lens ................ [ ok ]
ley-line uplink ............. [ ok ]
grimoire index .............. [ ok ]
laboratory .................. [ ok ]
archive ..................... [ ok ]
battlements ................. [ not found ]
menagerie ................... [ not found ]
forge ....................... [ not found ]

the orb warms to your touch.

O.R.B.S.

Operational Relic Bewitching System · Blackhearth Games

A wizard sits in his tower and stares into his scrying orb. Inside the orb is a computer terminal.

O.R.B.S. is a text-only game played entirely through a fantasy command line. You tend a wizard’s tower by navigating a filesystem that is your duties — brewing in /laboratory, warding in /battlements, spying in /lens — and you progress by writing scripts that teach the orb to do your work without you.

When you are ready, you descend into a siege, where an intelligent enemy attacks the automation you built and you must diagnose and repair it under pressure.

Artless by design. No sprites, no characters, no illustrations. A single curved CRT glowing in the dark.

The shape of it

the tower
The calm layer. Navigate, brew, ward, research, write spells, and handle the small disasters that arrive on their own. No forced threat, ever.
the spell
Automation is the progression. Every line a script saves is a line you once typed yourself.
the siege
Entered deliberately, never sprung on you. Real-time, with genuine failure — and your scripts are what gets attacked.

Two things that make it different

The parser forgives phrasing. Mastery is knowing what to do, not recalling a flag. Issuing a command is free and instant, and a fast typist gains nothing over a slow one.

Automation is attack surface. The script you wrote to run the night watch is the thing a siege will come for — by poisoning what it reads, not by out-damaging it.

There is a command line at the bottom of this page, if you would rather drive the site the way you would drive the game. Try , or for the manual.

laboratory

brewing · /tower/laboratory · one of two domains you start with

There is no command that brews a potion.

That is the whole design of this room in one sentence. The laboratory holds five instruments, and brewing is moving materials through them — clear a tool, load it, set it working, collect what it made. The only way one line makes a potion is a spell you wrote yourself.

stage        instrument           heat      leaves behind
preprocess   mortar_and_pestle    —         husks
process      balneum_mariae       athanor   sediment
combine      flask_and_rod        —         dregs
distil       alembic              athanor   phlegm
(heat)       athanor              —         ash

The fire is the decision

The athanor is shared infrastructure. It takes charcoal, burns at a constant rate while lit, and heats whichever of the bath or the still is working. It consumes fuel per lit tick whether or not anything is mounted on it — so idle lit time is pure waste.

The two heated stages are not adjacent. The unheated flask_and_rod sits between the bath and the still, which means burning straight through the combination throws fuel away. The efficient play is:

light → digest → damp → combine → relight → distil

That was not designed. It fell out of the durations, and it was found when the fire died in the middle of an end-to-end test.

The cost of getting it wrong is fuel, never progress. A careless player pays a little more charcoal; an attentive one banks what has not burnt. This is the cleanest argument for automation in the game: a player who walks away with the athanor lit wastes fuel, and a script that ends its loop with stop athanor does not.

Byproducts, under one rule

Every byproduct has at least one use. A tool fouled by the last brew must be cleared before the next, and a byproduct that is an input to another recipe makes the room’s current state change what is worth doing now. A byproduct that was only ever litter would turn clearing up into tidying — which is the exact feeling the rule exists to remove.

Next: the archive, the other domain you start with.

archive

research · /tower/archive · one of two domains you start with

Every command in the game is found, then understood, then used.

You do not begin knowing how to read a file. You begin with attend and survey, and everything after that is a fragment recovered from a siege, a hidden directory or a stranger’s machine, carried back here and deciphered.

orbs:~/archive$ decipher fragment_0x1f

  the sigil resolves. it is a sieve — it lets
  through only what matches, and holds back
  the rest.

  learned: sift
    sift <pattern> <file>
    ... | sift <pattern>

  the grimoire grows.

Shell verbs, domain verbs, and capabilities all unlock on this one track — conditionals, loops, triggers, offline accrual, extra panes. Literacy and progression come out of the same mechanic, which is why the archive is played more than anything else in the tower.

It is also why the fiction holds. You are not being handed a tutorial; you are a wizard who has recovered a word and worked out what it does.

grimoire

spellcraft · /grimoire · a sibling of the tower, not a room inside it

A spell is not kept in a room. It is a book you carry.

Spells are ordinary text files. You write them in the orb’s editor or in your own, and the orb reads exactly what you typed — your words, not a rewritten canonical form.

orbs:~/grimoire$ cat night_watch.spell
#!/orbs/invoke
# runs each dusk

ward --upon north_gate --strength 3
invoke brew_clarity --qty 2
purge --byproduct --above 60%

if scry --enemy --within 2leagues; then
    alert --priority high
    ward --upon all --emergency
fi

orbs:~/grimoire$ bind night_watch.spell --to dusk
Bound. The orb will remember.

brew_clarity is a spell you wrote, not a command the game ships. It holds the dozen-odd lines that clear the instruments, move the reagents, wield each in turn and siphon the result — and night_watch simply calls it. Scripts composing scripts is the beat between “I automated one chore” and “my tower runs itself”.

Why automation wins

  • Some things cannot be done by hand at all. Triggers on events you cannot sit and watch for; conditions that need continuous evaluation.
  • Your attention is the scarce resource. A manual action occupies its pane for its whole duration. A script does not spend the attention you need elsewhere.
  • The orb is simply better at it. A script-executed action completes faster than the same action typed.

And why that is dangerous

Automation is progression and automation is attack surface. A bound script runs unattended, on inputs it does not question. The siege does not out-damage your defences — it feeds them a log that is subtly wrong, a record with the spacing off, a name that refers to a gate which was destroyed and rebuilt.

References resolve by identity, not by name, so a rebuilt gate is a new thing and the script says so rather than quietly acting on a replacement. That is what makes sabotage detectable instead of invisible — and finding it is the game.

the siege

the second half of the game · /siege · not yet built

Urgency is consensual. The tower is safe; a siege is something you walk into.

A siege is real-time and can genuinely be lost. Your bound spells execute as an autobattler while you diagnose and repair under pressure — which is the moment every other system in the game converges.

Why you would go

Sieges are the only source of certain reagents, fragments, and knowledge of what your enemy can do. Idle play plateaus without them. Nothing pushes you in; the ceiling simply stops rising.

What you keep

Earnings accrue into escrow as they happen and settle when you leave. How much you keep scales with how far you got — so bailing out early after farming a cheap opening is punished specifically, while a run that fails at ninety per cent still pays nearly in full.

What attacks you

Not a bigger number. The enemy attacks the automation: it poisons what your scripts read, so a spell that is working perfectly does the wrong thing perfectly. One command diagnoses it. Knowing to run that command is the skill.

screens

captured from the running game, never mocked up

There is no key art. The screen is the art, so these are the whole picture — real frames from the real build, each recorded with the sequence played and the commit it came from.

The O.R.B.S. screen at cold start, in amber phosphor on black. A single box-drawn pane headed ‘/tower  F4 deep’ curves slightly at the edges from the CRT barrel distortion. Inside it: ‘orb 0 181 cold start’, then ‘laboratory 8 ok’ and ‘archive 4 ok’ with the ‘ok’ in green, then ‘bound 0’, then a four-column table of the verbs the orb currently knows — attend, survey, peruse, sift, status, recall, verify, unfurl, meditate, move, wield, empty, stop, purge, divine, scribe, invoke. Below, a second pane headed ‘orb’ shows a telemetry table reading ‘tick 1’. At the bottom, the input line: ‘david $’ with a block cursor.

the tower at cold start. Two domains found, five still undiscovered, and every verb the orb has been taught so far. The bow in the pane borders is the game’s CRT shader, not a rendering artefact.

the same frame, as text

The game can print any frame as text through the same painter that draws it. This is that output for the same state, at an 80×22 grid — a dump builds no window, so its grid is stated rather than inherited from one.

┌ /tower  tick 0  tier 1  80x22  wide  F4 deep ────────────────────────────────┐
│  orb 0 181 cold start                                                        │
│  laboratory 8 ok                                                             │
│  archive 4 ok                                                                │
│  bound 0                                                                     │
│  attend place     survey place     peruse file      sift pattern             │
│  status           recall topic     verify name      unfurl                   │
│  meditate count   move reagent     wield place      empty place              │
│  stop place       purge name       divine fragment  scribe name              │
│  invoke script                                                               │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘
 david $

More screens arrive as the domains do. The interesting states — the athanor lit, a brew part-way through, a siege — have to be played to by hand before they can be photographed, so they land in batches rather than continuously.

roadmap

solo · commercial · planned as a long build. Demo first, then 1.0 — no early access.

phase                     status
0.  vertical slice        closed
0.5 interlude             closed
1.  core loop             in progress
2.  siege                 —
3a. breadth               —
3b. remote hosts          —
3c. engine upgrade        —
4.  onboarding + demo     —
5.  ship                  —

Phase 0 built the parser, the cell renderer, the CRT port, the boot sequence, and the two starting domains — brewing and archive — as a working vertical slice.

Phase 1, in progress, is the core loop: the world clock, the script engine, the failure taxonomy, more of the sabotage surface, and the balance work that turns first-pass numbers into a game.

Everything after that is written down, argued with, and subject to a cut line that was decided in advance rather than in a panic.

One thing worth being honest about

Phase 0 set itself a numeric exit gate: eight external testers, at least half with no shell experience, and 85% of their inputs reaching the action they intended on the first attempt. That gate has not been run. It is deferred, not passed — there are no external testers yet, and the author cannot stand in for one, because someone who already knows the vocabulary is measuring their own memory.

It will run in Phase 4, where onboarding and the demo put people who do not use terminals in front of the game anyway.

pillars

the five things every decision is checked against

1
The terminal is the fantasy, not a UI. Every mechanic should feel like both operating a computer and practising magic.
2
Understanding beats memorisation. The parser forgives phrasing. Mastery is knowing what to do, not recalling a flag.
3
Automation is progression — and automation is attack surface.
4
Urgency is consensual. The idle layer is safe. Sieges are entered deliberately.
5
Everything converges in the siege.

The voice

The register moves with the world, never with the mood of the writer.

earnest arcane
The default, and about four fifths of the text. Warm, mythic, sincere.
sysadmin comedy
Easter eggs, deprecated commands, obscure corners. Old software with old opinions. Discovered, never pushed.
eldritch
Threat high, siege collapsing, forbidden directories. Clipped, cold, wrong.

The eldritch register signals through pacing, diction and silence — never through colour, so it survives any phosphor and any colour vision.

What this game is not

  • Not a Linux tutorial. Terminal literacy helps, and is never required.
  • Not a typing game. Diagnosis is one command; speed buys nothing.
  • Not illustrated. No sprites, no portraits, no key art beyond the screen itself.
  • Not multiplayer.

battlements

defence · /tower/battlements · not yet built

Walls, gates and wards. Command pressure at one action per second, and ward placement that has to hold while you are busy elsewhere.

The battlements are where a siege lands, and where the automation you wrote in calmer hours either holds or does not.

See the roadmap for when.

lens

scrying · /tower/lens · not yet built

Feeds, logs, intelligence. Scrying is deduction: parse noisy output and find the truth someone has hidden inside it.

This is the room that reads sabotage. When a bound spell starts doing something slightly wrong, the evidence is in a log, and the lens is how you find it — spacing that drifted, an alignment that slipped, a record that is malformed in a way a machine would not produce.

Log listings are never corrupted by the game’s own presentation, however bad things get. The diagnostic surfaces have to stay trustworthy as renderings, even when their contents are not.

menagerie

summoning · /tower/menagerie · not yet built

Familiars and constructs. Allocate resources, get something that fights on its own in a siege — and, being autonomous, does so whether or not it is still a good idea.

forge

enchanting · /tower/forge · not yet built

Imbuing items and wards. A sequence and a resource cost, in exchange for something that keeps being true after you stop paying attention to it.

about

made by
Blackhearth Games — David Yurek, solo
status
In development. Phase 1 of nine.
built with
Rust and the Bevy engine
platforms
Windows, macOS, Linux
licence
GPL-3.0-or-later — the game is built in the open
contact
support@blackhearthgames.com

There is no store page yet, and no wishlist link to give you. When there is one, it will be here. Until then, the email above reaches a person.

Credits

This site is vanilla HTML, CSS and JavaScript. No framework, no build step, and no analytics of any kind — nothing here watches you read it. It works with JavaScript switched off; the command line is the only thing you lose.

typeface
unscii-16 by Viznut — public domain / CC0. The same face the game renders its cell grid from.
colours
The four phosphor themes are the game’s own, converted from its source rather than matched by eye.
site source
MIT. github.com/millidavids/orbs_website

Privacy

This site sets no cookies and runs no analytics, no trackers and no third-party scripts. Your phosphor preference is kept in your own browser’s local storage and is never sent anywhere. The host, Cloudflare Pages, keeps standard server logs.