A local-first Steam CLI designed for LLM/tool workflows.
This project is intentionally not a "smart recommender". Instead, it exposes a set of stable primitives so an LLM (or any automation) can:
- discover the right tags / genres / categories
- compose Steam Store searches
- fetch structured app details
- optionally enrich with a user's library + playtime (Steam Web API)
Steam has great data, but it's scattered across:
- Steam Store endpoints (search + app details)
- Steam Web API (user/library)
- community-driven dictionaries (genres/categories)
This CLI normalizes that into a small, predictable interface:
- human-readable output by default
- machine output via
--json/--format json - fast local search for tags/genres/categories via SQLite + FTS5
- LLM-friendly primitives (no "magic")
- Stable JSON envelope (
ok,data,pagination,meta,error) - Fast local lookup for:
- Steam Tags (id <-> name)
- Genres (id <-> name)
- Categories/Features (id <-> name; e.g. Local Co-op)
- Steam Store search by tag IDs
- optional facet extraction (related tags)
- Steam app details via
appdetailswith caching (TTL) - User owned games + playtime (optional; requires Steam Web API key)
cargo buildList and search tags:
steam-cli tags list --limit 20
steam-cli tags find "pixel graphics" --limit 10Search the Steam Store using tag IDs:
steam-cli search --tags 3964,4182 --limit 25
steam-cli search --tags 3964 --with-facets --limit 25Fetch app details (cached):
steam-cli app 413150
steam-cli app 413150 --ttl-sec 86400(Optional) Load user library + playtime:
export STEAM_API_KEY="your_key_here"
steam-cli user owned --vanity gaben
steam-cli user owned --steamid 76561197960287930 --limit 50steam-cli tags list [--limit N] [--offset M]
steam-cli tags find <query> [--limit N] [--offset M]steam-cli genres list [--limit N] [--offset M]
steam-cli genres find <query> [--limit N] [--offset M]steam-cli categories list [--limit N] [--offset M]
steam-cli categories find <query> [--limit N] [--offset M]steam-cli search --tags <id1,id2,...> [--term text] [--limit N] [--offset M] [--with-facets]Notes:
- Search uses Steam Store endpoints and currently parses HTML results.
--with-facetsextracts related tag IDs from the response (useful for iterative discovery).
steam-cli app <appid> [--ttl-sec 86400]steam-cli user owned --steamid <id> [--limit N] [--offset M]
steam-cli user owned --vanity <name> [--limit N] [--offset M]steam-cli install-skill [--source <path>] [--providers <csv|*>] [--scope <project|user>] [--method <symlink|copy>] [--project-root <path>] [--force]Notes:
- If
--providers,--scope, or--methodare missing, the command prompts interactively. - Provider selection prompt supports keyboard multi-select (up/down + space + enter).
- Interactive flow order: providers -> scope -> method -> summary -> confirm.
projectscope defaults to current working directory unless--project-rootis provided.- Fully non-interactive mode: provide
--providers,--scope, and--method. - Providers that share
.agents/skillsare normalized touniversalautomatically.
steam-cli tags list --json
steam-cli search --tags 4182,9 --format jsonAll JSON output uses a stable envelope:
{
"ok": true,
"data": {},
"pagination": {
"limit": 25,
"offset": 0,
"returned": 25,
"has_more": true,
"total": null
},
"meta": {
"version": "1.0.0",
"source": "steam_store",
"cached": false
},
"error": null
}meta.source values:
local_dbsteam_storesteam_webapiinternal
The CLI uses a small SQLite database containing tags/genres/categories:
- Runtime location:
~/.steam-cli-rs/steam.db - Search engine: SQLite FTS5
The seed DB is embedded from assets/steam.db and copied to ~/.steam-cli-rs/steam.db if it does not exist.
steam-cli user owned requires:
STEAM_API_KEYenvironment variable- User profile "Game details" visibility set to Public:
Regenerate the seeded DB from JSON dictionaries:
cargo run --bin dev_seed_db- No built-in recommendation engine
- No server component
- No attempt to fully mirror SteamDB datasets