Daniel Son

RLVision/ My magnum opus

Rocket League Vision

My most ambitious project to date: a platform that uses machine learning to break down performance, detect mistakes, and identify mechanics, helping players understand what to work on next. It has reached over 1,000 users!

  • Python
  • Rust
  • AWS
  • Claude Code
  • Codex

How I Built RLVision

Backend / Python

  • Built and deployed a Flask app on AWS Elastic Beanstalk
  • Built player search, replay analysis, pro comparisons, 3D playback, and admin tools
  • Created a shared SQLite/PostgreSQL data layer for player stats, accounts, replay history, ranks, labels, and background jobs
  • Added player search across Steam, Epic, PlayStation, Xbox, and Switch
  • Used stable platform IDs to handle duplicate names and username changes
  • Built asynchronous analysis and maintenance jobs with progress tracking and diagnostics
  • Developed a Ballchasing API client with caching, parallel replay retrieval, and request pacing
  • Added retry handling and provider cooldowns
  • Reduced median cold analysis time from 9.73s to 8.54s
  • Batched historical rank lookups to reduce database reads
  • Reduced SQLite write contention during concurrent updates
  • Added public replay uploads with validation and duplicate handling
  • Added authenticated replay history for users

Rust / Systems Programming

  • Built a Rust replay-processing layer using boxcars and subtr-actor
  • Extracted player, ball, rotation, boost, team, and demolition data
  • Handled actor-ID reuse, respawns, missing boost-pad data, and incomplete replay headers
  • Integrated 28 native gameplay event types
  • Added flip resets, speed flips, wavedashes, air dribbles, passes, kickoffs, and 50/50 detection
  • Synced event timestamps with the 3D viewer timeline
  • Reduced duplicate and overlapping mechanic detections
  • Added version-aware replay reparsing and Python fallback detection
  • Built a Rust diagnostic tool for inspecting replay internals
  • Cross-compiled replay parsers for x86-64 and ARM64 Linux

Machine Learning / Player Analytics

  • Built a player-similarity pipeline using 43 gameplay features
  • Reduced player stats into 10-dimensional embeddings
  • Compared Fisher projections, NCA, and weighted similarity baselines
  • Improved top-three same-player retrieval from 72.5% to 80.4%
  • Implemented weighted PCA from scratch in Python
  • Built a hierarchical playstyle classifier with 9 archetypes and 4 families
  • Created a local coaching insight engine using peer comparisons and percentiles
  • Built professional-player comparison reports
  • Added rank-progression recommendations based on higher-ranked similar players
  • Built a recommendation system using 33 curated training packs
  • Trained a professional pathing model from 261 replays and 52 pro players
  • Processed approximately 407,000 frames and 12,365 boost-pad transitions
  • Exported trained models to JSON for lightweight production inference

Replay Mistake Detection / Model Development

  • Built heuristic detectors for 15 gameplay mistake categories
  • Added trained filters for 14 mistake categories
  • Tested logistic regression, tree ensembles, and gradient-boosted models
  • Built evaluation tools for precision, recall, thresholds, and false positives
  • Created an admin workflow for reviewing and labeling detected mistakes
  • Stored feature vectors, model scores, rejection reasons, and replay context
  • Added label import, export, reporting, and feature-backfill tools
  • Added safeguards to prevent incomplete or incompatible models from replacing production models

3D Replay Viewer

  • Built an interactive Three.js replay viewer
  • Rendered players, ball, boost pads, team colors, goals, and demolitions
  • Added interpolated movement and quaternion rotations
  • Built Free Fly, Bird’s Eye, Follow Ball, Follow Player, and Director cameras
  • Added player-perspective camera views
  • Built synchronized playback controls and timeline scrubbing
  • Added variable playback speed, scores, player labels, and boost meters
  • Added mechanic timelines with click-to-seek navigation
  • Built mistake cinematics that rewind and highlight gameplay decisions
  • Added positioning and pathing guidance during mistake reviews
  • Added keyboard shortcuts, touch controls, and responsive layouts

