getscorebug.app
A marketing site that is mostly generated
getscorebug.app is Scorebug's marketing site: fifteen route files that generate more than two hundred pages. Nineteen league pages, one hundred and fifty-four club gear pages and forty-seven rivalry pages are written once and produced from data, and the whole site's launch messaging turns on a single switch.
- Status
- Live
- Year
- 2025 – present
getscorebug.app, the live site
01Brief
The problem
A product with nineteen leagues and a hundred and fifty-four clubs has a long tail of things people actually search for: "Leafs vs Canadiens", "Oilers jerseys", "can I track the CFL". No hand-written marketing site is going to cover that. There was a harder problem too. The app's launch state kept changing, and every stale "Get it on Google Play" button was a factual claim about availability that happened to be false.
02Measured
By the numbers
The figures that describe the shape of the build. Each one was read off the live site itself.
234
pages from 15 route files
154
club pages, generated
Counted from the live sitemap · 4 September 2026
- 234URLs on the live sitemap: the fifteen route files, expanded.
03Process
The build
Decision by decision: how it is put together, and what each one bought.
15ROUTE FILES
234PAGES
Fifteen plates are drawn individually. The stack at the end of the last row stands for the remaining 219.
Fifteen route files, two hundred-odd pages
Leagues, club gear and rivalry matchups are each one dynamic route over a typed dataset, so a new league or a new club means one new row of data. That is where the long-tail search traffic comes from: every one of those pages answers a question somebody actually types, and none of them was written by hand.
One switch owns every launch claim
The site was advertising a Play Store listing that did not exist. Every store button led to Google's "requested URL was not found" page, and the same URL was being fed to search engines as an availability claim in structured data. Now a single constant, LAUNCH_STAGE, has three values: waitlist, testing, live. The nav button, the hero, the membership call to action, the footer and the structured data all read it. Flip the stage, deploy, and the whole site tells the truth again.
Affiliate commerce, disclosed
The gear pages carry Amazon Associates and partner links across a hundred and fifty-four clubs, and the shop runs headlessly against Shopify. The disclosure is printed on the page rather than buried somewhere off it. Commerce that funds the product without becoming the product.
Written for answer engines as well as search
Structured data on every generated page, a machine-readable brief at /llms.txt, and page copy that answers the question and stops. More and more of these questions get put to a model instead of a search box.
04Pages
Selected pages
Every page here was captured from the live site and set at the width a page is actually read. Each is cut to its own capture and runs at full measure, because a page shrunk into a column is a page nobody can read.
05Stack
What it runs on
The tools in production, grouped by the job they do.
- Application
- Next.js 14 App Router
- React
- TypeScript
- Tailwind CSS
- Generation
- Static generation
- Typed datasets
- Static export
- Commerce
- Amazon Associates
- Impact
- AvantLink
- Shopify
- Data
- ESPN public API
- Server-side proxy route
- Discovery
- JSON-LD
- llms.txt
- Sitemap
- OpenGraph




