Skip to main content

whattoplay

Pick what to play from the games you already own. whattoplay keeps one cached library from any number of store backends (Steam and Epic built in, anything else as a plugin), tracks what you are playing, queued, finished or dismissed, and looks up prices and bundles. Output is plain text or JSON, so it works equally well from a terminal and as a tool for an AI agent (SKILL.md is the agent-facing guide, in the Agent Skills format).

The tool filters and sorts; choosing a good recommendation is left to you or your agent.

Install

uvx whattoplay --help                 # no install
uv tool install whattoplay            # or install it
uv tool install 'whattoplay[epic,hltb]'    # with Epic support (legendary) and HowLongToBeat times

Python 3.11 or newer.

Set up a store

whattoplay stores                  # what exists, what is enabled, what is missing
whattoplay configure steam         # asks for your Steam Web API key and SteamID64 / profile name
whattoplay configure epic --enable # Epic: `pip install 'whattoplay[epic]'` and run `legendary auth` first
whattoplay refresh                 # fetch every enabled, configured store

Settings are resolved per store from environment variables (also read from <data dir>/.env, created with mode 600) and, for non-secret values, from <data dir>/config.toml:

[stores.steam]
steam_id64 = "76561198000000000"

[stores.epic]
enabled = false

Secrets (API keys, tokens) are only ever read from the environment, never from config.toml. A store that fails to refresh is reported and keeps its previously cached games; the other stores still refresh.

The data directory is --dir, else $WHATTOPLAY_DIR, else ~/.local/share/whattoplay.

Use

whattoplay suggest --limit 20 --genre puzzle     # barely-played games, least played first
whattoplay suggest --min-score 80 --exclude-genre horror --shuffle
whattoplay suggest --max-hours 6                 # short games: looks times up on HowLongToBeat as needed
whattoplay times "Portal 2"                      # time to beat for one game
whattoplay stats                                  # counts and when the library was last refreshed
whattoplay find portal
whattoplay mark steam:620 playing
whattoplay mark --name "Portal 2" finished --note "great"
whattoplay mark epic:Hibiscus dismissed
whattoplay queue                                  # playing + queued
whattoplay library --unmarked --platform steam
whattoplay deals price --title "Hades" --country FI --shop steam   # needs ITAD_API_KEY; add --on-sale for discounted offers only
whattoplay deals bundles --limit 10               # flags games you don't own yet

A game owned on several stores counts once everywhere: marks apply to all copies, and genres or scores missing on one store are borrowed from another. Add --json to any command. Games are addressed as <platform>:<id> or with --name.

Time-to-beat data comes from HowLongToBeat, which has no official API: this uses the unofficial howlongtobeatpy scraper (whattoplay[hltb]), so it can break when the site changes. Lookups are one at a time, about a second apart, capped per call (--lookup) and cached, so each game is requested at most once. Please keep it that way.

Deals use IsThereAnyDeal (free API key in ITAD_API_KEY).

Writing a store plugin

A store is a subclass of whattoplay.stores.base.Store with a name, declared settings and a fetch_library() that returns Game objects. Optionally implement enrich() (genres, scores, cover art, with a persistent cache) and store_url().

Two ways to ship one:

  1. Local file: copy examples/example_store.py to <data dir>/plugins/. It is picked up on the next run.

  2. Package: register the class as an entry point and pip install it:

    [project.entry-points."whattoplay.stores"]
    psn = "whattoplay_psn:PsnStore"
    

A plugin that fails to import is reported by whattoplay stores and never stops the others. Plugins run with your user's permissions, so only install ones you trust.

A PlayStation backend, for example, would implement fetch_library() on top of an existing client library such as psnawp, read its token from a PSN_NPSSO environment variable (declared as a secret Setting), and map trophy/play-time data to Game. A ready-made PlayStation plugin lives in whattoplay-psn (uv tool install whattoplay --with whattoplay-psn).

Using it as an agent skill

Copy or symlink this repository into your agent's skills directory (for Hermes, ~/.hermes/skills/games/whattoplay). Your personal taste and rules (genres to avoid, store restrictions, how readily to recommend purchases) belong in <data dir>/preferences.md, which the skill tells the agent to read, so nothing personal ends up in the repository.

Development

uv sync
uv run pytest
uv run ruff check src tests

License

MIT

Metadata

Release files for whattoplay 1.0.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 whattoplay 1.0.0
File Size Uploaded Provenance Actions
whattoplay-1.0.0.tar.gz 126.9 kB With provenance Details for whattoplay-1.0.0.tar.gz

Built distribution (wheel)

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

Total release size: 153.3 kB

Release files / whattoplay-1.0.0.tar.gz

Download URL whattoplay-1.0.0.tar.gz
Size 126.9 kB
Tags Source
SHA-256 checksum
How to use checksums
f008e4ec55f3eb201e1def5776e726251d2f5f515d764860de99f892ecd19d53
BLAKE2b-256 checksum
How to use checksums
238fb399ca9528d2c3f378a3634026c238f48dd2b979436cdf344bbe88caecfc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 27, 2026.

Transparency log

Release files / whattoplay-1.0.0-py3-none-any.whl

Download URL whattoplay-1.0.0-py3-none-any.whl
Size 26.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
52b652ea56d47e2ef6c58c5c6c668a1b933cc7c84acec2b1270e86b07b3532d9
BLAKE2b-256 checksum
How to use checksums
eadce4bef971b1b0c97daefc2e7c2c97a68ab6703b992dd8d894021d17b01c87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 27, 2026.

Transparency log

Security for whattoplay 1.0.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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for whattoplay-1.0.0.tar.gz

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 Oct 27, 2026.

Transparency log

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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

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