78DAYS Up Next · Week 1 Hampton SAT, SEP 5 · SECU STADIUM
Terps
2026 SeasonB1G
THU, JUN 18, 2026 Analytics
SHELL

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
Drop a normalized export into data/external/ following the envelope {asOf, source, data} and it appears here. Research layer as of 2026-06-17.