Dugout Value
Baseball research on pitching, hitting, and projections, plus tools for comparing players, contracts, and trade value.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Learn the NFL app for Scottish and UK beginners - First Down Scotland
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A learning hub for Scottish and UK NFL beginners, a community to meet fans of the team you support, and a one-stop shop for that club (news, fantasy, podcasts, depth, watch). Discord is the chat home. The pub list is for real-world meetups with people who picked the same side.
Tagline: Learn the NFL. Meet fans of your team. Follow that club in one place. Built in Scotland, for the UK.
Three jobs: learn the game, meet fans of your team, keep that club in one place. This is not a TV listings product or a magazine clone.檢視完整 README ↗A learning hub for Scottish and UK NFL beginners, a community to meet fans of the team you support, and a one-stop shop for that club (news, fantasy, podcasts, depth, watch). Discord is the chat home. The pub list is for real-world meetups with people who picked the same side.
Tagline: Learn the NFL. Meet fans of your team. Follow that club in one place. Built in Scotland, for the UK.
Three jobs: learn the game, meet fans of your team, keep that club in one place. This is not a TV listings product or a magazine clone.
/ : value prop (learn, meet your team, follow that club in one place), Start learning + Meet your team CTAs, beginner lessons, Sunday card, and a small games teaser/learn and /learn/[slug] : beginner lessons in UK English, including X-and-O play diagrams at /learn/plays, a Draft explainer at /learn/the-draft, NFL rivalries at /learn/rivalries, and famous players at /learn/famous-players. Stage progress bars and a 20-question quiz at /learn/quiz (saved in the browser as fds-learn). Badges: Practice Squad (0–7) → Rookie (8–12) → Starter (13–17) → Hall of Famer (18–20)./mini-games : separate browser games — beginner quizzes (rules, Who am I?, down-and-distance, rivalry match-up) plus nine fun fan quizzes (Super Bowls, catches, jersey numbers, late-night survival, and the rest). Not part of the lesson path./learn/draft-prospects : top 2027 Draft names (ESPN when the official list fills; otherwise a cited early consensus board), cached 600s, Cron-busted/glossary : searchable jargon decoder/this-week : this week’s NFL games from ESPN’s public scoreboard, times in Europe/London, plus a Your Sunday card for the team saved in the browser (fds-team). Each fixture has a short beginner preview or a post-match report (score + snippet + outbound link; “report coming” until a feed publishes one). Fair-use summaries only. Live and finished cards list touchdown scorers under the scoreline when ESPN’s game summary has scoring plays, plus in-app YouTube highlights when we can resolve an official NFL / club clip (YOUTUBE_API_KEY), otherwise a link-out to NFL YouTube search. Spoiler-free (Morning-after) is a toggle on This week and Scores: it hides scores, TD scorers and recaps, kept in fds-spoiler-free. Highlights stay on the card behind a branded “no spoiler” thumbnail until you confirm. Kick-off, TV and teams stay visible. Also UK kick-off, what to watch for, a Learn tie-in, optional ESPN QB snapshot, and a Scottish pub meetup hint. The full slate stays free. Tabs also lead to the Late Night Diary, live scores, standings, and Rookie Watch./kick-off-planner : full 2026 regular-season schedule in Europe/London. Pick any of the 32 clubs, or see this week’s games for every team. Each kick-off is tagged (London/International afternoon, tea-time, evening, late night, overnight). Download a .ics for one game, one club’s season, or the current week. Times come from a stored nflverse snapshot (src/data/kickoff-schedule.json), not from guesses. Refresh with npm run build:kickoff-schedule when the NFL flexes a game./pickem : the Discord weekly Pick'em board, season leaderboard, and published week write-ups. Figures live in src/data/pickem/ (see src/data/pickem/README.md). The Enter button uses the existing Discord invite. No sample rows./late-night-diary : UK planner for games that kick off at 9pm UK or later, or overnight before 5am (Sunday 4pm ET window plus Thursday / Sunday / Monday night in the US). Times in Europe/London, with a US Eastern clock for context and a “Sunday night into Monday morning” style label. Shows the full late slate from the day you check (not a two-week stub), with All teams and Your team only filters. Schedule subject to change is on both views. Filter or highlight by the team saved as fds-team. Times only — no scores, even if spoiler-free is off. Uses the same ESPN scoreboard as This week, then the rest of ESPN’s published calendar (year / seasontype / week)./scores : near-live scoreboard for the current week (Scheduled / Live / Final / Bye), including TD scorers on live and final cards when the feed has them. Same spoiler-free toggle as This week. Server fetch is uncached against ESPN; the /api/scores response is CDN-cached for 20 seconds. The page polls that API every 20s while a game is on, 30s near kick-off, and 2 minutes midweek./score-history : “Has this score happened before?” Scoreography lookup against a stored nflverse schedule snapshot (1999–2025 completed regular-season and play-off games). Winner–loser or home-and-away. Honest empty states if a final is not in the table. Unusual-final notes also appear on Scores and This week when the slate has finished games./standings : AFC / NFC by division, with wins-losses-ties, points for/against, and division rank. ESPN public standings (type=0&level=3), cached 300 seconds./rookies : Rookie Watch for this season’s drafted class (the live scoreboard year; in 2026 that is the 2026 draft, not the 2025 class and not the 2027 college board). ESPN draft list plus Sleeper regular-season stats when any counting numbers exist. Cached 600 seconds. Filter by team, position, or round./news : Our take, short editorial notes (date, headline, take, author, named sources). Add a day by editing src/data/our-take.ts only. Newest first. Optional expires_at (ISO datetime, Europe/London offset) hides a note once that moment has passed./news/headlines : NFL headlines pulled from public RSS (ESPN, BBC Sport, the Guardian). noindex, omitted from the sitemap./news/fantasy : NFL fantasy football tips & news (not Scottish football)/podcasts : recommended NFL and per-team shows to follow (external links; official vs independent labelled)/watch : high-level UK viewing map (Sky / Channel 5 / 5Action / My5 / DAZN Game Pass / Netflix)/film-room : curated watch-to-learn films (America’s Game, Hard Knocks, All or Nothing, Quarterback, Wide Receiver). Official where-to-look hints only; no streams./watch-near-you : directory of Scottish bars checked as showing NFL this season, grouped by town. Data is src/data/pubs.csv (name, town, address, shows, booking_or_contact, source_url, checked_date, notes). The notes column is internal and is not rendered. A town written as Dundee (Broughty Ferry) groups under Dundee and is labelled Broughty Ferry. Check with the bar before you go./about : what the site is for (learn + meet your team)/privacy, /terms, /contact : privacy policy, terms of use, and the public contact page (email plus the note form). /feedback redirects to /contact./community : Discord as the chat home for Scottish / UK fans of the team you picked (Join the Discord CTA; default invite in the repo; override with NEXT_PUBLIC_DISCORD_INVITE; no in-app chat)/history : short NFL history for UK beginners (timeline, not a thesis)/teams and /teams/[slug] : all 32 club profiles (2026-season snapshot), ESPN depth chart, official YouTube, and the relevant pods. The index stays indexable. Each club URL is noindex and left out of the sitemap until it is a substantial page./pick-your-team : quiz or spinning-ball surprise to pick a team (so you can find other fans of that club); saved in the browser as fds-team/fan-map : NFL Scheme Battles (hook: Which team runs the scheme?) — Scotland first, then the UK. Town-centre aggregates only. CTA at /fan-map/add. Private analytics at /admin/fan-map.theme-colorOut of scope: live fantasy scoring / league apps, live play-by-play UI, betting, site-wide accounts, push notifications, App Store builds, perfect per-game UK rights. The live scoreboard is scores, clock, and touchdown scorers when ESPN lists them — not a drive chart. The fan map uses a signed browser cookie (one pin per browser), not an account.
@vercel/analytics, @vercel/speed-insights in the root layout). Turn on Analytics (and Speed Insights) in the Vercel project dashboard if they are not already enabled; the packages do not collect in local next dev.You need Node.js 20+.
npm install
npm run dev
Open http://localhost:3000.
npm run build
npm start
npm run build should succeed without any environment variables. The home and this-week pages fetch ESPN at build or request time, and /news plus /news/fantasy fetch public RSS feeds. Each shows a clear empty/error state if a feed is down.
Copy .env.example if you want a local file. Nothing is required for day-to-day development.
| Name | Required | Purpose |
|---|---|---|
CRON_SECRET | Recommended in production | Protects GET/POST /api/revalidate. Vercel Cron sends Authorization: Bearer <CRON_SECRET>. You can also pass ?secret=.... |
NEXT_PUBLIC_SITE_URL | Optional | Canonical / Open Graph / sitemap base URL. If unset, we use VERCEL_PROJECT_PRODUCTION_URL or https://www.firstdownscotland.com — never a preview *.vercel.app host (those hit SSO). |
NEXT_PUBLIC_DISCORD_INVITE | Optional | Override the Community join link. If unset or invalid, the app uses the public First Down Scotland invite (https://discord.gg/dVuNUT4Cgf). |
NEXT_PUBLIC_CONTACT_EMAIL | Optional | Overrides the public contact mailto (defaults to [email protected]). |
NEXT_PUBLIC_ADSENSE_ENABLED | Ignored | The publisher meta tag (google-adsense-account) and adsbygoogle.js for ca-pub-1747465358377243 are always in the root layout. public/ads.txt stays either way. No ad units are rendered. |
FORMSPREE_FORM_ID | For /feedback on Hobby | Server-only Formspree form hash, or the full https://formspree.io/f/… URL. Inbox is set in the Formspree dashboard, not in this repo. |
RESEND_API_KEY | For /feedback (option B) | Server-only. Sends via Resend. Needs a verified sending domain to reach an arbitrary inbox. |
FEEDBACK_TO_EMAIL | With Resend | Server-only inbox. Never NEXT_PUBLIC_*. |
FEEDBACK_FROM_EMAIL | Optional with Resend | Must be on a domain you verified in Resend. If unset, Resend’s [email protected] sender is used (test mode: only the Resend account email can receive). |
YOUTUBE_API_KEY | Optional | Server-only YouTube Data API v3 key. When set, live and final cards try to embed an official NFL or club highlight. If unset, the quota is exceeded, or no official clip matches, we fall back to the NFL YouTube search link. Never . |
Locally, if neither Formspree nor Resend is set, /api/feedback logs the note and returns success so the form can be tried. In production it returns 503 (“feedback inbox is not wired up”) until one option is configured. Provider failures return 502. If Resend is set and fails, Formspree is tried next when FORMSPREE_FORM_ID is also set.
Use Formspree. Resend on the free / onboarding sender cannot deliver to an iCloud (or any) address unless that address is the Resend login, or you verify a custom domain.
NEXT_PUBLIC_*, and do not commit it to the repo).https://formspree.io/f/xxxxxxxx. The id is the last segment; pasting the whole URL also works.FORMSPREE_FORM_ID/feedback, submit once, and check the Formspree inbox. The first live submission may need you to activate the form in Formspree.Do not set RESEND_API_KEY unless you also have FEEDBACK_FROM_EMAIL on a verified domain. A Resend key plus the default onboarding sender is a common way to get a 502 with nothing in the inbox.
If CRON_SECRET is unset, /api/revalidate is allowed only when NODE_ENV is not production.
Fixtures are not edited by hand.
https://site.api.espn.com/apis/site/v2/sports/football/nfl/scoreboardyear / seasontype / week from the same payload.fixtures./ and /this-week also set export const revalidate = 300. /late-night-diary uses the same cache, then asks ESPN for every remaining published slate (year / seasontype / week from the scoreboard calendar) so the planner is the full late list as of the day you check, not a two-week stub./scores uses a separate, uncached ESPN scoreboard fetch so a 5-minute fixtures cache cannot stall the live board. The page and /api/scores set revalidate = 20. The browser polls /api/scores (Cache-Control s-maxage=20) every 20 seconds while any game is in progress.…/summary?event={id}), already used for recaps, and read scoringPlays. Field goals and extras are dropped. If that list is missing, the card still renders. Final-game summaries share the 300-second game-reports cache; in-progress games use the 20-second scores tag so a live board can pick up a new TD without waiting five minutes. The same summary’s first/last play timestamps give an approximate game length on finished cards.localStorage key fds-spoiler-free, values on / off). A before-paint script sets data-spoiler-free="on" on <html> so scores do not flash. CSS then hides .fds-spoiler (scoreline, TD list, recaps, this-week unusual-finals, YouTube embed chrome). Highlight tiles stay visible as .fds-spoiler-safe branded posters (/highlights-spoiler-free.svg) so a YouTube thumbnail never flashes. Tapping asks “This may reveal the result”; confirm embeds that game only and leaves the rest of the slate spoiler-free. The Sunday card’s “what to watch” line does not include the final score. Per-game “Show result” is not in this MVP.https://site.api.espn.com/apis/v2/sports/football/nfl/standings?type=0&level=3standings. /standings sets export const revalidate = 300./teams/[slug]) reuse the same payload for that club’s division table.https://site.api.espn.com/apis/site/v2/sports/football/nfl/draft?year={seasonYear}https://api.sleeper.app/v1/stats/nfl/regular/{seasonYear}
Player IDs are matched via https://api.sleeper.app/v1/players/nfl only after that stats dump has real counting numbers. Before Week 1 we skip that large file and say stats are not available yet.rookies tag). The Sleeper players map uses 86400 seconds. /rookies sets export const revalidate = 600./score-history does not scrape Scoreogami or any live box-score site.
src/data/score-history.json.https://raw.githubusercontent.com/nflverse/nfldata/master/data/games.csv
(repo: nflverse/nfldata).REG, WC, DIV, CON, SB) with both scores present. Preseason is not in that file. Future rows with empty scores are dropped.npm run build:score-history. Runtime pages only read the JSON. If a final is missing, the UI says so. We do not invent older history.The current snapshot covers 1999–2025 (7,276 games). 2026 results appear only after they land in that public file and we rebuild.
On Vercel, vercel.json schedules a daily Cron at 0 6 * * * (06:00 UTC) to GET /api/revalidate. That route runs:
revalidateTag('fixtures', 'max')revalidateTag('scores', 'max')revalidateTag('standings', 'max')revalidateTag('rookies', 'max')revalidateTag('news', 'max')revalidateTag('news-fantasy', 'max')revalidateTag('depth-charts', 'max')revalidateTag('draft-prospects', 'max')revalidateTag('highlights', 'max')revalidatePath('/')revalidatePath('/this-week')revalidatePath('/late-night-diary')revalidatePath('/scores')revalidatePath('/score-history')revalidatePath('/standings')revalidatePath('/rookies')revalidatePath('/news')revalidatePath('/news/headlines')revalidatePath('/news/fantasy')revalidatePath('/start-sit')revalidatePath('/teams')revalidatePath('/learn')revalidatePath('/learn/draft-prospects')Hobby only allows once-per-day Cron. Pages still refresh without the Cron: the 300-second ISR / fetch revalidate keeps times and standings reasonably fresh between visits, and /scores polls every 20 seconds while games are on. On Pro you can change the expression to hourly (for example 15 * * * *) if you want a background warm more often. No new environment variables are required for standings, scores, or Rookie Watch.
Team depth charts use the same ESPN public API family (…/teams/{id}/depthcharts plus roster names), cached for 600 seconds and tagged depth-charts. The daily Cron busts that tag too. If ESPN is down, the profile still renders and we say so.
The top-12 board is not a hand-edited mock.
https://sports.core.api.espn.com/v2/sports/football/leagues/nfl/seasons/2027/draft/athletesdraft-prospects. /learn/draft-prospects and /learn also set export const revalidate = 600./learn/draft-prospects.Rankings move. The page says so. This is not a betting slip.
/news is Our take. It does not fetch RSS.
To add a day, edit only src/data/our-take.ts. Append an object:
date: YYYY-MM-DDheadlinetake: the 2-3 line note, verbatimauthor: optional. Defaults to Blitz, First Down Scotlandsources: { name, url? }[]. Leave url off when we are naming a source without a linkexpires_at: optional ISO datetime with a Europe/London offset (+00:00 or +01:00). The note is hidden once that moment has passed. /news revalidates every 10 minutes, so a note drops off on the next refresh after it expiresNewest date is shown first. Same-day notes keep the order they appear in the file.
/news/headlines is the pulled list. It is noindex and left out of the sitemap.
/news/headlines fetches three public RSS feeds in parallel:
https://www.espn.com/espn/rss/nfl/newshttps://feeds.bbci.co.uk/sport/american-football/rss.xmlhttps://www.theguardian.com/sport/nfl/rssnews. /news/headlines also sets export const revalidate = 600.news tag. Do not add an hourly Cron on Hobby — ISR is the ongoing refresh.If a feed fails, the others still show. If all fail, the page says so instead of inventing headlines.
/news/fantasy uses the same pattern with its own tag (news-fantasy) and these feeds:
https://www.espn.com/espn/rss/fantasy/news (we keep NFL / fantasy-football items and drop baseball and other sports)https://www.thefantasyfootballers.com/feed/https://www.rotowire.com/rss/news.php?sport=NFLThe News nav stays one item; NFL and Fantasy are tabs on the news pages. This is NFL fantasy, not Scottish football.
Mini-game intros live in src/data/mini-game-intros.ts, keyed by slug. Each entry is three paragraphs plus a sourceUrl, rendered as a Source link. Empty paragraphs hide that intro.
/start-sit compares two players from Sleeper’s public API (players list cached server-side for a day; weekly projections, weekly stats, NFL state and the regular-season schedule cached more briefly). Editorial calls are src/data/start-sit-verdicts.csv with the header week,player_a,player_b,verdict,confidence,reason,source_url,checked_date. verdict is the player to start. confidence is lean or strong. Pairs match in either order, for the current Sleeper week, and names ignore case, punctuation and suffixes such as Jr. No matching row means the numbers only, labelled as Sleeper projections, not a verdict. The written call is labelled Waiver Wire's verdict. Ask in Discord #start-sit.
Set CRON_SECRET in the Vercel project so the Cron request is accepted. You can also hit the route yourself:
curl -H "Authorization: Bearer $CRON_SECRET" https://www.firstdownscotland.com/api/revalidate
/fan-map is an aggregate map of NFL fans in Scotland and the rest of the UK. It is not a people directory.
DATABASE_URL or POSTGRES_URL to a Vercel Postgres / Neon database. On first request the app creates fan_map_users, fan_map_registrations, and fan_map_flips (see src/lib/fan-map/schema.sql)./fan-map/add is team → town autocomplete → optional questions → captcha. First submit from a browser creates one row; later submits with the same signed httpOnly cookie update that row. Anti-spam: IP rate limit (3 creates / hour, 20 updates / hour), Cloudflare Turnstile in production (NEXT_PUBLIC_TURNSTILE_SITE_KEY + TURNSTILE_SECRET_KEY), honeypot, and a 3-second minimum form fill time.GEOAPIFY_API_KEY is set; otherwise Photon, then Nominatim.FAN_MAP_PRIVACY_THRESHOLD (default 3). Below that it stays uncoloured and does not count. A create/update that changes the leader writes a fan_map_flips row with a rotating scheme-banter line (survives reloads). /fan-map#scheme-battles has recent territory changes plus towns-owned boards for Scotland and the UK./admin/fan-map is env-gated with FAN_MAP_ADMIN_SECRET. Aggregates, growth, CSV export, a 5/10/15/20/25-mile hotspot, and hide / unhide / delete for abusive pins (hidden rows leave the public map).npm run build still succeeds with none of these variables set.
npm run build.CRON_SECRET (and optionally NEXT_PUBLIC_SITE_URL, NEXT_PUBLIC_DISCORD_INVITE, NEXT_PUBLIC_CONTACT_EMAIL, and YOUTUBE_API_KEY) under Project Settings → Environment Variables. YOUTUBE_API_KEY is server-only; leave it unset and highlights still work as NFL YouTube search links.vercel.json are registered on Hobby / Pro according to your Vercel plan.| Route | Role |
|---|---|
/ | Learning home + fixtures teaser |
/learn | Lesson index, stage progress bars |
/learn/draft-prospects | Top 2027 draft prospects (cached) |
/learn/what-youre-watching … /learn/the-draft | The lessons, including the Draft |
/learn/plays and /learn/plays/[slug] | Common play diagrams |
/learn/quiz | 20-question path quiz + badges (fds-learn) |
/learn/rivalries | Rivalries lesson (who plays whom) |
/learn/famous-players | Famous players lesson |
/mini-games | Mini Games hub: beginner games + fun fan quizzes (separate from lessons) |
/glossary | Jargon decoder |
/this-week | Auto fixtures |
/kick-off-planner | 2026 regular season in UK time, plus calendar files |
/pickem | Discord weekly Pick'em board and leaderboard |
/late-night-diary | Late UK kick-offs (9pm+ / overnight) |
/scores | Near-live scoreboard (20s poll while live) |
/score-history | Has this final happened before? (stored nflverse table) |
/standings | AFC / NFC by division |
/rookies | This season’s drafted rookies + stats |
/news | Our take (editorial notes) |
/news/headlines | Auto NFL headlines (RSS, link out, noindex) |
/start-sit | Compare two fantasy players (Sleeper data; Waiver Wire's verdict when the CSV has one) |
/news/fantasy | Auto NFL fantasy headlines (RSS, link out) |
/watch | UK viewing explainer |
Independent fan project. Not affiliated with the NFL, Sky, Channel 5, DAZN, Netflix, the BBC, the Guardian or ESPN. Scoreboard data is read from ESPN’s public site API and may change without notice. News headlines and snippets come from those publishers’ public RSS feeds and link back to the original articles. Historical final-score frequencies on /score-history, and the 2026 kick-off planner, come from the public nflverse / nfldata schedule file, stored in-repo as a snapshot.
Team profiles use ESPN’s public logo CDN (https://a.espncdn.com/i/teamlogos/nfl/500/{abbr}.png) with an abbreviation-circle fallback. Stadium names and listed capacities follow Wikipedia’s current NFL stadiums list for the 2026 season (cited there to club media guides and reporting). Super Bowl counts are after Super Bowl LX (Seattle 29–13 New England, 8 February 2026; AP / NFL.com). Franchise origins follow the league’s published history and standard reference summaries. Stadium names, capacities and trophy counts can change.
/watch-near-you reads src/data/pubs.csv. Replace that file to update the directory (keep the header row). Notes stay in the file for editors and are not shown on the page. Bar owners can use /contact or the public contact email.
Lessons, guides, the homepage, the fan map, and About, Privacy, Terms and Contact are indexable and listed in sitemap.xml.
These stay in the app for fans. They are noindex, follow, and they are omitted from the sitemap, because they are templated club pages or live-data shells:
/teams/[slug] (the /teams index stays)/scores/this-week/late-night-diary/news/fantasy/news/headlinesNEXT_PUBLIC_*DATABASE_URL or POSTGRES_URL | For /fan-map writes | Vercel Postgres / Neon connection string. Tables are created on first use (src/lib/fan-map/schema.sql). Unset: public map still builds and shows an honest empty state. |
FAN_MAP_COOKIE_SECRET or FAN_MAP_AUTH_SECRET or AUTH_SECRET | Required in production to save a pin | HMAC secret for the anonymous fan-map cookie. Locally a documented dev secret is used if unset. |
NEXT_PUBLIC_TURNSTILE_SITE_KEY + TURNSTILE_SECRET_KEY | Required in production to save a pin | Cloudflare Turnstile captcha. Locally the captcha is skipped if unset. |
FAN_MAP_ADMIN_SECRET | For /admin/fan-map | Password / shared secret for private analytics, plus hide / delete of abusive pins. Not in the public nav. |
FAN_MAP_PRIVACY_THRESHOLD | Optional | Towns below this many registrations hide per-team splits. Default 3. |
GEOAPIFY_API_KEY | Optional | Better UK town autocomplete. Photon + Nominatim are the no-key fallback. |
NEXT_PUBLIC_FAN_MAP_STYLE | Optional | MapLibre style URL. Default OpenFreeMap dark (no map token). |
youtube-nocookie.com) under the game card. GET /api/highlights is server-only: if YOUTUBE_API_KEY is set it searches the NFL channel, then a wider official-club filter, and returns only a video id plus the search URL — never a YouTube title or thumbnail. No key, no match, or an API error falls back to youtube.com/@NFL/search?query=…. We do not scrape YouTube. Club YouTube on team pages is still a link-out. The daily Cron also busts the highlights tag./film-room | Watch-to-learn films and series |
/watch-near-you | Scottish bars checked as showing NFL, grouped by town |
/community | Discord community (invite CTA) |
/contact | Contact: email plus the note form |
/feedback | Redirects to /contact |
/privacy | Privacy policy |
/terms | Terms of use |
/history | Short NFL history timeline |
/teams | All 32 teams by conference / division |
/teams/[slug] | Club profile (stadium, colours, Super Bowls, live depth chart) |
/pick-your-team | Quiz or spin to pick a team (saved as fds-team) |
/fan-map | NFL Scheme Battles: which team runs the scheme? |
/fan-map/add | Put your team on the map (no account) |
/about | Project purpose |