Changelog
What's new in Tour Breakdown
Early days. Tour Breakdown is in active development — this timeline will grow as features ship.
MAJOR UPDATE — Course Picks: Full-Field Rankings
The biggest feature yet. Every player in the field is now ranked by how well their game fits the course. A composite model blends five signals — course fit, season strokes gained, recent form, course history, and approach precision — into a single score that surfaces who’s primed to contend and who’s fighting an uphill battle.
- 5-signal composite model
each player is scored across Course Fit (SG profile vs course demands), Season SG (overall ability), Recent Form (last 8 starts), Course History (past results at this venue), and Approach Fit (proximity from the distances this course asks) — equally weighted at 20% each with automatic redistribution when a signal is unavailable
- Top 10 hero rows
the highest-ranked players get a premium layout with headshot, narrative blurb explaining their placement, score badge with letter grade, mini SG bars, and form value — click any row to expand
- Full field expand
every player beyond the top 10 uses the same hero row layout — headshot, blurb, score, and form — with a “View full field ranking” toggle to reveal the entire field
- Player detail cards
expanding a player reveals five signal cards showing their field rank in each category (e.g. #3 / 126 in Course Fit), plus the raw SG value, colour-coded from green (top 15%) through blue, gold, to red (bottom 30%)
- AI-generated blurbs
each player gets a short narrative explaining why they’re ranked where they are — highlighting their strongest signals, standout SG categories, and any notable weaknesses
- How it works methodology
a “How it works” toggle in the section header expands to show full definitions for all five signals, how normalisation works, and how missing data is handled
- Approach distance fit
a new signal that weights each player’s proximity-to-hole stats by how often this course demands shots from that distance — if 40% of approaches are 175–200 yards, players who get closest from that range score highest
- Works on upcoming tournaments
when the PGA Tour publishes the field before an event starts, course picks appear automatically — no need to wait for the tournament to go live
- Tournament logos
tournament pages now display the official event logo in the header, pulled from the PGA Tour schedule API
- Security audit
CSP headers updated for tournament logo images, next/image remote patterns narrowed to specific paths, logo URLs validated as HTTPS, and error logging added to all data fetch handlers
Dashboard Search & Security Upgrade
The homepage now has a universal search bar for finding players, tournaments, and stats instantly. Under the hood, the Content Security Policy has been upgraded from unsafe-inline to per-request nonce-based CSP, and the deprecated middleware has been migrated to the Next.js 16 proxy convention.
- Dashboard search
a new search hub on the homepage lets you find any player, tournament, or stat category with instant client-side filtering, keyboard navigation (arrow keys + Enter), and category pill tabs to scope results
- Ctrl+K / ⌘K shortcut
press Ctrl+K (Windows) or ⌘K (Mac) from anywhere on the dashboard to jump straight to the search bar — the shortcut hint auto-detects your OS
- Course difficulty engine
a new computation layer classifies courses into archetypes (Birdie Fest, Balanced, Grind, Volatile, Survival Test, Gauntlet) using birdie-to-bogey ratio and danger concentration — data is wired and ready for the upcoming difficulty strip
- Nonce-based CSP
upgraded from ‘unsafe-inline’ to per-request nonce-based Content Security Policy with ‘strict-dynamic’, eliminating the last medium-severity security finding. Every page response now gets a unique cryptographic nonce
- Middleware → Proxy migration
migrated from the deprecated Next.js middleware convention to the new proxy.ts pattern, removing the startup deprecation warning and future-proofing for Next.js 17
Full-Field Stats Page
A new Stats page replaces the Rankings placeholder with a massive sortable table of ~200 PGA Tour players across every stat category. Switch between Strokes Gained, Driving, Approach, Short Game, Putting, and Scoring with instant cached tab switching.
- Six stat categories
pill tabs at the top switch between Strokes Gained (default), Driving, Approach, Short Game, Putting, and Scoring — each with its own set of columns and color-coded dot indicator
- Sortable columns
click any stat column header to sort ascending or descending, with keyboard support (Tab + Enter/Space) and aria-sort for screen readers
- Tour average row
a pinned first row shows the PGA Tour field average for every stat in the active category, giving instant context to each player’s numbers
- Instant tab switching
traditional stat categories fetch in parallel from the API on first click, then cache in memory so switching back is instant with no loading state
- Season selector
pick any season from the last 4 years to view historical stats — the page server-renders the selected season and resets all client state cleanly
- Player search with stable ranks
search filters the table while preserving each player’s rank from the full sorted list — a player ranked #47 in TOT still shows #47 when you search for them
- Responsive mobile layout
sticky table headers, abbreviated player names on small screens, hidden country flags, and reduced cell padding match the leaderboard table’s responsive patterns
- CSP hardening
removed unsafe-eval from the Content Security Policy in production builds, restricting it to development only where Next.js requires it for hot reload
Player Links, Round Scores & Traditional Stats
Player names are now clickable everywhere, the tournament leaderboard shows per-round scores, and player profiles have a full traditional stats breakdown alongside strokes gained. Plus accessibility, security, and mobile polish across the board.
- Clickable player names
every player name in the app is now a link to their profile page — leaderboard rows, category leader cards, and anywhere PlayerLink appears
- Round score columns
the tournament leaderboard table now shows R1–R4 columns with color-coded to-par scores, sortable headers, and active-round highlighting
- Traditional stats on player pages
a new unified stats grid pairs strokes gained with traditional stats — driving distance, accuracy, GIR, scrambling, sand saves, putts per round, one-putt %, scoring average, birdie average, and more
- Richer player archetypes
each archetype (Complete, Power Player, Precision Player, Ball-Striker, Elite Putter, Short-Game, All-Around) now includes a detailed prose description with percentile rankings for every category
- Mobile scroll improvements
category leader cards snap-scroll horizontally with a fade indicator on the right edge, the leaderboard table has proper min-widths for smooth horizontal scroll, and player names use CSS truncation instead of hard character limits
- Keyboard accessible sorting
all sortable table headers now support Tab navigation, Enter/Space activation, and announce sort direction via aria-sort for screen readers
- Input validation & security
route parameters (playerId, tournamentId, season) are now validated before any API calls — invalid values return a 404 instead of hitting the PGA API. PlayerLink gracefully falls back for malformed IDs, and par parsing guards against NaN propagation
- Batched historical API calls
historical season data fetches are now batched in groups of 8 instead of firing all 28 stat lookups at once, reducing the risk of API rate limiting
Mobile, Tournaments Hub & Security Hardening
Tour Breakdown is now fully responsive, has a dedicated Tournaments page, and ships with a hardened security posture. Plus, approach distance data is now sourced from real ShotLink proximity stats instead of yardage estimates.
- Mobile responsive
every page now adapts to phone and tablet screens — responsive typography, tighter spacing, collapsible sidebar with hamburger drawer, and short round-tab labels on small viewports
- Tournaments hub
new /tournament index page with a featured hero card, horizontal carousel of completed events, major tournament branding, and a full upcoming schedule grid
- Real approach data
approach distance distribution now uses actual ShotLink proximity stats (attempt counts across 5 distance buckets) instead of yardage-based estimates, with a placeholder ring shown for upcoming events
- Field filter on Players
toggle between Full Tour and this week’s field on the Players page, with automatic fallback to the last completed event when the upcoming field isn’t published yet
- Upcoming tournament detection
the homepage and tournament pages now detect and display upcoming events with an “Up Next” badge once the previous tournament week ends
- Security hardening
added Content-Security-Policy header, API route rate limiting (60 req/min), GraphQL input validation, and replaced D3 innerHTML tooltip with safe DOM construction
MAJOR UPDATE — Player Pages Now Live
We’ve launched comprehensive player profiles with multi-dimensional analytics. Dig into any player’s complete profile — driving, approach, short game, putting, and total performance across multiple seasons.
- Players directory
searchable grid of all active PGA Tour players ranked by Strokes Gained: Total, with headshots, country flags, and rounds played
- Strokes Gained module
radar visualization plus all six SG metrics broken out with rank and field context on every player page
- Proximity to Hole
horizontal bar chart showing average distance from the pin across five approach yardage ranges
- Recent form
side-by-side view of last 5 tournament finishes alongside an SG vs Field trend chart
- Season selector
switch between current and historical seasons (3+ years back) to compare performance over time
UI polish — tabs, table, and layout refinements
A focused pass on the tournament experience. Round tabs are more prominent, the table is cleaner, and expand/collapse feels smooth.
- Underline round tabs
full-width tab bar with evenly spaced labels, a sliding green underline indicator, and smooth 300ms transitions between rounds
- Trend column removed
the sparkline trend column has been removed from the SG table to reduce noise and tighten the layout
- Show Full Field inside table
the expand CTA is now a full-width row at the bottom of the table card instead of a floating link below it
- Animated expand/collapse
toggling between Top 10 and Full Field now smoothly animates the table height with a 300ms transition
- Field Pulse restyled
header and card layout now match the Course Profile section for a consistent editorial look
Changelog is here
You’re looking at it. Tour Breakdown now has a changelog page so you can see what’s new each time we ship.
- Changelog page
a timeline of every update, auto-generated from git history and written up with friendly descriptions
- Sidebar link
quick access from the bottom of the navigation bar so it’s always one click away
- Build-time generation
changelog data is created at build time from the commit log — no extra API calls, no manual maintenance
- Code cleanup
removed dead code, unused types, and tightened up the codebase after the initial build
V0.1 is live! Tournament pages are now up!
The first alpha of Tour Breakdown is out for testing. Tournament pages are live — here’s what’s on them:
- Course profile
see which strokes gained categories matter most at each course, with a normalized SG spread chart and auto-generated insight text
- Hole-by-hole difficulty
every hole scored against par with the hardest and easiest holes highlighted
- Approach distance breakdown
donut chart showing the distribution of approach distances with club labels and per-hole detail
- SG leaderboard
sortable table with per-player strokes gained across OTT, APP, ARG, PUTT, T2G, and Total, plus round-by-round sparkline trends
- Category leaders & Field Pulse
see who’s leading each SG category at a glance, and how the field splits between gaining, neutral, and losing
Auto-generated from git history