Frontend / UI and UX

  • Built the frontend with JavaScript and Jinja templates
  • Created player search, stat cards, coaching panels, player profiles, and replay previews
  • Added profile, statistics, and replay tabs
  • Added URL-based state and browser-history support
  • Built pro-player discovery cards and expandable profiles
  • Added radar charts and percentile comparisons
  • Added rank comparisons from Bronze through Supersonic Legend
  • Created a reusable dark-mode design system
  • Added responsive layouts and archetype-based accent styling
  • Improved keyboard accessibility and touch support
  • Added reduced-motion support
  • Improved repeat loading with caching and preloading
  • Added frontend retries for temporary API and network failures

Rank Services / Account Management

  • Integrated current-rank lookup through PsyNet
  • Added rank caching and failure cooldowns
  • Stored historical ranks from replay uploads and data collection
  • Separated current rank from match-time rank
  • Built rank-based comparison cohorts
  • Added automatic Epic credential renewal
  • Stored rotated credentials in AWS Secrets Manager
  • Implemented Google OAuth, Epic OAuth, and Steam OpenID
  • Added password-based accounts and email confirmation
  • Added password recovery and identity linking
  • Added ownership-conflict protection
  • Created separate administrator and playtester roles

Security

  • Stored application credentials using AWS Elastic Beanstalk secret references
  • Supported plain and JSON-wrapped secret formats
  • Hashed passwords with PBKDF2-HMAC-SHA256 and unique salts
  • Used constant-time password verification
  • Configured signed Flask sessions
  • Added HttpOnly and SameSite cookie protections
  • Built per-IP sliding-window API rate limiting
  • Added endpoint-specific and global request limits
  • Added Retry-After headers and automatic bucket cleanup
  • Protected administrator login with failed-attempt limits and lockouts
  • Configured trusted-proxy handling for client IP resolution
  • Added request-body and field-size limits
  • Validated search and API parameters
  • Used parameterized SQL queries
  • Added X-Content-Type-Options and X-Frame-Options headers
  • Added structured API error handling

External Integrations / Data

  • Maintained a curated database of 60 professional Rocket League players
  • Stored platform identities, portraits, Liquipedia pages, and playstyle overrides
  • Integrated Ballchasing for pro-player and coach verification
  • Built cached Liquipedia scraping for player profiles and championship results
  • Added thread-safe caching and User-Agent configuration
  • Integrated SMTP email for contact forms, email confirmation, and password recovery
  • Added Plausible analytics
  • Organized rank icons, platform assets, and player portraits

DevOps / Deployment / Testing

  • Built an Elastic Beanstalk deployment bundler
  • Packaged Python code, frontend files, models, nginx config, and Rust binaries
  • Added a deployment mode using a bundled SQLite snapshot instead of live RDS
  • Built database snapshot export tooling
  • Excluded account and authentication data from public snapshots
  • Configured nginx upload limits
  • Added application health checks
  • Organized Python dependencies into runtime, development, and ML groups
  • Built Python, JavaScript, and Rust regression tests
  • Tested replay parsing, authentication, caching, concurrency, mechanics, and identity resolution
  • Automated Python tests and Ruff checks with GitHub Actions
  • Built offline and live benchmark tools
  • Added CPU profiling and recorded API-response testing
  • Added reproducibility metadata for models and replay parsers

Earlier Gemini Integration / AWS Security

  • Migrated a Gemini API key from environment variables to AWS Secrets Manager
  • Configured least-privilege IAM access for the Elastic Beanstalk instance role
  • Debugged a production-only Gemini authentication failure
  • Traced secret injection and ARN/JSON-key mappings
  • Fixed differences between local and cloud configuration
  • Added optional Gemini-based insight rewriting
  • Added structured response validation, timeouts, and diagnostic logging