Skip to main content
 ███████╗████████╗███████╗ █████╗ ███╗   ███╗ ██████╗██╗     ██╗
 ██╔════╝╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██╔════╝██║     ██║
 ███████╗   ██║   █████╗  ███████║██╔████╔██║██║     ██║     ██║
 ╚════██║   ██║   ██╔══╝  ██╔══██║██║╚██╔╝██║██║     ██║     ██║
 ███████║   ██║   ███████╗██║  ██║██║ ╚═╝ ██║╚██████╗███████╗██║
 ╚══════╝   ╚═╝   ╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝ ╚═════╝╚══════╝╚═╝
  Launch your Steam games from the command line

CLI utility that launches Steam games straight from the terminal:

  • Automatic game discovery across every Steam install on the machine (native package, Flatpak, extra library drives)
  • Sync mode that keeps the config in line with what's actually installed
  • Launch by name or AppID, via the Steam protocol or directly through the Steam executable
  • Manual add/remove for games Steam itself doesn't know about (e.g. not installed yet)

No required third-party dependencies. Python >= 3.10.


Why

Steam has its own launcher, but if you live in a terminal, alt-tabbing to a GUI just to start a game breaks flow. steamcli skips that — one command, no window switching, no hunting through a library list.

The other reason it's worth having installed: --scan/--sync keep the config in sync with what's actually on disk, across every Steam install and library it can find. Set it up once, re-run it after installing something new, and it just stays current.


Features

1. Automatic Discovery (--scan / --sync)

Locates every Steam installation it can find — including side-by-side setups like a native package plus a Flatpak sandbox — and walks every library of each one (main library + any extra ones on other drives, via libraryfolders.vdf), parsing appmanifest_*.acf for each installed game. Uses a small built-in VDF parser, no third-party dependency.

steamcli --scan                     # auto-detect installed games (add/update only)
steamcli --sync                     # same, but also removes uninstalled games

--sync also removes auto-detected games from the config that are no longer installed. Games you added yourself with --add are never touched by sync. Both can be re-run any time, e.g. after installing or uninstalling something, to refresh the list.

If auto-detection can't find your install (uncommon setup, unusual path):

steamcli --scan --steam-path "D:\SteamLibrary\Steam"

2. Launching

Launch by name or by AppID (name lookup is case-insensitive):

steamcli "Dota 2"
steamcli 570

Two launch methods are supported: via the steam://rungameid/<id> protocol (default, most reliable) or directly through the Steam executable with -applaunch (set launch_method: "executable" in the config). Launching a game that isn't in the config prints a clear error and exits with code 1:

$ steamcli "Half-Life 3"
Error: game "Half-Life 3" was not found in the list of available games.
Check the list with: steamcli --list

3. Manual management (--add / --remove)

For games you want listed before they're installed, or entries you'd rather manage by hand:

steamcli --add "Portal 2" 620       # add a game manually
steamcli --remove "Portal 2"        # remove by name
steamcli --remove 620               # remove by AppID

4. Listing & config

steamcli --list                     # show the list of games, or just run with no arguments
steamcli --config-path              # print the config file path

Config is created automatically on first run (config.json in the OS-standard settings folder); config.yaml is also supported (requires pyyaml and a config.yaml file in the same folder).


Installation

From PyPI

pip install steamcli

Using pipx

pipx install steamcli

Local development install

git clone https://github.com/REvDl/Scripts.git
cd Scripts/cli/SteamCLI
pip install .
# for YAML config support:
pip install .[yaml]

This installs the steamcli command. You can also run it without installing: python -m steamcli ... from the project root.


Configuration

  • Windows: %APPDATA%\steamcli\config.json
  • macOS: ~/Library/Application Support/steamcli/config.json
  • Linux: ~/.config/steamcli/config.json

Example content after steamcli --scan:

{
  "steam_path": {
    "windows": "C:\\Program Files (x86)\\Steam\\steam.exe",
    "linux": "steam",
    "macos": "/Applications/Steam.app/Contents/MacOS/steam_osx"
  },
  "launch_method": "protocol",
  "games": {
    "Counter-Strike 2": { "app_id": 730, "source": "scan" },
    "Dota 2": { "app_id": 570, "source": "scan" }
  }
}

"source" marks where an entry came from: "scan" for auto-detected games (safe to remove via --sync if uninstalled) or "manual" for ones added with --add (never removed automatically).

steam_path is only used by the "executable" launch method (direct -applaunch) — game discovery via --scan/--sync uses separately auto-detected Steam folders (Windows registry, or standard paths on Linux/macOS, including Flatpak).

You can find a game's AppID on its Steam Store page URL, or on SteamDB.


CLI Usage

usage: steamcli [-h] [-l] [-c] [-s] [-S] [-v] [--add NAME APP_ID] [--remove NAME_OR_APPID] [--steam-path PATH] [game]

Launch Steam games from the command line.

positional arguments:
  game                  Game name or AppID to launch, e.g. steamcli "Dota 2" or steamcli 570

options:
  -h, --help            show this help message and exit
  -l, --list            show the list of available games
  -c, --config-path     print the path to the config file
  -s, --scan            auto-detect installed Steam games (via .acf files) and add/update them in the config; existing entries not found on disk are kept as-is
  -S, --sync            like --scan, but also removes auto-detected games that are no longer installed. Games added manually with --add are never removed
  -v, --version         show program's version number and exit

  --add NAME APP_ID     manually add a game to the config: --add "Half-Life 2" 220
  --remove NAME_OR_APPID
                        remove a game from the config, by name or AppID: --remove "Half-Life 2" or --remove 220
  --steam-path PATH     manually specify a Steam install folder, used with --scan/--sync if auto-detection fails

Tech Stack

  • Python 3.10+
  • argparse
  • built-in VDF/KeyValues parser (no dependency)
  • pyyaml (optional, only for config.yaml)

Project structure

steamcli/
├── steamcli/
│   ├── __init__.py
│   ├── __main__.py       # python -m steamcli
│   ├── cli.py             # argparse, entry point
│   ├── config.py          # read/write config.json|yaml
│   ├── launcher.py        # find a game by name/AppID and launch Steam
│   ├── steam_scanner.py   # Steam folder detection + VDF parser + .acf scanning
│   └── ui.py               # shared terminal styling (colors, banner)
├── pyproject.toml
├── LICENSE
└── README.md

Metadata

Release files for steamcli-launcher 1.0.1

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

Source distribution (sdist)

Source distribution for steamcli-launcher 1.0.1
File Size Uploaded
steamcli_launcher-1.0.1.tar.gz 28.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for steamcli-launcher 1.0.1
File Interpreter ABI Platform
steamcli_launcher-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 57.2 kB

Release files / steamcli_launcher-1.0.1.tar.gz

Download URL steamcli_launcher-1.0.1.tar.gz
Size 28.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c4f9bbbdd086c834f41726e38bd0039e0914ff244d928af0015a2614ba3a5af6
BLAKE2b-256 checksum
How to use checksums
e14af406095a4565b141f2e7ebecc96e57c5c8324538cfede0133238e0cc0218
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.4

Release files / steamcli_launcher-1.0.1-py3-none-any.whl

Download URL steamcli_launcher-1.0.1-py3-none-any.whl
Size 28.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22285a742235228f89df954d715cede345661f50a85cc80b56d44a4da1269fbf
BLAKE2b-256 checksum
How to use checksums
22379e5ec44db614a1fc0a91bca9afdd7bde8454ae00bc1ecadded1084033d57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.4

Release history Release notifications | RSS feed

This release

1.0.1 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