OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Weekly college football score projections, picks against the line, kickoff weather and quarterback status.
Sports & fitnessPython · ShellGitHub @Jono-bit-tradeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A college football prediction model and website. Every week it projects every FBS game's score, compares the projection with the betting line, and publishes the picks with the kickoff weather forecast and each team's starting-quarterback status.
Website: https://jono-bit-trade.github.io/jonos-picks/ (live once setup step 2 below is done)
CFBD_KEY. Value: the key CollegeFootballData emailed you. Never put the key in a file here.After that it runs on its own:
| When (Central time) | What happens |
|---|---|
| Sunday evening | Saturday's results are in: ratings rebuild and each game's early pick locks at the current line |
| Monday night | Full refresh, picks and the backtest |
| Wednesday to Saturday mornings | Latest lines, kickoff weather forecasts and quarterback status |
| Thursday and Friday nights, Saturday afternoon and night | Scores every 2 hours, so finished games show their results on the board |
The model checks whether each team's starting QB is out. Past games are figured out automatically from box scores. For this week's games, it reads data/qb_status.csv, which you update from the conference availability reports. Open the file on GitHub, click the pencil icon, add a line, and commit:
season,week,team,qb,status,note
2026,9,Texas,Arch Manning,questionable,ankle
status is one of: available, probable, questionable, doubtful, outout and doubtful are projected with the starter missing.questionable shows both projections on the site: if he plays and if he sits.The next morning's run picks it up, or click Run workflow to update right away.
There's no free source for betting splits (share of bets vs. share of money), so you add them from a service you use, such as DraftKings splits on VSiN or Action Network. Add a line per game to data/splits.csv; percentages are for the home team's spread and for the over:
season,week,home,away,bets_home_pct,money_home_pct,bets_over_pct,money_over_pct
2026,9,Texas,Ole Miss,38,61,70,52
The weekly board then flags:
Every logged split is saved with the pick, so the History page's "Sharp money and reverse line movement" table measures over time whether these signals win. The thresholds are SHARP_GAP, PUBLIC_MIN and RLM_MIN_MOVE in src/config.py.
| Step | File | What it does |
|---|---|---|
| Data | src/get_data.py | Downloads games, betting lines, efficiency stats, box scores, talent, returning production, recruiting, transfer portal, coaches and stadiums from CollegeFootballData |
| Ratings | src/ratings.py | Opponent-adjusted offense and defense ratings in points, starting each season from a roster-based preseason prior |
| Weather | src/weather.py | Free kickoff forecasts and past game-day weather from Open-Meteo |
| QB out | src/qb.py | Starting QB out flag: box scores for past games, data/qb_status.csv for this week |
| Features | src/features.py | Efficiency matchups, pace, turnovers, penalties, rest, travel, altitude, time zones, coaching changes, situations |
| Model | src/model.py | Gradient-boosted trees blended with the rating projection |
| Backtest | src/backtest.py | Replays past seasons week by week using only information available at the time |
| Site | src/predict.py, docs/ | Writes the week's picks, ratings and record for the website |
All tunable settings are in src/config.py. To test a change, edit a value and run the backtest (or ask Claude to). Keep a change only if it improves results across several seasons.
The History page grades every game since 2018 four ways, the way the sites it was modeled on do:
Filter by season, team or minimum edge. "Where the model is strongest" shows the spread record at each edge size and highlights any level that holds 60% or better over at least 50 games.
Past seasons are replayed walk-forward: each game uses only ratings and a model built from games before it, so the history isn't flattered by hindsight.
Run Actions → tune-model → Run workflow (20 to 60 minutes). It tries combinations of rating settings, feature groups and blend weights on the older seasons, picks the best, then finds the smallest edge where the spread record reached 60%. It then checks those choices on the 3 newest seasons, which played no part in choosing them; the How it works page shows that holdout result. The winning settings are saved to data/tuned.json and used for this week's predictions too, so upcoming picks and the History page always come from the same model.
A realistic target: 60%+ picking winners is normal; against the spread, every game, 53 to 56% is very good. 60% against the spread is only realistic on the subset of games with the biggest edges, and only if the holdout seasons confirm it.
Lines tend to move toward the side the model likes: in 2023-2025, lines moved toward the model's side about 70% of the time when it disagreed with the opener by 5+ points, and its picks went about 57% against the opening line, versus about 51% against the closing line. So the model's value is early in the week.
data/line_history.csv, so picks can later be graded at the line on a specific day, such as Wednesday.data/predictions_log.csv keeps the last projection made before each kickoff, and the Record page grades those. When the site first launches mid-season, earlier games of the season are filled in by replaying the model with only pre-game information, and the site labels them as backfilled.
The first download uses roughly 700 CollegeFootballData calls. After that, upkeep is about 80 calls a month. If your plan's monthly limit is lower than the first download needs, run the backfill in pieces: on your computer, python src/get_data.py --from-season 2019, or ask Claude to change the workflow.
pip install -r requirements.txt
echo YOUR_KEY > key.txt # key.txt is never uploaded (.gitignore)
python src/get_data.py
python src/predict.py
python src/backtest.py
cd docs && python -m http.server # then open http://localhost:8000
Tests (no key needed): python tests/test_parsers.py and bash tests/smoke_test.sh.
Projections are for entertainment and analysis, not betting advice.