Skip to main content

Progress Quest

Relive the great adventure… this time in the terminal realm!

Features

  • Faithful port of the game logic
  • Saves (with backups) to $XDG_CONFIG_HOME/pqcli/save.dat
  • Terminal interface that comes in 2 flavors:
    • Rich and colorful (--curses, default)
    • Minimal, suitable for raw grind (--basic)
  • Ideal to run on your server

How it looks like

Curses interface:

Screenshot Screenshot

Basic interface:

Screenshot

How to install

If you have Python 3.10 or newer, just run pip install --user pqcli and you're good to go! Then type pqcli to run the game.

In case if you want to use the git version, the process is just a bit more complex:

$ git clone https://github.com/rr-/pq-cli.git
$ cd pq-cli
$ pip install --user .

Docker / Docker Compose

The repository includes a Dockerfile and docker-compose.yml that run the game with --basic and keep save data in a persistent named volume.

There is no registry pipeline required for this setup: build locally, then run with Compose.

# Build image locally from the Dockerfile
docker compose build

# First run (interactive): create your character in the shared save volume
docker compose run --rm pqcli-init

# Later runs on a server (detached, default save slot 1):
docker compose up -d pqcli

# List existing saves in the same volume:
docker compose run --rm pqcli-init pqcli --basic --list-saves

# Change detached slot if needed (example: slot 2):
PQCLI_SAVE_SLOT=2 docker compose up -d pqcli

# Follow logs / stop detached container:
docker compose logs -f pqcli
docker compose stop pqcli

On first run, if no save data exists in the mounted volume, pqcli will automatically launch an interactive character-creation bootstrap in CLI mode before starting the normal interface.

For server usage, run first-time setup without a forced slot (pqcli-init), then run the long-lived detached service (pqcli) that loads slot 1 by default.

Customizing the adventure

All word lists (monsters, spells, equipment, races, classes, titles and so on) live in JSON files. To change them, copy the built-in files somewhere and edit them:

$ pqcli --dump-data ~/.config/pqcli/data

On startup, pqcli reads $XDG_CONFIG_HOME/pqcli/data/ (or the directory given with --data-dir DIR). Each NAME.json there replaces the built-in list of the same name. Files you leave out fall back to the built-in lists, so you can delete the copies you don't change. If a file is malformed, pqcli prints what is wrong and refuses to start.

The available files are spells, offense_attrib, defense_attrib, offense_bad, defense_bad, shields, armors, weapons, specials, item_attrib, item_ofs, boring_items, monsters, races, classes, titles, impressive_titles and combat_verbs.

For example, to vary the combat descriptions, create combat_verbs.json. {target} is replaced with the enemy:

[
  "Executing {target}",
  "In a fierce battle to thwart {target}",
  "Fighting bravely against {target}",
  "Kicking the butt of {target}"
]

A few things to keep in mind:

  • Order matters in spells.json: spells are learned roughly from the top down, so keep weaker spells first.
  • Titles near the top of titles.json show up more often.
  • Stats in races.json and classes.json are written as STR, CON, DEX, INT, WIS, CHA, HP Max or MP Max.
  • Existing characters keep their race and class even if you remove them from the lists.

Moving characters to and from the web version

pqcli reads and writes the .pqw files that the web version's roster page saves and loads. A character keeps its random number generator state either way, so it carries on exactly as it would have where it came from.

  • In either interface, pick Import or Export from the main menu.

  • From the command line:

    $ pqcli --import-save Grumdrig.pqw
    $ pqcli --list-saves
    1. Grumdrig
    $ pqcli --export-save 1 Grumdrig.pqw
    

Export never overwrites an existing file. pqcli plays offline only, so online realm, guild and motto settings are dropped on import, with a warning.

Contributing

# Clone the repository:
git clone https://github.com/rr-/pq-cli.git
cd pq-cli

# Install to a local venv:
uv sync

# Install the git hooks (formatting, linting, commit messages):
uv run prek install

# Run the game and the tests:
just run
just test

This project uses uv for packaging. Install instructions are available at uv#installation. The justfile needs just; without it, use uv run pqcli and uv run pytest.

Troubleshooting

_curses.error: init_pair() returned ERR

If running on Linux and you get the error _curses.error: init_pair() returned ERR, try making sure that your $TERM variable is set to a value which supports 256 colors, such as via the following:

TERM=xterm-256color pqcli

Metadata

Release files for pqcli 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 pqcli 1.1.0
File Size Uploaded Provenance
pqcli-1.1.0.tar.gz 278.8 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 346.0 kB

Release files / pqcli-1.1.0.tar.gz

Download URL pqcli-1.1.0.tar.gz
Size 278.8 kB
Tags Source
SHA-256 checksum
How to use checksums
57b9bc341d981d6e8edd5dd8eeca8e66705a923ddae9322de0131f761ab952ae
BLAKE2b-256 checksum
How to use checksums
b3b79bc4cd659f957191bde93feab00df4a85f2ece6e4754e3e3211e8b9e555d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

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

Download URL pqcli-1.1.0-py3-none-any.whl
Size 67.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
75d7ce65ebdf25d6cd801bc1aceaf3774d42fc9d5f183e56cde567d06610c079
BLAKE2b-256 checksum
How to use checksums
bdca7889e3701c36b2e7052b950de246ba9e7ca71fbabfcc5de8cd8af818affe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Security for pqcli 1.1.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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