A free Progressive Web App (PWA) for Nintendo Switch 2 collectors — track your physical library by region, edition and format with daily auto-updated game data.
🔗 Live app: codemaverick-hub.github.io/switch2-tracker
❤️ Support: patreon.com/c/switch2tracker
- Platform badges — clearly shows Switch 2 Only vs Switch 1 & 2 (NS2 Edition) for every game
- Box art — fetched from Nintendo EU, loading incrementally each daily run
- Per-region formats — knows whether a game is a Physical Cart, Game-Key Card or Digital Only in each specific region (e.g. full cart in West, GKC in Japan)
- Editions — Standard, Deluxe, Limited, Collector's tracked per region (from NSCollectors sheet)
- Regional release dates — per-region date chips for USA / EUR / JPN / AUS / KOR / CHT / ASI
- Filters — search, type, platform, status, format, region, ownership, genre
- Global quick buttons: Own (physical) · Own (digital) · Wishlist
- Per-region ownership — expand any physical game to track regional copies separately with rating board shown (ESRB / PEGI / CERO / ACB / GRAC / CSRR)
- Per-edition ownership — track Standard, Deluxe, Limited and Collector's editions independently per region
- Physical disabled for digital-only titles — no phantom "Own (phys)" button on digital games
- All state saved to
localStorage— survives page refreshes, works offline
- All 7 official Switch 2 models including Japan-only variants with accurate pricing
- 17 official Nintendo accessories across controllers, storage, cases and dock
- PWA — installs on phone or desktop, works fully offline via service worker
- Daily auto-updates via GitHub Actions (06:00 UTC) — app shows a refresh banner when new data is available
- Zero dependencies — single
index.html, no frameworks, no build step
r/NSCollectors Release Details tab ← per-region Card Type + Editions (highest priority)
r/NSCollectors Release Summary tab ← per-region release dates
Wikipedia ← publisher, developer, game type
Nintendo Europe search API ← box art image URLs (40 new per daily run)
data/overrides.json ← manual corrections (override everything)
switch2-tracker/
├── index.html ← App (single-file PWA)
├── manifest.json ← PWA metadata
├── sw.js ← Service worker (offline + update detection)
├── icons/
│ ├── icon-192.png
│ └── icon-512.png
├── data/
│ ├── games.json ← Auto-generated by scraper (committed daily)
│ └── overrides.json ← Manual format/region/note corrections
├── scripts/
│ └── scrape.py ← Multi-source scraper
└── .github/
└── workflows/
└── update-games.yml ← Daily automation
NSCollectors Sheet (Details + Summary tabs)
+
Wikipedia
+
Nintendo EU search API
│
│ daily at 06:00 UTC (or manually via Actions tab)
▼
GitHub Actions → scripts/scrape.py
│
│ • Fetches per-region Card Type + Editions from NSCollectors Details tab
│ • Fetches per-region release dates from NSCollectors Summary tab
│ • Merges publisher/developer/type from Wikipedia
│ • Fetches box art URLs from Nintendo EU (up to 40 new per run, cached)
│ • Applies data/overrides.json (highest priority)
│ • Safety guard: never overwrites with 0 games if all sources fail
│
▼
data/games.json (committed only if changed)
│
▼
PWA fetches on load → service worker caches → green banner on update
Upload all files to a new public GitHub repo.
Settings → Pages → Source: branch main, folder / (root)
Your app will be live at https://yourusername.github.io/your-repo-name/
Actions are enabled by default. To trigger manually:
Actions → Update Switch 2 Game Data → Run workflow
pip install requests beautifulsoup4
python scripts/scrape.py
git add data/games.json
git commit -m "chore: initial game data"
git pushEdit data/overrides.json — keys match by normalised substring:
{
"Game Title Here": {
"fmt": "k",
"region": "var",
"note": "GKC in Japan; physical cart in West"
}
}Format codes: c = Physical Cart · k = Game-Key Card · d = Digital Only · ? = TBA
Region codes: ww = Worldwide · jp = Japan Only · var = Varies by Region
Edit .github/workflows/update-games.yml:
- cron: '0 6 * * *' # daily at 06:00 UTC (default)
- cron: '0 6 * * 1' # weekly, every Mondaypip install requests beautifulsoup4
python scripts/scrape.pyThe service worker caches the app shell on first load. When offline:
- App opens normally from cache
- Collection data is always available (localStorage)
- Game data falls back to last cached
games.json
When back online, fresh data is fetched silently in the background.
If the tracker has been useful, consider supporting it on Patreon — it helps keep the app free and ad-free.