vtx athlete
built a composite scoring engine that pulls training data, social metrics, and competition results into a single 0-1000 score so sponsors can actually find athletes worth working with
the problem
brands want to sponsor athletes who are actively training, posting, and competing, not just people with follower counts. manually going through strava profiles and instagram pages and competition results doesnt scale at all.
basically theres no single metric that tells you whether an athlete is worth sponsoring right now versus six months ago.
how it works
we pull data from multiple platforms and aggregate it into a composite score that reflects actual sponsorship value, not just raw follower counts. sponsors get a dashboard where they can filter and search athletes based on scores and other criteria.
cant go into too much detail on the scoring internals since im under nda, but the general idea is normalizing signals from different sources so you can compare athletes across sports and audience sizes.
- nestjs backend with graphql api, postgresql via typeorm, redis for caching
- expo react native mobile app for ios and android
- multi-platform data aggregation from social, training, and competition sources
- bull queues for background processing, kubernetes for orchestration
what shipped
multi-platform data aggregation feeding a scoring engine with leaderboards, dashboards, and an expo mobile app for ios and android. scores update within minutes of new activity.
60+ athletes on the platform. also rebuilt ci/cd cutting deploy time from 3hrs to 15min and reduced aws costs by 45%.
decisions and tradeoffs
infrastructure and architecture choices were the main decisions i can talk about.
- nestjs monolith over microservices. at our scale a single deployable unit is simpler to operate and debug, splitting can happen later if needed
- graphql over rest. the mobile app and web dashboard need very different data shapes from the same endpoints, graphql lets each client request exactly what it needs
- rebuilt ci/cd from manual deploys to a 5-stage gitlab pipeline. cut deploy from 3hrs to 15min which made shipping way less painful