very avg comp science student… also likes grapes. Ex-ASE @accenture

Joined May 2026
will be treating this as a version control for my brain
11
We checked if DCR was simply capturing straight-line speed. Correlation with traditional metrics: 40-yard dash: rho = +0.06 10-yard split: rho = -0.05 Vertical jump: rho = -0.11
2
When we mapped pre-draft Combine movement to rookie NFL separation, the signal was unmistakable: Spearman = -0.645 (p = 0.0002, N=28 WRs) Receivers with high DCR (jagged directional shifts) struggled to separate as rookies. Fluid movers consistently won on routes.
2
In a penalized Ridge regression model predicting rookie separation: Traditional Combine metrics: R^2 = 0.064 Tracking metric (DCR): R^2 = 0.173 (2.7× more explanatory power) Combined: R^2 = 0.242 Tracking data meaningfully expands what scouts can explain before draft day.
1
Stopwatches compress movement; 10 Hz tracking captures 40+ spatial snapshots per drill. engineered a kinematic metric: direction_change_rate (DCR)
To study this, we built an end-to-end tracking pipeline across 510 Combine prospects and 463,000+ tracking frames: Input: 10 Hz Combine Short Shuttle tracking (predraft) Target: Rookie NFL regular-season separation at forward pass (mean_separation)
3
NFL front offices are in love with 4.3 40-yard dash times. “fast” receivers fail to create separation For the @NFL Big Data Bowl, analyzed 10 Hz tracking data to measure what the stopwatch leaves out: Route Ready Movement Quality.
1
34
A stopwatch only records the finish line: route-running isn’t straight-line sprint speed. It’s: Deceleration into the break Hip drop & redirection Clean re-acceleration without losing momentum Two WRs can run the exact same 4.42s dash with wildly different movement mechanics.
6
Serverless Postgres I scrapped the flatfile JSON architecture and migrated the entire backend (both REST and Socket.IO events) to a Serverless PostgreSQL DB on @neondatabase.
1
Refactored the Node.js API to use async/await with the pg driver, but wrote a smart fallback that still uses local JSON disk-writes when DATABASE_URL is missing (for local dev).
The Ephemeral Disk I deployed to Render, but records still disappeared after a few hours. Turns out, Render's Free Tier spins down after 15 mins of inactivity. When a free web service sleeps, it completely wipes its ephemeral disk.JSON database was nuked by the cloud provider.
Bug 2: The Stale React State To stop players from overriding each other based on display names I built a secure UUID deviceId system using Zustand + LocalStorage. But the API kept throwing 400 Bad Requests
1
Because my React Single Page App had been open in my dev environment for 5+ days straight! The browser never refreshed, so the new Zustand hydration logic never fired, meaning deviceId was undefined in memory. Fix: A literal F5 browser refresh. 🤦‍♂️
Bug 1: The Git Reset I originally built the DB as a flat leaderboard.json file. The problem? The file was tracked by Git. Every time the server synced or restarted, Git violently overwrote production data with the old 5 records from my repo history.
1
Fix: Added it to .gitignore and aggressively purged it from the index using git rm --cached.
The Global Leaderboard in KLUSTOR is now permanent huge update that securely tracks your unique device ID and persists your fastest laps to a live cloud database. No more lost runs. If you set a world record, it stays there forever. Try it here: klustor.vercel.app
1
I reworked thread navigation around three separate layers of state: Repository state → Thread state → Message state Messages are cached by thread ID. So switching: → Thread B → Thread A doesn't require rebuilding everything from scratch.
1
5
I also added request cancellation / stale-response protection so an old request can never overwrite the currently active thread. The result: thread switching feels much more direct.
4
The biggest issue was asynchronous requests racing each other. Click Thread A → request A starts Click Thread B → request B starts Request B finishes → UI shows B Request A finishes later → UI overwrites the state
1
2
Suddenly you're looking at Thread B with Thread A's messages. The fix wasn't "add another loading spinner." I had to make the active thread the source of truth and prevent stale requests from mutating current state.
Once persistent threads were implemented, the UI started exposing a bunch of race conditions. Switching: Thread A → Thread B could briefly show Thread A's messages inside Thread B before correcting itself. Sometimes the wrong thread remained selected.
1
New threads felt slow. Deleting threads felt slow. Renaming a thread had another weird issue: while typing a new name, the input could get overwritten by another state update. The database was working. The problem was the frontend state architecture.