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