• BETA 1.0.0-beta.43
  • WINDOWS + SERVER

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

vStats Teams capture pipelineSeven stages: detect a practice match, keep its ID, fetch the data, queue it on disk, upload it with retries, grade decisions on the server, then show results on the strategy board, VOD and performance screens. The list below describes each step.detect1keep ID2fetch3diskqueue4upload5retrygrade6boardVODperformance7vStats Teams capture pipelineSeven stages: detect a practice match, keep its ID, fetch the data, queue it on disk, upload it with retries, grade decisions on the server, then show results on the strategy board, VOD and performance screens. The list below describes each step.detect1keep ID2fetch3disk queue4upload5retrygrade6boardVODperformance7
  1. Detect a qualifying practice match.
  2. Keep only the match ID during play.
  3. Fetch the match data after the game.
  4. Queue it on disk.
  5. Upload it, retrying until it succeeds.
  6. The server computes stats and grades decisions.
  7. 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 quote

VALORANT and Riot Games are trademarks of Riot Games, Inc. This project is not affiliated with or endorsed by Riot Games.