Data Sources
what feeds SHELL, what plugs in next
Connected
Feeding SHELL now · 6
CFBD
api
connected
last sync 1h ago
collegefootballdata.com REST, key set (CFBD_API_KEY). Responses cached in data/cache as md5-named JSON, 12h TTL, stale copy served when the quota or request fails. 631 cached responses on disk.
ESPN roster
api
connected
last sync 28m ago
Public team-roster endpoint, no key, independent of the CFBD quota. Cached as espn_-prefixed JSON in data/cache, 24h TTL, stale fallback. Maryland team id 120 verified.
cfbfastR data
file
connected
last sync 9d ago
sportsdataverse/cfbfastR-data on GitHub: one ~60 MB CSV per season, one row per offensive play, player-attributed. Downloaded once to data/cache (player_stats_2025.csv); per-team aggregates cached as JSON so repeat reads are instant. No key, no quota.
umterps.com bios
scrape
connected
last sync 8d ago
Official roster + per-player bio pages scraped by scripts/fetch-umterps-bios.ts into src/playerbios.generated.ts (never hand-edited). Headshots downloaded and self-hosted at /headshots. Re-run the script to refresh.
Research layer
research
connected
last sync as of 2026-06-17
data/external/*.json — 29 files from research/API sweeps, each in the {asOf, source, data} envelope (src/external.ts). A missing or malformed file degrades to an empty state on the page; nothing is invented to fill a gap.
Anthropic API
ai
connected
last sync never
Key set (ANTHROPIC_API_KEY). Model claude-sonnet-4-6 (src/aiconfig.ts; SHELL_MODEL in .env overrides). Synthesis only — every surface it touches has a deterministic fallback, so pages render with or without it.
Integration slots
Where paid data plugs in · 3
planned
PFF
file
Slot defined here only. No PFF data in the building; nothing on any page claims a grade.
Season + weekly grade exports land as data/external/pff-grades-<season>.json in the standard envelope {asOf, source, data}. data: one row per player — {player, team, position, facetGrades, snaps} — with facetGrades 0-100 by facet (offense, defense, passRush, coverage, runBlock, ...). Drop the file; this registry picks it up on the next probe, no code change.
data/external/pff-grades-2026.json
{ "asOf": "YYYY-MM-DD",
"source": "PFF export",
"data": [
{ "player": "Last, First", "team": "Maryland", "position": "ED", "snaps": 0,
"facetGrades": { "overall": 0, "pass": 0, "passRush": 0,
"coverage": 0, "runBlock": 0, "runDefense": 0 } }
] }
powers when live
planned
Telemetry
file
Slot defined here only. Report sections IX (Coverage & Pressure) and X (Personnel & Formation) ship today as structured, clearly-labeled blank tables (src/reportdata.ts buildChartingTables) — CFBD play-by-play has no coverage shells, blitz, pressure, or personnel, so those cells stay blank until film breakdown or this feed fills them.
Per-play charting/tracking exports land as data/external/telemetry-charting-<opponent>-<season>.json in the standard envelope {asOf, source, data}. data: one row per play — personnel, formation, motion, coverage shell, pressure/rushers. Rows drop straight into the report's charting tables and replace manual self-scout entry.
data/external/telemetry-charting-<opponent>-2026.json
{ "asOf": "YYYY-MM-DD",
"source": "Telemetry export",
"data": [
{ "game": "2026-09-05 vs ...", "play": 1, "down": 1, "distance": 10,
"personnel": "11", "formation": "3x1", "motion": true,
"coverageShell": "C3", "pressure": false, "rushers": 4 }
] }
powers when live
planned
Zelus
file
Slot defined here only. /spend compares NIL to NFL allocations and /gameday runs its own win-prob model today; this feed adds player value and projection priors on top.
Projection/valuation exports land as data/external/zelus-projections-<season>.json in the standard envelope {asOf, source, data}. data: one row per player — WAR-like value, dollar valuation, lineup/win-prob priors. Joins the roster by player name + position.
data/external/zelus-projections-2026.json
{ "asOf": "YYYY-MM-DD",
"source": "Zelus export",
"data": [
{ "player": "Last, First", "team": "Maryland", "position": "QB",
"war": 0.0, "valueUsd": 0, "winProbPrior": 0.5 }
] }
powers when live