So I built Steam Wishlist Pulse, a small 4 mb single binary that has a nice web dashboard (rust / svelte / sqlite) and works prefect even on a RPI:
- Track wishlist changes over time - Spot spikes and unusual activity - Get clearer visibility into trends - Get notifications via Discord & Telegram
Itβs still early, but itβs already helping me correlate wishlist changes with various events such as marketing etc.

A wishlist monitoring tool for game developers publishing on Steam.
Stop refreshing Steamworks. Wishlist Pulse syncs your complete wishlist history from Steam's official Wishlist Data API, detects anomalies in real time, and pushes what matters β adds, removes, purchases, gifts, regional surges β straight to Telegram and Discord. Spot the impact of a trailer drop within hours, catch unexpected regional spikes after an influencer mention, and build a full timeline of every game you're tracking β all without opening Steamworks once.
Single binary (~4 MB) for Windows, macOS, and Linux (including ARM). Built-in web dashboard with charts and anomaly highlights, SQLite storage, minimal RAM β runs happily on a Raspberry Pi.
1. Install:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/hortopan/steam-wishlist-pulse/releases/download/v0.1.9/wishlist-pulse-installer.sh | shOr via Homebrew, Docker, or download a binary.
2. Run it:
wishlist-pulse3. Open http://localhost:3000 β the setup wizard will ask for your Steam Financial API Group Web API Key and walk you through the rest. (Steamworks β Users & Permissions β Manage Groups β create a Financial API Group with General and Financial permissions)
That's it. Telegram and Discord bots are optional β add them later from the dashboard.

A built-in admin panel served from the same binary β no separate deploy:

By default, every wishlist change triggers a notification. If that's too noisy, switch to Anomalies only mode β you'll only be notified when the change is statistically unusual compared to recent history.
| Mode | Behaviour |
|---|---|
| Every update | Notify on every change (default). Anomalous metrics are still highlighted |
| Anomalies only | Notify only when unusual activity is detected. Normal changes are recorded silently |
When anomaly detection doesn't have enough history yet (fewer than 3 snapshots), it falls back to notifying on every change so you never miss early data.
All presets are one-click selectable from the dashboard's Alerts tab:
| Preset | Lookback | Sensitivity (up/down) | Min absolute | MAD floor | Best for |
|---|---|---|---|---|---|
| Relaxed | 14 days | 3.0 / 3.0 | 10 | 10% | Noisy games with frequent churn |
| Balanced | 14 days | 2.0 / 2.0 | 5 | 5% | Good default for most games |
| Sensitive | 7 days | 1.5 / 1.5 | 2 | 2% | Low-traffic games or early warnings |
| Very Sensitive | 7 days | 1.0 / 1.0 | 1 | 0% | Critical monitoring β flags nearly any deviation |
| Custom | β | β | β | β | Full manual control over all parameters |

