App Router parity with the legacy website
Evidence that the normal App Router UI covers the legacy customer surface, returns the same public data, and retains the rebuilt performance architecture.
The normal App Router UI is the functional replacement for the legacy website across the customer-facing surface audited on September 2, 2026. It owns every production legacy page route, includes every legacy component reached by those routes, and passed a live rendered-output comparison on ten representative pages.
This supports a clear client message: the move changes the rendering platform and keeps the familiar normal design; it does not replace the product with the experimental design or a different data model.
Result
| Question | Evidence | Result |
|---|---|---|
| Does the normal App Router cover the legacy pages? | All 73 of 73 production legacy page routes have a canonical App Router route. | Yes |
| Are the components behind those pages present? | All 265 of 265 production-reachable legacy component paths have a normal-UI implementation or an explicit server-owned replacement. | Yes |
| Does the compatibility shell retain the same shared state? | All 8 of 8 legacy React contexts are present. | Yes |
| Does it show the same public data? | The ten-route browser audit passed 10 of 10 routes. Every comparable legacy entity link was present in the App Router output. 100 Club and Player Stats had exact visible-text parity. | Yes, for the audited public surface |
| Does it retain the rebuilt performance work? | The normal UI uses the shared server loaders and feature controllers, Nuqs URL state, SWR retention, Partial Prerendering, caching, and nearby Suspense boundaries documented in the classic performance report. | Yes |
The separate API contract suite remains the deeper data check. Its previous production-mode comparison covered all 218 of 218 ported legacy API routes and ran 1,357 cases. It found no public happy-path data mismatch among the generated residual cases. See Production replacement parity for the full API and integration evidence.
What was compared
The browser comparison loaded legacy and App Router pages against the same current development data and checked HTTP status, canonical destination, visible text, player/team/fixture/league/referee links, page exceptions, failed same-origin requests, hydration errors, missing React keys, and Next.js prerender warnings.
The representative set covered:
- Home, 100 Club, Player Stats, Prop Screener, and Referees
- Pricing and Blog
- one player detail page and one fixture detail page
- Value Bets V2
All ten routes passed. Entity-link containment was 100% wherever either site had comparable data links. Some pages have lower whole-page text overlap because the App Router exposes more navigation or entity detail than legacy; the comparison treats additional content as an intentional difference rather than missing legacy data.
Gaps fixed during the audit
The audit found one real normal-UI feature lag in Value Bets V2. The App Router already used the faster shared controller, but its normal presentation lacked the latest legacy bankroll manager, dense scanner table, tracker search, bankroll-scoped tracker totals, and team-bet tracking. Those interactions now run through the normal UI while preserving its existing appearance.
The audit also found request-time reads above a Suspense boundary on blog and entity routes. Notion content loaders now use bounded Next.js caches, and all ten request-time football and basketball entity route families stream their dynamic work below a route-local fallback. The browser audit no longer records uncached-prerender, hydration, or missing-key errors from the App Router pages.
Regression tests now protect:
- the 73-route inventory;
- the 265 production-reachable component inventory;
- all eight compatibility contexts;
- the Value Bets V2 scanner, bankroll, search, and team-tracking behavior;
- the entity-route Suspense boundaries and cached content loaders.
Performance foundation
The normal UI and experimental UI remain different renderers over shared feature logic for the audited paired tools. The normal renderer keeps its layout and styling, while the shared layer owns requests, typed Nuqs state, pagination, retained SWR data, mutations, access decisions, and derived rows.
The latest focused production benchmark measured 272.1 successful requests per second on 100 Club and 340.1 on Player Stats, with no failures through 2,048 concurrent connections. Both public documents return a reusable five-minute cache policy and a Partial Prerendering marker. Player Stats was 2.0× the preceding rebuilt artifact's peak; 100 Club was 52.3% higher. The methodology and limits are in Classic web performance convergence.
These are measured web results. They should not be presented as the API's roughly 40× result: the web and API benchmarks measure different work.
Intentional differences from legacy
The following differences are expected and do not indicate missing data:
- The normal App Router keeps the existing classic visual design, while the experimental UI remains a separate presentation.
- Entity IDs are authoritative. A stale or mismatched slug is redirected to its canonical URL; legacy can return an error for the same input.
- Server-rendered titles, canonical links, language alternates, and accessible headings are more complete on the App Router.
- Premium page presentation is temporarily public while plans are being reworked. Account-specific actions and protected API operations still require the appropriate session. This is an explicit product switch, not a parity accident.
What remains a release-environment check
No responsible audit can claim that every possible signed-in and third-party flow has completed end to end without the required test accounts and provider configuration. The remaining checks are the authenticated browser persona matrix, hosted Stripe checkout and portal, Telegram delivery, and production monitoring. Handler, authorization, persistence, and route-level tests already cover the underlying application logic.
These checks do not point to a missing public page or public-data mismatch. They are deployment assurance for account-specific and external systems.
Reproduce the web checks
With the API and both web applications running:
cd apps/web-app-router
pnpm typecheckThe browser parity harness and its source-text UI contracts were retired when the repository prohibited UI tests. This historical report keeps their results as migration context, but they are no longer executable checks.
Nitro Fetch adoption research
Verified API, runtime limits, migration risks, and an adoption boundary for Nitro Fetch across the Expo applications.
Database health investigation
A read-only investigation of the configured 35 GB StatsHub mirror, covering feed freshness, data integrity, query plans, storage, indexes, security, and recovery posture on 2 September 2026.