Skip to main content

🇺🇸 English · 🇧🇷 Português

HOWL

Hoard Optimizer, What to Launch

CI PyPI Coverage Ruff

Ranks your Steam library by quality × time invested using data from HowLongToBeat, Metacritic and Steam Reviews. No more decision paralysis staring at your backlog.

howl ranking a Steam backlog

Requirements

  • Python 3.11+
  • Steam API Key (free, instructions below)
  • Steam account with public profile and library (or private, using your own key)

Installation

pip install howl-steam-backlog

Or with pipx (recommended for CLI tools — isolated environment):

pipx install howl-steam-backlog

For development:

git clone https://github.com/albertosca/howl.git
cd howl
uv sync --extra dev               # resolves from uv.lock into .venv
uv run --extra dev pytest         # run the suite

Dependencies are pinned in uv.lock, so uv sync reproduces the exact versions the tests were last green against. pip install -e ".[dev]" in a plain venv still works and is what CI does, but it resolves fresh and ignores the lock.

After installing, the howl command becomes available:

howl --help

Configuration

Quick way: howl --setup

howl --setup

The interactive wizard walks you through the required variables, validates them live against the Steam API, and writes them to ~/.config/howl/.env (loaded automatically, created with 0600 permissions). If you still have a legacy .env in the current directory, it offers to migrate it.

Manual way: environment variables

Variable Required What it is
STEAM_API_KEY yes Steam Web API key
STEAM_USERNAME yes Vanity URL of your profile (e.g. gabelogannewell)
STEAM_VDF_PATH no Path to sharedconfig.vdf (collection filters)
IGDB_CLIENT_ID no Twitch app Client ID (scores for delisted games)
IGDB_CLIENT_SECRET no Twitch app Client Secret

STEAM_API_KEY:

  1. Go to https://steamcommunity.com/dev/apikey
  2. Log in with your Steam account
  3. Fill "Domain Name" with any value (e.g. localhost)
  4. Copy the generated key

STEAM_USERNAME: The vanity URL of your Steam profile: steamcommunity.com/id/gabelogannewell → username is gabelogannewell

IGDB_CLIENT_ID and IGDB_CLIENT_SECRET (optional): IGDB complements Metacritic for games where Steam returns no score (delisted, very old, etc.).

  1. Go to https://dev.twitch.tv/console and log in with your Twitch account (create one if needed — it's free)
  2. Click Register Your Application
  3. Fill in:
    • Name: anything (e.g. howl-igdb)
    • OAuth Redirect URLs: http://localhost
    • Category: Website Integration
  4. Click Create
  5. In the app list, click Manage
  6. Copy the Client ID
  7. Click New Secret and copy the Client Secret (shown only once)

With the credentials configured, run:

howl --migrate-igdb

The OAuth token is generated and refreshed automatically. You don't need to repeat this process.

STEAM_VDF_PATH (optional): Required to use --collection and automatic exclusion of finished games.

System Default location
macOS ~/Library/Application Support/Steam/userdata/<steamid>/7/remote/sharedconfig.vdf
Linux ~/.steam/steam/userdata/<steamid>/7/remote/sharedconfig.vdf
Windows C:\Program Files (x86)\Steam\userdata\<steamid>\7\remote\sharedconfig.vdf

The <steamid> is numeric (different from the vanity URL). Find it in: Steam → Settings → Account → Steam account ID.

Credentials live in ~/.config/howl/.env (respects $XDG_CONFIG_HOME). The wizard writes this file for you; to set it up by hand, create it with one KEY=value per line:

# ~/.config/howl/.env
STEAM_API_KEY=your_key_here
STEAM_USERNAME=your_username
# STEAM_VDF_PATH is optional (collection filters)
STEAM_VDF_PATH=/path/to/sharedconfig.vdf

Prefer this over exporting the keys in your shell profile (~/.zshenv, ~/.bashrc): shell exports leak the values to every process on your system.

Language

howl speaks English and Brazilian Portuguese. howl --setup asks which one you want and stores the answer in ~/.config/howl/.env.

To override it for a single run:

howl --lang pt-BR

Resolution order, highest first: --lang → HOWL_LANG environment variable → HOWL_LANG in ~/.config/howl/.env → your operating system locale → English.

Usage

# First run: populates the cache (may take ~5 min for 300 games)
howl --username my_steam_id --verbose

# Top 10 good and short games (default)
howl --username my_steam_id

