Skip to main content

DEAD AIR

A first-person cave-horror game for the terminal. You are a search-and-rescue officer entering an unsurveyed sink in Piney Ridge National Park, nineteen hours behind a solo caver who did not come out.

It opens above ground. You have one evening of light to walk the approach, read the ground, and talk to the people who saw Wren Alcott last — and then you go down the hole.

Every room draws itself. The scenes are raymarched at runtime and lit by your actual lamp, so the picture loses reach and detail as the cell dies, for the same reason the prose does.

Built with Textual. Runs in kitty — the graphics use the kitty protocol, and fall back to sixel and then to Unicode half-blocks elsewhere, so it plays in any terminal and looks best in one that can draw. Ghostty, WezTerm and Konsole speak the protocol too.

Install

Needs Python 3.12 or newer. pipx is the tidiest way — it keeps the game and its dependencies in their own environment and puts deadair on your PATH:

pipx install git+https://github.com/AustinGuidry/dead-air

Or with plain pip, ideally into a virtualenv:

pip install git+https://github.com/AustinGuidry/dead-air

Then, from anywhere:

deadair

Pass --seed N to fix the run's coin-flips — the same seed always gives you the same cave noises. --help lists the options.

Running from a clone

If you would rather have the source to hand:

git clone https://github.com/AustinGuidry/dead-air
cd dead-air
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
./play

Controls

key action
1–9 take the numbered action — someone to talk to, something to look at, or a way on
L listen
R radio basecamp
X look again
F switch the helmet lamp on or off
D stop the beam down — half the burn rate, half the sight
C swap in a spare cell
N new run
ESC back to the menu
Q quit

F is for above ground — you start in daylight with the lamp off, and the evening does not wait for you. D and C are underground only, where the lamp is not something you get to switch off.

Saving

The game opens on a menu — resume, new run, controls, quit — and saves itself after every action, so quitting and closing the terminal are the same thing as putting it down. There is one slot and it is the run you are in. Finishing a run, however it finishes, clears it.

The file is $XDG_STATE_HOME/deadair/save.json, which is ~/.local/state/deadair/save.json unless you have said otherwise. Deleting it is a supported way to start over.

Take your time in the first few rooms. The cave teaches you what it wants before it asks you for anything.

You cannot see everything in the park before the light goes, and that is the point of the park.

Design notes

Mechanics, escalation, module layout, and tuning constants are documented in DESIGN.md — that file spoils the game, so read it only if you are here to work on the code rather than to play.

RELEASING.md covers cutting a version. It does not spoil anything.

License

MIT — see LICENSE.

Metadata

Release files for deadair 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for deadair 1.1.0
File Size Uploaded
deadair-1.1.0.tar.gz 49.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for deadair 1.1.0
File Interpreter ABI Platform
deadair-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 97.9 kB

Release files / deadair-1.1.0.tar.gz

Download URL deadair-1.1.0.tar.gz
Size 49.5 kB
Tags Source
SHA-256 checksum
How to use checksums
4e3f66066d723b06bf3e3d080d5e6f0aeb6662fc895d311c14506216b81db301
BLAKE2b-256 checksum
How to use checksums
9987cab2671146407ccd1cb44428b3ec8dae559ba5b45ad967e35898517c0c0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / deadair-1.1.0-py3-none-any.whl

Download URL deadair-1.1.0-py3-none-any.whl
Size 48.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a85aaaddef1eeb1109559ea15dfa7d07adbf25fc473a75f5ebaf92f415230551
BLAKE2b-256 checksum
How to use checksums
5dca5a73ea2a434aeb342cc7c9fc5f2fed393b6118b69f2e98b4746af3b4dec5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.2

2 release files

1.2.0

2 release files

1.1.1

2 release files

This release

1.1.0 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page