vStats Teams: practice data, decision grading and a strategy board for competitive teams
A Windows app and backend that capture a team's practice-match data, grade every kill and death, and keep the team's playbook in one place.
- Role
- Designed and built (desktop app and backend)
- Type
- Own product, Windows app + server
- Status
- Beta, 1.0.0-beta.43; subscriptions are opening soon
- Platform
- Windows
The problem
Competitive teams practise in private custom games that don't appear in public match history. Coaches copy stats by hand, scrub through long stream recordings to find rounds, and keep strategies in scattered drawings and spreadsheets. They needed one tool that captures every practice match automatically, explains the value of each decision, lines the video up with the match data, and keeps each map's preparation in one place, with the right permissions for every role.
What I built
I designed and built a Tauri 2 desktop app (Rust core, React 19 + TypeScript interface) and its Node/Express + PostgreSQL backend. While the team plays, the app watches the local game client, read-only. When it sees a full five-a-side custom game, it keeps just the match ID. Afterwards it fetches and uploads the match data, retrying from disk until it gets through. It captures match data, not video. The server computes per-round stats and grades every kill, death, plant and defuse. The app adds a strategy board, a VOD review lab and role-based permissions.
Highlights
CAPTURE
Automatic practice-match capture.
Only qualifying custom games are kept. Unsent uploads wait on disk and retry with back-off, so a lost connection never loses a match.
SCORING
Decision grading.
Rules for trades, opening duels, clutches, saves and throws give every event one of 8 tiers, from brilliant to blunder, in the style of chess-engine move ratings. Each player gets a 0–100 decision score, and stored analyses recompute automatically when the rules change.
VOD SYNC
Video lined up by reading the timer.
The Rust side captures the video player's area of the screen and reads the on-screen round timer with a custom digit reader, then lines the YouTube stream up with the match rounds, including streams that cover several maps.
EDITOR
A strategy drawing board.
12 tools (arrows, zones, vision cones, barriers and more), up to 7 phases per strategy, and server-side validation of every board.
ACCESS
Roles and team data.
6 roles (manager, coach, analyst, IGL, player, sub) with a permission table. Private matches are visible only to staff, and uploads are de-duplicated per team.
BILLING
Trials and subscriptions.
Free-trial applications reviewed by hand, and a Stripe subscription path whose webhook sets the team's access with a grace period. Subscriptions are opening soon.
How it works
- Detect a qualifying practice match.
- Keep only the match ID during play.
- Fetch the match data after the game.
- Queue it on disk.
- Upload it, retrying until it succeeds.
- The server computes stats and grades decisions.
- Results appear in the performance, strategy and VOD screens.
Stack
- Tauri 2
- Rust
- tokio
- rustls
- keyring
- Windows screen capture
- React 19
- TypeScript
- Vite
- Vitest + Testing Library
- Node.js/Express
- PostgreSQL
- Redis
- Stripe
- YouTube Data API
- spreadsheet import
By the numbers
- ~28,900lines in the desktop app
- 71interface-to-core commands
- 53team API routes
- 6Postgres migrations
- 35 + 43Rust tests + interface tests
- 10server test files
Outcome
In public beta (1.0.0-beta.43) and available to download for Windows at vstats.xyz/download/teams, with signed in-app updates that install when the user chooses. Paid subscriptions are opening soon.
Need something like this? Get a free quote.
Get a free quoteVALORANT and Riot Games are trademarks of Riot Games, Inc. This project is not affiliated with or endorsed by Riot Games.