# Interactive visual interface
howl --username my_steam_id --tui

# Filter by genre, progress and formula
howl --username my_steam_id --genre "action,rpg" --not-started --sort quick-wins

# Filter by release era
howl --username my_steam_id --era "2010-2015,2015-2020"

# See what's available in the cache
howl --list-genres
howl --list-tags
howl --list-collections

With STEAM_USERNAME set in the environment, --username can be omitted.

Sort formulas (--sort)

Name Formula When to use
shortest composite / √h Good and short games — default
longest composite × √h Epics worth every hour
rated Metacritic only Most critically acclaimed
loved Steam % positive Most loved by players
quick-wins composite² / h Maximum quality in less time
hidden-gems steam × (1 − mc/100) Loved by players, ignored by critics
composto 0.5×mc + 0.5×steam Configurable weighted average

composite = weighted average of Metacritic and Steam reviews (tune with --weight-mc / --weight-steam).

Games without Metacritic or Steam reviews get zero weight on that source (the other takes 100%).

Available filters

Flag Values Default
--sort see table above shortest
--genre comma-separated —
--genre-any comma-separated —
--exclude-genre comma-separated —
--era pre-2005 2005-2010 2010-2015 2015-2020 2020+ unknown all
--not-started — —
--in-progress — —
--all-progress — not-finished
--category all singleplayer coop all
--min-hours / --max-hours hours (HLTB) —
--collection Steam collection name —
--top integer 10
--show-finished — excluded

TUI (visual interface)

howl --username my_steam_id --tui
Key Action
f Open/close filter panel
g Toggle genres column
t Toggle Steam categories column
s Save current result to CSV + Markdown
q Quit

The filter panel applies all changes in real time.

Cache

HLTB, Steam Reviews and game detail data are cached in games_cache.json to avoid repeated requests. To update:

# Re-fetch everything from scratch
howl --username my_steam_id --refresh

# Fill missing fields in old entries (genres, release_year)
howl --migrate-cache

# Fetch IGDB scores for games without Metacritic (requires IGDB_CLIENT_ID and IGDB_CLIENT_SECRET)
howl --migrate-igdb

--migrate-cache is useful if you had a cache from earlier versions that didn't have all fields.

--migrate-igdb fills critic scores via IGDB for games where Steam returns no Metacritic — especially useful for delisted games (e.g. the original Deus Ex: Human Revolution). It can be re-run at any time; games that already have IGDB data in the cache are skipped.

Troubleshooting

"Username not found on Steam" Check that the vanity URL is correct. Visit https://steamcommunity.com/id/your_id/ — if it redirects to your profile, it's right.

Games without Metacritic or Steam reviews Normal — not all games have data. They still show up but with score 0 in some formulas. Use --sort loved or --sort rated to see only games with data.

"0 entries to migrate" The cache is already complete. If you just built the cache with howl --verbose, all games already come with every field.

Cache with few games If the Steam library is set to private, the API returns 0 games. Go to Steam → Profile → Edit → set games to public (you can switch back to private afterwards).

Development

pytest                          # run all tests
pytest tests/test_score.py -v   # specific module

Metadata

Release files for howl-steam-backlog 0.3.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 howl-steam-backlog 0.3.0
File Size Uploaded
howl_steam_backlog-0.3.0.tar.gz 37.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for howl-steam-backlog 0.3.0
File Interpreter ABI Platform
howl_steam_backlog-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 80.3 kB

Release files / howl_steam_backlog-0.3.0.tar.gz

Download URL howl_steam_backlog-0.3.0.tar.gz
Size 37.4 kB
Tags Source
SHA-256 checksum
How to use checksums
73b99cf6222d8daee1ff82fdb305ef3c349a3390a821449f9e068ced1e804cdd
BLAKE2b-256 checksum
How to use checksums
9bf68063a0ce9fb1793e9522386e39721d1760a7944f34b395c1736b44b32e73
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 Aug 26, 2026.

Transparency log

Release files / howl_steam_backlog-0.3.0-py3-none-any.whl

Download URL howl_steam_backlog-0.3.0-py3-none-any.whl
Size 42.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bd3968cb1a13e3637465f1c29070b37ced05613d9f5da1ac19e2c0213d23c408
BLAKE2b-256 checksum
How to use checksums
ae20f8a9c32c8f311b154c1d5a2a55f9278469495525be48c76584f05d8e0bdf
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 Aug 26, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.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