Pokémon Champions competitive stats & team builder, as a native app for desktop and Android.
Public beta — first release! Built with pure, hardcore vibe-code. Expect rough edges; please report any issue you hit so we can iterate fast.
Download · Screenshots · Quick Start · Features · Known Issues · Data Sources · Architecture · Development
Pokémon Champions launched on 8-Apr-2026 and instantly became the official VGC 2026 / Worlds platform. Usage data is scattered across Pikalytics, Pokemon-Zone, Porygon Labs, Champions Lab, Smogon chaos JSON and Limitless VGC standings. None of these sites share a unified API, and there is no offline-friendly way to browse the meta and build a team in the same place.
VGC Reporter is the tool I wanted while team-building for Regulation M-A: one window, real tournament data, drill-down by Pokémon, and everything cached locally.
- Real tournament data, not just ladder — aggregates Limitless VGC standings into usage stats, with Smogon chaos as fallback when the format is too fresh. Recent Champions tournaments are listed with full decklists rendered inline.
- Format switcher with favorite — Regulation M-A (Champions doubles), Champions Singles, Regulation I, Gen 9 OU. Pin one as favorite so it opens first every time.
- Offline-friendly by design — SQLite-backed HTTP cache, all network I/O on the Rust side, zero CORS pain.
Pre-built installers for the v0.4.1.20260921-beta release:
| Platform | Installer | Notes |
|---|---|---|
| Windows 10/11 | VGC.Reporter_0.4.1_x64_en-US.msi |
MSI installer (recommended) |
| Windows 10/11 | VGC.Reporter_0.4.1_x64-setup.exe |
NSIS installer (portable-friendly) — unsigned; SmartScreen → More info → Run anyway |
| macOS 12+ (Apple Silicon) | VGC.Reporter_0.4.1_aarch64.dmg |
Unsigned — right-click → Open the first time |
| macOS 12+ (Intel) | VGC.Reporter_0.4.1_x64.dmg |
Unsigned — right-click → Open the first time |
| Linux (Debian/Ubuntu) | vgc-reporter_0.4.1_amd64.deb |
Requires webkit2gtk-4.1 |
| Linux (any distro) | vgc-reporter_0.4.1_amd64.AppImage |
chmod +x then run |
| Android 7+ (arm64) | VGC.Reporter_v0.4.1.20260921-beta_android.apk |
Sideload: enable "Unknown sources" first |
→ Download from the latest GitHub Release
First launch downloads ~10 MB of Pokédex / moves / items / abilities and caches them locally; subsequent launches work offline until caches expire.
bun install
bun run tauri:devFirst launch downloads and caches Pokédex, moves, items, abilities and usage stats. Subsequent launches are offline-capable until caches expire.
| Area | What it does |
|---|---|
| Dashboard | Format selector with favorite star, top Pokémon with three switchable visualizations (bar chart, grid, meta-share treemap), Top Items / Moves / Abilities / Tera lists with click-through drill-down, recent Champions tournaments with inline decklists and search-by-player or by-Pokémon (backend-indexed), Twitter cards for @VGCdata / @VGChampStats |
| Pokédex | Sortable by generation / alphabetical / meta usage; click any Pokémon for a large modal with curated competitive sets (Doubles & Singles tabs), live meta usage and type matchups (weak/strong against). Includes the two Basculegion gendered forms (distinct stats) and AZ's Floette-Eternal sprite as the canonical Floette |
| Team Builder | 6 slots with searchable comboboxes for Pokémon / item / ability / nature / Tera / moves, EV sliders + per-stat IV sliders, level / gender / shiny / nickname fields. Pickers are filtered live by the active regulation (only legal species, items and moves shown), and Save runs full validation (completeness, EVs assigned, allow-list checks) surfacing issues in a modal |
| My Teams | Local SQLite persistence with rename / duplicate / delete. Multi-team Showdown paste import and export — pick which teams to bundle, copy to clipboard or download as .txt |
| Top Teams | Tournament-winning teams from Limitless rendered as mini-grids; same backend-indexed search-by-player/by-Pokémon as the Dashboard |
| Search palette | Global Ctrl+K palette with filter chips per kind (Pokémon / moves / items / abilities) — multi-select with a Clear button, also filters the recent-searches list |
| Damage Calc | @smogon/calc Gen 9 with searchable inputs for every field, real items & moves loaded from Showdown |
| External sources | Quick-launch panel for Pikalytics / Pokebase / Pokemon-Zone / Champions Lab / Munchstats (no scraping — just links) |
| Localized data | 5 languages (ES / EN / PT / IT / FR) covering both the UI strings and ability / move / item names and descriptions from PokéAPI, with automatic fallback to English when an upstream string is missing |
| Themes | Light / Dark + custom Sneasler accent palette |
| UX polish | Window opens maximized, splash screen visible from the first frame, language and font size persisted locally, auto-update on desktop & Android |
- Top Teams "Show all" can render 4000+ team cards in a single page. Performance is acceptable but expect 5–15s render on first display; the app shows progressive hints while loading.
- macOS bundles are unsigned. Gatekeeper will block the first launch — right-click the app → Open → Open Anyway. Code signing is on the post-beta roadmap.
- Linux: requires
webkit2gtk-4.1(Ubuntu 22.04+ / Fedora 38+ ship it). Older distros need to install it manually. - Android APK is unsigned (sideload only). Play Store distribution is on the roadmap.
- Android auto-update: the app will notify you when a new version is available and guide you through the install. You still need "Install from unknown sources" enabled.
- First-run cache: first launch needs internet. If a data source is down (Labmaus, Limitless), partial data is still rendered with a warning banner.
- Pikalytics breakdown depends on Pikalytics being up; falls back to Showdown chaos data when unavailable.
Found something else? Open an issue — beta feedback is gold.
| Source | Use | Notes |
|---|---|---|
| Labmaus | Top teams, meta snapshot, trending, upcoming tournaments | Primary for the Champions sets (M-A / M-B) — requires Origin/Referer pinning, injected server-side so no CORS leaks |
| Limitless VGC API | Tournaments, standings, decklists | Authoritative for Champions standings — decklists rendered inline |
| Pokémon Showdown | Pokédex, moves, items, abilities, sprites | Fetched on first run, cached 7 days |
| Smogon chaos JSON | Ladder usage fallback | Slug auto-discovery + rating ladder rewind |
| pkmn/smogon data | Curated competitive sets | Doubles + Singles slugs per format |
| Pikalytics | Per-species doubles breakdown (items, abilities, moves, Tera, teammates, EV spreads) | Surfaced inside the Pokémon detail modal |
| Pokepaste | Importable team pastes | Pastes are immutable — cached 30 days |
| PokéAPI CSV | Localized names & flavor text | 5 languages (EN / ES / PT / IT / FR) for abilities, moves, items — joined with Showdown data; missing per-locale rows fall back to English |
| Showdown dex sprites | Sprite fallback | Variant-aware HD render for Mega/Regional forms |
| pokebase.app | Sprites for Champions-invented Megas | Artwork for the 12 Regulation M-B Megas (e.g. Mega Raichu X/Y) that Showdown's CDN lacks |
Not integrated (no public API): Pokemon-Zone, Porygon Labs, Champions Lab, Pokebase, Munchstats. Exposed as one-click external links — no scraping.
flowchart TD
subgraph FE["React 19 · TS · Vite (webview)"]
Pages[pages] --> Hooks[hooks]
Hooks --> Stores[Zustand stores]
Hooks --> IPC["ipc.ts (typed via ts-rs)"]
I18n["i18next · 5 languages"] -.-> Pages
end
IPC -->|"invoke() · typed JSON"| CMD
subgraph BE["Rust backend · clean architecture"]
CMD["commands/ (thin IPC layer)"]
CMD --> SVC["services/ (use cases)"]
SVC --> DOM["domain/ (pure entities)"]
SVC --> ADP["adapters/ (HTTP clients)"]
SVC --> STO["storage/ (rusqlite + r2d2)"]
ADP --> HTTP["HttpClient + SQLite cache"]
end
HTTP -.-> EXT["External APIs<br/>Labmaus · Limitless · Showdown<br/>PokéAPI · Pikalytics · Smogon · Pokepaste"]
classDef ext fill:#1a1f2e,stroke:#2b86ff,color:#cdd6f4;
class EXT ext;
Rule: dependencies always point inward. domain/ knows nothing about I/O, Tauri or SQLite. All network calls flow through adapters/http_client.rs which writes to the SQLite cache so the frontend never needs to handle rate limits or CORS.
| Frontend | Backend | Build |
|---|---|---|
| React 19 | Rust 2021 | Tauri 2.4 |
| TypeScript | tokio | Vite |
| TailwindCSS | reqwest + rustls | cargo workspace |
| TanStack Query v5 | rusqlite + r2d2 | bun run tauri:build |
| Zustand | serde / thiserror | ImageMagick (icons) |
| React Router v7 | ts-rs | MSI installer (Windows) |
| i18next (5-language UI) | chrono / tracing | |
| Recharts | ||
@smogon/calc |
# Dev mode (Vite HMR + Tauri window)
bun run tauri:dev
# Production bundle → src-tauri/target/release/bundle/msi/
bun run tauri:build
# Android — hot reload in emulator or USB device
bun run tauri android dev
# Android — build APK
bun run tauri android build --apk
# Rust tests + ts-rs bindings regeneration
cd src-tauri && cargo test
# Rust lint
cd src-tauri && cargo fmt && cargo clippy -- -D warnings
# Frontend type-check
bun run --cwd frontend buildPackage manager: this project uses Bun exclusively. Do not use
npm/npx/package-lock.json. SeeCLAUDE.md§ Package manager for the npm→Bun mapping.
VGC-Reporter/
├── frontend/ React 19 + TS + Vite
│ ├── src/
│ │ ├── pages/ one file per route
│ │ ├── components/ layout, pokemon, team, charts, tournament, dashboard, filters, info, ui
│ │ ├── stores/ Zustand (teamBuilder, dashboard, pokedex, filters, ui)
│ │ ├── lib/ ipc, queryKeys, types (ts-rs generated), formatDate, labels, typeChart
│ │ ├── hooks/ query + localization helpers
│ │ ├── locales/ es.json / en.json
│ │ └── i18n.ts
│ └── public/logo.png
├── src-tauri/ Rust backend (clean architecture)
│ ├── src/
│ │ ├── domain/ pure entities
│ │ ├── services/ use cases
│ │ ├── adapters/ HTTP clients
│ │ ├── storage/ SQLite pool, migrations, repos
│ │ └── commands/ Tauri IPC handlers
│ ├── icons/ generated by ImageMagick
│ └── tauri.conf.json
├── assets/logo.png
├── CLAUDE.md project-wide guide
└── README.md
- Node.js 20+
- Rust 1.80+ (stable)
- Desktop: Windows 10/11, macOS 12+, or Linux with
webkit2gtk-4.1 - Android: Android Studio + SDK API 24+, NDK r25c, JDK 17–24,
ANDROID_HOME/NDK_HOMEset; runrustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-androidfirst - First run needs internet access to populate the cache
MIT © 2026 PumaSoft — see LICENSE.






0 comments
log in to comment.