Skip to main content

Steam Idle Bot — farm playtime and trading-card drops on autopilot

Python 3.12+ uv-managed 406 tests passing mypy clean MIT license English docs Docs em Português

Farm Steam playtime and trading-card drops on autopilot. Steam Idle Bot syncs your library, idles only the games that still have cards to drop, and remembers what's already finished — so every run scans less and starts faster. Live terminal dashboard, web UI, two interchangeable idling backends with automatic fallback.


Why it's different

Most idlers blindly run every game forever. Steam Idle Bot is accurate and self-pruning:

🎴 Drops only where it matters Detects which games have trading cards and how many drops remain — idles just those, never wasting a slot on a drained game.
🧠 Learns over time Persistent no-drop caches record fully-farmed games; short-lived positive caches avoid re-scraping active games every refresh.
🔐 Accurate by design Verifies the Steam web session is genuinely logged in before trusting it; auto-recovers a valid session from a browser you're signed into.
🖥️ Readable output Live panel of game names, cards remaining and idle time; structured session report + optional JSON/Markdown checkpoints.
🔁 Two backends, one interface Built-in Python client (Steam Guard / 2FA) or a local steam-utility install — with transparent fallback if one fails.
🔄 Rotates when cards drain Inventory snapshots can prove a game dropped all known remaining cards before badge pages catch up, so refreshes can replace it mid-session.
⚡ Modern & tested uv-managed, fully typed, 560 tests across Python 3.12–3.14.

Quick start

# 1. Install uv (if needed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 2. Clone & install
git clone https://github.com/bernardopg/steam-idler-python.git
cd steam-idler-python
uv sync

# 3. Configure (never commit the filled .env)
cp .env.example .env
#    edit .env → USERNAME, PASSWORD, and ideally STEAM_API_KEY

# 4. Preview without contacting Steam
./run.sh --dry-run

# 5. Run it — terminal, or ./run-web.sh for the web UI
./run.sh

💡 A free Steam Web API key unlocks automatic library sync and badge-based filtering. Without it the bot still runs — it just can't filter as precisely.


How it works

The orchestrator wires a configuration layer to a swappable idling backend and three card services, then drives a refresh loop that tracks drops as they drain.

Architecture: entry and config feed the SteamIdleBot orchestrator, which drives a swappable backend and three card services, with results tracked by IdleTracker

Game selection is a funnel — each stage narrows the set, capped at Steam's hard limit of 32:

Pipeline: library source, then has-cards filter, then drops-remaining filter, then exclusions and cap to 32 games


Common commands

./run.sh                              # run normally (terminal)
./run.sh --dry-run                    # print config + chosen games, no Steam contact
./run.sh --no-trading-cards           # skip trading-card filtering
./run.sh --max-games 10               # cap idled games
./run.sh --refresh-interval-seconds 300   # re-run selection every 5 min
./run.sh --checkpoint-minutes 5 --duration-minutes 25  # timed run + JSON/MD checkpoints
./run.sh --stop-app-ids "570,730"     # stop steam-utility idles for those App IDs and exit
STEAM_IDLE_SKIP_SYNC=1 ./run.sh       # skip the runner's preflight uv sync
STEAM_IDLE_RUNNER_VERBOSE=1 ./run.sh  # show uv sync output while preparing the environment

./run.sh keeps the Python bot out of a shell pipeline so Ctrl+C reaches it directly, writes bot output to logs/runs/run_*.log, and prints a short startup/exit banner. By default it clears stale exported Steam Idle Bot environment overrides so .env wins; set STEAM_IDLE_PRESERVE_ENV=1 when you intentionally want exported variables to override .env.

Full flag and setting reference: USAGE guide.


Configuration

Settings come from environment variables / a .env file (copy .env.example). The two required values are USERNAME and PASSWORD; everything else has sane defaults.

Key Default Purpose
STEAM_API_KEY — Library sync + badge filtering (recommended)
IDLING_BACKEND python python or steam_utility
MAX_GAMES_TO_IDLE 30 Cap (Steam hard limit: 32)
REFRESH_INTERVAL_SECONDS 600 How often the selection pipeline re-runs
CHECKPOINT_MINUTES 0 Write JSON/MD checkpoints every N min (0 = off)
DURATION_MINUTES 0 Stop after N min (0 = run until interrupted)
POST_RUN_VERIFY_SECONDS 0 Re-scrape card counts N s after stopping
AUTO_BROWSER_COOKIES true Recover a community session from a logged-in browser

🔐 Card-drop filtering needs an authenticated web:community session. See the authentication & accuracy guide.


Documentation

🇺🇸 English 🇧🇷 Português (BR)
Full guide README README
Command sheet USAGE USAGE
Security SECURITY SECURITY
Roadmap & backlog BACKLOG BACKLOG

Requirements

  • Python 3.12+ — managed for you by uv
  • A Steam account with games that have trading cards
  • Steam Web API key (recommended) — library sync + badge data
  • For drop filtering — an authenticated Steam web session

Contributing

Contributions welcome in both languages. Run uv run ruff check . && uv run mypy src && uv run pytest -q before opening a PR. See the developer guides: 🇺🇸 English · 🇧🇷 Português. The prioritized roadmap lives in BACKLOG.md.

License

MIT — see LICENSE. Not affiliated with Valve. Use responsibly and follow Steam's Terms of Service.

Metadata

Release files for steam-idle-bot 1.0.3

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

Source distribution (sdist)

Source distribution for steam-idle-bot 1.0.3
File Size Uploaded
steam_idle_bot-1.0.3.tar.gz 312.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for steam-idle-bot 1.0.3
File Interpreter ABI Platform
steam_idle_bot-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 383.3 kB

Release files / steam_idle_bot-1.0.3.tar.gz

Download URL steam_idle_bot-1.0.3.tar.gz
Size 312.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a3b0216168386da1acd7bc40a7c65c9b5b58bc264a459a7a8c244ed85385c039
BLAKE2b-256 checksum
How to use checksums
8a0c550ebf78d8e042a47f1ac1dd91612c4ce4b8b53032e413b06a849a069758
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 Oct 14, 2026.

Transparency log

Release files / steam_idle_bot-1.0.3-py3-none-any.whl

Download URL steam_idle_bot-1.0.3-py3-none-any.whl
Size 71.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7aad137f09e4315cd76868038bb128873361037aca7ffd88f0a27900e46b8f2f
BLAKE2b-256 checksum
How to use checksums
1d974b6dee37b60a1516541c0833e7891d7504997a7d3b3f4a9064f677da0645
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 Oct 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

2 release files

1.0.1

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