Founder · 2025–
The Lineup
I built a paid sports-analytics product alone, from first commit to live billing in 22 days, and I still run it.
Operated by Duncan
- 22 daysfrom first commit to live billing
- 80+ bookmakersin the odds feed
- Web + iOSlive web product and published App Store app
The problem
Sports bettors can find endless statistics, picks and odds screens. The harder problem is deciding what is useful right now, why it is useful, and whether it can be trusted. Player projections, sportsbook prices and final results usually live in separate places, and a prediction that is never checked against the result doesn't help anyone decide.
I wanted one product that connected those pieces and charged for the parts that save people time or improve their confidence. So the hard part was not only model accuracy. The product needed reliable data ingestion, clear signals, automatic grading, subscription access, and public evidence that it was working.
What I built
I started the production codebase on October 29, 2025, and set up the database, authentication, backend, frontend and deployment structure instead of a throwaway prototype. Between October 30 and November 7 I built onboarding, the first decision workflows, subscription infrastructure, quotas and access controls, so the paid model was designed with the product rather than added after it. The web app shipped to production on November 12. On November 20, Stripe went into live mode with subscription state connected to product access: 22 days from first commit to live billing. Paying customers followed within 90 days.
The product covers the NBA, NFL, NHL, MLB, college basketball and major soccer leagues. LightGBM models with more than 130 engineered features produce player projections and confidence tiers. The data layer ingests sports stats and odds from 80+ bookmakers, normalizes them into PostgreSQL, runs freshness and quality checks, and keeps the product useful when a provider's data is incomplete. The betting tools compare prices across sportsbooks, surface expected-value and arbitrage opportunities, track closing-line value and settle bets automatically against final results. Recorded results are public at thelineup.pro/results.
After launch, the roadmap stopped being hypothetical. Live sports data fails in ordinary ways: providers lag, identifiers drift and markets disappear. I made validation, withholding rules, tracking and settlement part of the product so questionable output doesn't quietly reach a customer. I reconcile PostHog checkout events with Stripe, RevenueCat and the subscription records in Supabase, because a checkout event is not the same as a paying customer. And I treat support conversations as product research: they show the gap between the product I thought I had built and the one people actually use.
- 01IngestPull sports stats and odds from 80+ bookmakers.
- 02ValidateCheck freshness and withhold questionable data.
- 03ProjectLightGBM models with 130+ features forecast player performance.
- 04CompareSet each projection against current market prices.
- 05SettleGrade results automatically and keep the public record.
What stays human
- Customers decide whether an opportunity is worth acting on. The product shows the projection, current price, timestamp and final result, not an instruction.
- I make the positioning, pricing, roadmap and release decisions.
- When data looks wrong, the product withholds it, and I decide what deserves a durable fix.
What can be verified
- The product is public at thelineup.pro, and recorded results are public at thelineup.pro/results.
- The iOS app is published on the App Store.
- The 22-day timeline was verified against the private repository. The code itself is not public.
- Subscriber counts, revenue and model-accuracy figures are not published here, and no customer-level data is shown.
Stack
- Python
- FastAPI
- Next.js
- TypeScript
- PostgreSQL
- Supabase
- Redis
- LightGBM
- Stripe
- RevenueCat
- PostHog
- Postmark
- Railway
- Vercel
- Capacitor iOS
Have a workflow that eats your team's week?
Tell me about it in 30 minutes. If AI isn't the right fix, I'll say so.