The detector uses a modified z-score (Median + MAD) over the lookback window. Each metric β adds, deletes, purchases, gifts β is evaluated independently, with separate sensitivity thresholds for upward spikes and downward drops. Country-level anomalies are detected too, so you can spot regional surges after a localized event.
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/hortopan/steam-wishlist-pulse/releases/download/v0.1.9/wishlist-pulse-installer.sh | sh
brew install hortopan/tap/wishlist-pulse
docker run -p 3000:3000 -v wishlist-pulse-data:/data ghcr.io/hortopan/steam-wishlist-pulse:latest
Multi-arch image (amd64/arm64) available on GitHub Container Registry.
Prebuilt binaries for all platforms are available on the Releases page:
| Platform | File |
|---|---|
| Apple Silicon macOS | wishlist-pulse-aarch64-apple-darwin.tar.xz |
| Intel macOS | wishlist-pulse-x86_64-apple-darwin.tar.xz |
| x64 Windows | wishlist-pulse-x86_64-pc-windows-msvc.zip |
| ARM64 Linux | wishlist-pulse-aarch64-unknown-linux-musl.tar.xz |
| x64 Linux | wishlist-pulse-x86_64-unknown-linux-musl.tar.xz |
Requires Rust toolchain and Node.js.
git clone git@github.com:hortopan/steam-wishlist-pulse.git
cd wishlist-pulse-bot
cargo build --release
./target/release/wishlist-pulse
Options can be set via CLI flags, environment variables, or both (passwords are env-only):
| Flag | Env Var | Default | Description |
|---|---|---|---|
--bind-web-interface |
BIND_WEB_INTERFACE |
0.0.0.0:3000 |
Web UI address |
--database-path |
DATABASE_PATH |
~/.local/share/wishlist-pulse/data.db |
SQLite database location |
| β | ADMIN_PASSWORD |
(set via UI) | Admin password (env only) |
| β | READ_PASSWORD |
(set via UI) | Read-only password (env only) |
--poll-interval-minutes |
POLL_INTERVAL_MINUTES |
5 |
Steam polling interval |
--insecure |
β | false |
Disable HTTPS cookie requirement (dev only) |
| β | ENCRYPTION_SECRET |
(none) | Passphrase for encrypting sensitive data at rest |
Everything else β API keys, Telegram config, tracked games β is managed through the dashboard.
By default, session cookies are marked Secure and require HTTPS. If you're accessing the dashboard over plain HTTP (e.g. locally, on a LAN, or in a test environment), the login page will let you know. You have two options:
Put the app behind an HTTPS reverse proxy (nginx, Caddy, etc.) β recommended for any internet-facing setup.
Start with --insecure to allow cookies over plain HTTP:
wishlist-pulse --insecure
API keys, bot tokens, and other secrets you enter through the dashboard are stored in the SQLite database. By default they are stored in plaintext. Set ENCRYPTION_SECRET to any strong passphrase and all sensitive values will be encrypted with AES-256-GCM before being written to disk. This is strongly recommended β especially if the database file lives on shared storage or is included in backups. The secret is used to derive an encryption key via HKDF-SHA256; changing it later will require re-entering your stored credentials.
| Command | What it does |
|---|---|
/track <app_id> |
Start tracking a game |
/untrack <app_id> |
Stop tracking a game |
/list |
Show all tracked games |
/subscribe |
Subscribe a channel to a game's updates |
/unsubscribe |
Unsubscribe from a game |
/subscriptions |
List active subscriptions |
/status |
Check bot and polling status |
/whoami |
Show your user ID (Discord only) |

Steam wishlists are the closest thing indie developers have to a demand signal before launch. They're a leading indicator of first-week sales (industry median ~10% wishlist-to-sales conversion), and wishlist velocity β the rate wishlists change β is often more predictive than the total count alone. Every wishlister also receives email notifications on launch day and during 20%+ sales, making your wishlist count functionally a platform-native mailing list you can't afford to ignore.
The problem is that Steamworks' Wishlist Reporting updates a few times per day, but at unpredictable times. After a trailer drop, a festival demo, or an influencer mention, you end up refreshing the stats page dozens of times hoping to catch movement.
In March 2026, Valve opened the GetAppWishlistReporting API, providing programmatic access to wishlist adds, deletes, purchases, gifts, plus country and language breakdowns.
Wishlist Pulse sits on top of that API. It polls for each of your tracked games, diffs against the last snapshot, and notifies you on Telegram and Discord whenever something changes. It uses the same data Valve publishes β it won't get you numbers any faster than Steam makes them available β but it means you stop refreshing and the data comes to you. Plus, every snapshot is stored locally, so you build up a full history for spotting trends, measuring event uplift, and tracking velocity over time.
A single Rust binary running four concurrent subsystems: a polling loop that diffs wishlist snapshots, a Telegram bot and a Discord bot for commands and notifications, and a web server serving the embedded Svelte dashboard. All data lives in SQLite (WAL mode) β no external database needed.
| Backend | Rust β Axum, Teloxide, Serenity, rusqlite |
| Frontend | Svelte + TypeScript (Vite), embedded at compile time via rust-embed |
| Auth | Argon2 + JWT |
MIT β see LICENSE for details.