WhatShouldIPlay is an open source game-picker platform with:
- A GitHub Pages web app for spinning a wheel from a periodically generated top-game feed and user-entered games
- A Rust + Dioxus desktop app with local game scanning and a corresponding spin experience
- Automated data refresh and deployment workflows
Live site:
- Multi-source pool support:
- SteamCharts
- SteamDB (with Steam charts API fallback)
- TwitchMetrics
- itch.io top rated
- Manual game entry
- Desktop-only local scan (Steam manifests + Epic manifests + common Epic/GOG/Ubisoft/Xbox install folders)
- Mode presets (
Balanced Mix,Quick Pick,No Repeats,Owned Focus) - Weighted wheel odds with per-source weighting controls
- Spin history + configurable cooldown to reduce immediate repeats
- Advanced filters (platform, tags, estimated length, release window, price)
- Steam account import using Steam Web API key + SteamID64
- Source-mix random wheel spin with animated result
- Winner popup celebration overlay with odds + source details in both web and desktop apps
- Optional web cloud sync across browsers via a user-provided secret GitHub Gist (unlisted, not private); desktop sync is not implemented
- Progressive Web App support (installable web app + offline shell cache)
- Optional web notifications for trend updates and spin reminders
- Multi-language web UI support (English and Spanish)
- Scheduled data refresh and deterministic static hosting
Implementation and verification status for each capability, including desktop gaps, is in the capability/parity audit. The development plan tracks remaining work.
- Web UI: React 19, TypeScript 5, Vite 7, TanStack Query, Zod
- Data ingestion: Node.js + Cheerio
- Desktop: Rust + Dioxus 0.7 + Reqwest + Scraper
- CI/CD: GitHub Actions + GitHub Pages
.
├─ src/ # Web app source
├─ public/data/ # Generated source dataset consumed by web app
├─ scripts/ # Data ingestion/updater scripts
├─ apps/desktop/ # Rust + Dioxus desktop app
├─ .github/workflows/ # CI/CD automation
└─ docs/ # Contributor and architecture documentation
- Node.js 22.23.3 (see
.nvmrc; Vite 7 requires at least Node 22.12 on this line) - npm 10.9.9 (bundled with the pinned Node release)
- Rust toolchain (for desktop app only)
npm ci
npm run devBuild for production:
npm run buildcd apps/desktop
cargo run --lockedEnable optional shortcut crawling scan:
cd apps/desktop
cargo run --locked --features deep-shortcut-scanConfigure Windows code-signing secrets for CI (requires a .pfx code-signing cert):
.\scripts\set-windows-signing-secrets.ps1 -CertPath "C:\path\codesign.pfx" -CertPassword "your-password"Release build:
cd apps/desktop
cargo build --locked --releasenpm run dev: Start local web development servernpm run typecheck: TypeScript type checkingnpm run build: Build web appnpm run fetch:data: Refresh source data JSONnpm run build:all: Refresh data and build web appnpm run test:unit: Run pure TypeScript regression testsnpm run test:e2e:ci: Run Chromium browser tests against a builtdistnpm run ci:web: Run web CI checks locally
npm run fetch:data and npm run build:all access live providers and rewrite the dataset. Use npm run build for a deterministic build from the committed public/data/top-games.json.
refresh-data.yml: Scheduled source data refresh every 6 hoursdeploy-pages.yml: Web build and Pages deploy onmasterbuild-desktop.yml: Windows/macOS/Linux desktop artifact builds on push/PR tomasterpackage-desktop.yml: Native desktop package build on version tags (v*) and manual runs, with packaged artifacts published to GitHub Releases on tagsrelease-desktop-signed.yml: Enforced Windows signed release pipeline on version tags (v*)web-ci.yml: Web quality checks on push/PR
- SteamDB can block non-browser traffic via Cloudflare.
- The updater attempts direct SteamDB parsing first, then falls back to Steam charts API to maintain continuity.
- Browser environments cannot scan installed local games; local scan is desktop-only.
Earlier versions could include a Steam API key in Gist sync snapshots and retain Steam/GitHub credentials in browser storage. The current local records are rewritten without those credentials when the app starts; imported games and IDs remain. If you used Gist sync with an earlier version, consider rotating the Steam API key. Updating the current Gist file does not remove older revisions, and this application does not delete remote Gist history. GitHub documents Gist revision history. This is a precaution based on the old serialization path, not evidence that anyone accessed a key.
The web app creates or updates whatshouldiplay-sync.json through api.github.com only when you choose a sync action. The snapshot includes settings, named profiles, manual and Steam-imported games and metadata, SteamID64, exclusions, notification preferences, and spin history. Credential fields are omitted. The GitHub token authenticates the API request and remains in page memory only; the Steam API key is also session-only. Reloading requires reentry. Gist ID and non-secret imported game data remain in local browser storage until changed or disconnected.
A secret Gist is unlisted, not private: anyone with its URL can read it. The app does not encrypt snapshots before upload. Disconnect clears the local token, Gist ID, and sync reference without deleting local games or remote Gist content. See GitHub's Gist visibility guidance.
- License: MIT
- Contributor Covenant code of conduct
- Standard issue and pull request templates
- Security disclosure policy
- Governance and support docs
See: