FullOut

Changelog

Track all updates, improvements, and fixes to FullOut

Latest

Version 0.2.348

PROFILE: punctuation-tolerant gym/team search + remove Social Links from Highlights tab

May 8, 2026 at 5:00 AM GMT+0
93022fb
๐Ÿ”„Changed
  • Gym and team search (used by the experience editor on the profile) now normalizes punctuation in the query and matches each token independently. Typing 'cheer athletics frisco' now finds 'Cheer Athletics - Frisco' without the user needing to add the dash.
๐Ÿ—‘๏ธRemoved
  • The 'Social Links' section (VideoManager with the paste-a-link form) is no longer rendered on the profile Highlights tab. The Highlights tab now shows only the user's pinned highlight posts. EmbeddedVideo data and the VideoManager component remain available wherever else they're used.

Files Changed

Modified (6):
  • ~ src/app/api/gyms/route.ts
  • ~ src/app/api/teams/route.ts
  • ~ src/components/profile/profile-highlights-tab.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ package.json
  • ~ CHANGELOG.json

Version 0.2.347

FEED: new Global tab + author team/gym byline on every media post

May 8, 2026 at 5:00 AM GMT+0
4c7e9de
โœจAdded
  • New Global feed at /global โ€” reverse-chronological firehose of every public PersonPhoto + ProfileVideo upload across the platform. Guest-accessible (no login required) so new visitors can discover athletes before they pick anyone to follow.
  • Third tab between For You and Hub in the feed tab nav, on /home, /global, and /news.
๐Ÿ”„Changed
  • Photo and video posts in the For You feed (and the new Global feed) now display the author's current team and gym under their name, sourced from the most recent ongoing PersonExperience. Mirrors the team ยท gym pattern already used by performance cards.
  • FeedList component accepts an apiPath prop so /global can paginate against /api/feed/global while /home keeps using /api/feed.

Files Changed

Modified (10):
  • ~ src/app/api/feed/route.ts
  • ~ src/app/home/page.tsx
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/feed-tabs-nav.tsx
  • ~ src/app/api/feed/global/route.ts
  • ~ src/app/global/page.tsx
  • ~ src/lib/feed/current-team-byline.ts
  • ~ src/lib/feed/global-feed.ts
  • ~ package.json
  • ~ CHANGELOG.json

Version 0.2.346

DATA: backfill Worlds 2026 Prelims + Semi-Finals scores (was Finals-only)

May 8, 2026 at 5:00 AM GMT+0
56c07e9
โœจAdded
  • Worlds 2026 Prelims scores โ€” 71 performances across 5 wild-card divisions
  • Worlds 2026 Semi-Finals scores โ€” 488 performances across all 29 divisions
  • /competitions/cheerleading-worlds-2026 now shows the full Prelims โ†’ Semi-Finals โ†’ Finals progression for every team that competed
๐Ÿ”„Changed
  • scripts/import/scrape-worlds-2026-results.ts and import-worlds-2026-results.ts now take a --round flag (prelims | semi-finals | finals); finals remains the default for backward compat

Files Changed

Modified (2):
  • ~ scripts/import/scrape-worlds-2026-results.ts
  • ~ scripts/import/import-worlds-2026-results.ts

Version 0.2.345

PRIVACY: 4-tier profile visibility (Only me / People I follow / FullOut users / Everyone)

May 8, 2026 at 6:27 PM GMT+0
b843885
๐Ÿ”„Changed
  • PRIVACY: 4-tier profile visibility (Only me / People I follow / FullOut users / Everyone)
  • Replaces binary Person.isPublic with a Person.visibility enum and applies
  • the chokepoint helper across every surface that lists or links to a Person:
  • profile page (including SEO metadata + OG image), team rosters, gym rosters,
  • /people directory, search APIs, follower/following lists, PDF export, and
  • the discover/PCL/athlete-spotlight content surfaces.

Files Changed

Created (4):
  • + scripts/debug/test-profile-visibility.ts
  • + scripts/maintenance/backfill-profile-visibility.ts
  • + src/components/profile/profile-privacy-dialog.tsx
  • + src/lib/profile-visibility.ts
Modified (20):
  • ~ prisma/schema.prisma
  • ~ scripts/debug/test-profile-visibility.ts
  • ~ scripts/maintenance/backfill-profile-visibility.ts
  • ~ src/app/[username]/people/page.tsx
  • ~ src/app/api/pdf/profile/[username]/route.tsx
  • ~ src/app/api/people/search/route.ts
  • ~ src/app/api/person/[id]/route.ts
  • ~ src/app/api/person/follow-list/route.ts
  • ~ src/app/api/search/route.ts
  • ~ src/app/discover/page.tsx
  • ~ src/app/gyms/[id]/athletes/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/pcl/page.tsx
  • ~ src/app/people/[username]/opengraph-image.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/page.tsx
  • ~ src/app/teams/[id]/athletes/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/profile/profile-card-clean.tsx
  • ~ src/components/profile/profile-privacy-dialog.tsx

Version 0.2.344

PROFILE: 4-tier privacy controls (Only me, People I follow, FullOut users, Everyone)

May 7, 2026 at 5:00 AM GMT+0
bdd54ce
โœจAdded
  • PROFILE: 4-tier privacy controls in the profile overflow menu โ€” Only me, People I follow, FullOut users, Everyone (default)
  • Profile visibility filter applied across team rosters, gym rosters, /people directory, search, follower/following lists, OG image, and PDF export
  • Private profiles return noindex metadata and a generic OG image (no name/photo/team leak via SEO)
๐Ÿ”„Changed
  • Replaced binary Person.isPublic with a Person.visibility enum (ProfileVisibility). Legacy isPublic stays in sync until removed in a follow-up migration.
  • 'People I follow' tier semantics: following someone consents to letting them see your profile (owner-controlled circle).

Files Changed

Modified (22):
  • ~ prisma/schema.prisma
  • ~ src/lib/profile-visibility.ts
  • ~ src/components/profile/profile-privacy-dialog.tsx
  • ~ src/components/profile/profile-card-clean.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/[username]/opengraph-image.tsx
  • ~ src/app/people/page.tsx
  • ~ src/app/[username]/people/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/app/teams/[id]/athletes/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/gyms/[id]/athletes/page.tsx
  • ~ src/app/discover/page.tsx
  • ~ src/app/pcl/page.tsx
  • ~ src/app/api/search/route.ts
  • ~ src/app/api/people/search/route.ts
  • ~ src/app/api/person/follow-list/route.ts
  • ~ src/app/api/person/[id]/route.ts
  • ~ src/app/api/pdf/profile/[username]/route.tsx
  • ~ src/lib/content/athlete-spotlight.ts
  • ~ scripts/maintenance/backfill-profile-visibility.ts
  • ~ scripts/debug/test-profile-visibility.ts

Version 0.2.343

NAV: align expanded/collapsed sidebar shape; move Post button above Collapse

May 8, 2026 at 5:34 PM GMT+0
3bc5bdc
๐Ÿ”„Changed
  • NAV: align expanded/collapsed sidebar shape; move Post button above Collapse
  • Groups in the desktop sidebar no longer persist their open/close state to
  • localStorage โ€” they default to closed and only auto-open when a child
  • route is active. This makes the expanded sidebar's default structure
  • match the icon-only collapsed sidebar (same 9 top-level rows).
  • Also moves the Post CTA from the top of the nav to directly above the

Files Changed

Modified (2):
  • ~ src/components/dashboard/nav-group-item.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.342

NAV: add Post button to desktop sidebar

May 8, 2026 at 4:52 PM GMT+0
fcb3c02
๐Ÿ”„Changed
  • NAV: add Post button to desktop sidebar
  • Mirrors the mobile bottom-nav "+" pill. Wires up the existing onPostClick
  • prop (already passed by app-shell) so the sidebar opens the same
  • PostDialog the desktop shell already had plumbed.

Files Changed

Modified (1):
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.341

NAV: stop Profile from highlighting on My Stuff routes

May 7, 2026 at 2:41 PM GMT+0
a353f54
๐Ÿ”„Changed
  • NAV: stop Profile from highlighting on My Stuff routes
  • Profile's match list included bare /${username}, which prefix-matched
  • every /${username}/* My Stuff route (My Teams, My People, etc.) and
  • lit Profile up alongside the active item. The bare path isn't a real
  • route โ€” Profile lives at /@${username} โ€” so the matcher entry was
  • dead weight that happened to break the active state.

Files Changed

Modified (1):
  • ~ src/lib/nav-config.ts

Version 0.2.340

NAV: fix bottom nav floating mid-screen in iOS PWA โ€” portal to body + force composite layer

May 7, 2026 at 2:37 PM GMT+0
1a0ef5e
๐Ÿ”„Changed
  • NAV: fix bottom nav floating mid-screen in iOS PWA โ€” portal to body + force composite layer
  • Portal MobileBottomNav directly to document.body so no React-tree ancestor
  • can ever introduce a transform that breaks position:fixed. Sibling-rendering
  • (commit 6cdc484) relied on Providers never introducing transformed DOM โ€”
  • fragile contract. Portal makes the chokepoint enforcement durable.
  • Add transform: translateZ(0) on the fixed wrapper to force a GPU composite

Files Changed

Modified (1):
  • ~ src/components/app-shell.tsx

Version 0.2.339

PAYOUTS: escape apostrophe in Awaiting review description

May 7, 2026 at 12:09 AM GMT+0
9e8314e
๐Ÿ”„Changed
  • PAYOUTS: escape apostrophe in Awaiting review description
  • Vercel build was failing on react/no-unescaped-entities.

Files Changed

Modified (1):
  • ~ src/app/admin/partners/payouts/page.tsx

Version 0.2.338

SCHEDULE: import 2026 D2 Summit performance order from Varsity PDF

May 7, 2026 at 12:08 AM GMT+0
a7655df
๐Ÿ”„Changed
  • SCHEDULE: import 2026 D2 Summit performance order from Varsity PDF
  • Imports 1324 entries (905 confirmed teams + 419 TBD finals slots) across
  • 3 days and 5 venues at ESPN Wide World of Sports. 89% triple-matched
  • auto-imported, 50 flagged for review, real unmatched teams under 20.
  • Multi-track block-schedule layout: lines can carry 1-2 division markers
  • (e.g., "L4 SCM #2 L4 SS-A #1 Titan Elite - Immortals") โ€” disambiguated

Files Changed

Created (3):
  • + scripts/debug/decode-d2-divisions.ts
  • + scripts/debug/verify-flex-meaning.ts
  • + scripts/import/import-d2-summit-2026-schedule.ts
Modified (3):
  • ~ scripts/debug/decode-d2-divisions.ts
  • ~ scripts/debug/verify-flex-meaning.ts
  • ~ scripts/import/import-d2-summit-2026-schedule.ts

Version 0.2.337

PARTNERS: lookup by email OR username in Add Partner form

May 6, 2026 at 11:58 PM GMT+0
4b07faa
๐Ÿ”„Changed
  • PARTNERS: lookup by email OR username in Add Partner form
  • The /api/admin/users search already covered username, but the endpoint's
  • select omitted it โ€” so the form's slug-from-username fallback (line 64)
  • silently never fired. Adds username to the select and surfaces it in the
  • form: relabeled input, Enter-to-search, and an exact-match preference so
  • a partial query like 'joe' no longer grabs whichever joe* was created

Files Changed

Modified (2):
  • ~ src/app/api/admin/users/route.ts
  • ~ src/components/admin/partner-form.tsx

Version 0.2.336

DEBUG: check out scripts from recent investigations

May 6, 2026 at 11:47 PM GMT+0
c383a41
๐Ÿ›Fixed
  • DEBUG: check out scripts from recent investigations
  • Adds the one-off investigation + maintenance scripts that have been
  • sitting untracked for a while:
  • scripts/health/check-partner-system.ts โ€” health check for the
  • partner/affiliate system end-to-end.
  • scripts/debug/check-d2-summit.ts, check-summit-finals-detail.ts,

Files Changed

Created (9):
  • + scripts/debug/check-d2-summit.ts
  • + scripts/debug/check-novacats-logos.ts
  • + scripts/debug/check-summit-finals-detail.ts
  • + scripts/debug/check-summit-finals-gap.ts
  • + scripts/debug/check-woodlands-elite.ts
  • + scripts/debug/check-woodlands-logos.ts
  • + scripts/debug/find-babygraham.ts
  • + scripts/debug/fix-sot-city.ts
  • + scripts/health/check-partner-system.ts
Modified (9):
  • ~ scripts/debug/check-d2-summit.ts
  • ~ scripts/debug/check-novacats-logos.ts
  • ~ scripts/debug/check-summit-finals-detail.ts
  • ~ scripts/debug/check-summit-finals-gap.ts
  • ~ scripts/debug/check-woodlands-elite.ts
  • ~ scripts/debug/check-woodlands-logos.ts
  • ~ scripts/debug/find-babygraham.ts
  • ~ scripts/debug/fix-sot-city.ts
  • ~ scripts/health/check-partner-system.ts

Version 0.2.335

OG: refresh subtitle to lead with concrete benefits

May 6, 2026 at 11:47 PM GMT+0
775b632
๐Ÿ”„Changed
  • OG: refresh subtitle to lead with concrete benefits
  • Replaces the abstract "Competitive cheerleading, organized." with a
  • benefits-led line: live scores, season history, free athlete profiles.
  • Same image, sharper hook for link previews.

Files Changed

Modified (1):
  • ~ src/app/opengraph-image.tsx

Version 0.2.334

PAYOUTS: partner-requested payouts with admin queue, email + in-app alerts

May 6, 2026 at 11:35 PM GMT+0
b35b9b6
๐Ÿ”„Changed
  • PAYOUTS: partner-requested payouts with admin queue, email + in-app alerts
  • End-to-end affiliate payout request flow.
  • PARTNER SIDE (settings โ†’ affiliate)
  • "Request payout" button on the Pending card, gated on
  • available balance >= partner.payoutMinimumCents and disabled when an
  • in-flight request already exists (one at a time).

Files Changed

Created (5):
  • + src/app/admin/partners/payouts/page.tsx
  • + src/app/api/admin/partners/payouts/[payoutId]/mark-paid/route.ts
  • + src/app/api/admin/partners/payouts/[payoutId]/reject/route.ts
  • + src/app/api/partner/dashboard/payouts/request/route.ts
  • + src/components/admin/partners/payout-queue-client.tsx
Modified (11):
  • ~ prisma/schema.prisma
  • ~ src/app/admin/partners/page.tsx
  • ~ src/app/admin/partners/payouts/page.tsx
  • ~ src/app/api/admin/partners/payouts/[payoutId]/mark-paid/route.ts
  • ~ src/app/api/admin/partners/payouts/[payoutId]/reject/route.ts
  • ~ src/app/api/partner/dashboard/payouts/request/route.ts
  • ~ src/app/api/partner/dashboard/stats/route.ts
  • ~ src/components/admin/partners/payout-queue-client.tsx
  • ~ src/components/partner/partner-dashboard.tsx
  • ~ src/lib/email.ts
  • ~ src/lib/notifications.ts

Version 0.2.333

BADGES: fix Elite tooltip label โ€” was reading "Prep subscriber"

May 6, 2026 at 11:00 PM GMT+0
0005f53
๐Ÿ”„Changed
  • BADGES: fix Elite tooltip label โ€” was reading "Prep subscriber"

Files Changed

Modified (1):
  • ~ src/components/profile/tier-verification-badge.tsx

Version 0.2.332

UI: cleaner division detail rows โ€” drop medal emojis, surface gym name

May 6, 2026 at 10:46 PM GMT+0
c460c98
๐Ÿ”„Changed
  • UI: cleaner division detail rows โ€” drop medal emojis, surface gym name
  • Replaces ๐Ÿฅ‡๐Ÿฅˆ๐Ÿฅ‰/#N placement glyphs with consistent #N for top-3 too.
  • Emoji rendering varies wildly across platforms and looked decorative
  • next to the otherwise dense, tabular score rows.
  • Adds the gym name (linked to the gym page) under team name on each
  • score row, hidden on mobile (`hidden sm:inline`) to avoid crowding

Files Changed

Modified (1):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx

Version 0.2.331

UI: align mobile bottom-nav Post button with icon+label rhythm

May 6, 2026 at 10:46 PM GMT+0
9b9decf
๐Ÿ”„Changed
  • UI: align mobile bottom-nav Post button with icon+label rhythm
  • The center compose button was a popped-up 44px FAB (-mt-5, no label),
  • which broke the rhythm of the surrounding icon+label nav items. Now it
  • matches its siblings: column layout, 28px pink badge with Plus icon
  • above a "Post" label, so the whole row reads as five aligned objects
  • instead of "four nav items + a floating button."

Files Changed

Modified (1):
  • ~ src/components/app-shell.tsx

Version 0.2.330

BADGES: refresh tier verification colors โ€” Pro = brand pink, Elite = soft cyan

May 6, 2026 at 10:45 PM GMT+0
79fe001
๐Ÿ”„Changed
  • BADGES: refresh tier verification colors โ€” Pro = brand pink, Elite = soft cyan
  • Tier checkmark badge moves to the brand palette: Pro fills with hero pink
  • (#EE2B8C / --primary) + white check; Elite fills with soft cyan (#91E5E5)
  • + deep-teal check (#0F4C4C) for tonal cohesion. Replaces the old generic
  • blue + yellow.
  • Also moves the PRO row in `tierColors` from hardcoded pink-* Tailwind

Files Changed

Modified (2):
  • ~ src/components/profile/tier-verification-badge.tsx
  • ~ src/lib/design-tokens.ts

Version 0.2.329

URLS: route person search results to /people/<username>, not opaque ID

May 6, 2026 at 10:44 PM GMT+0
c188cc7
๐Ÿ”„Changed
  • URLS: route person search results to /people/<username>, not opaque ID
  • Search results now carry the username as `slug` so consumers can build
  • the human-readable /people/<username> URL. The dynamic route accepts
  • either shape, but the username path was 404'ing for follows because the
  • fallback used Person.id directly.

Files Changed

Modified (2):
  • ~ src/app/api/search/route.ts
  • ~ src/components/home-search.tsx

Version 0.2.328

SKILLS+VERIFY: by-level visualization, click-to-add, pink hero, 20s video cap

May 6, 2026 at 10:42 PM GMT+0
3a89f32
๐Ÿ”„Changed
  • SKILLS+VERIFY: by-level visualization, click-to-add, pink hero, 20s video cap
  • Skills tab on profiles is now organized by USP level (1, 2, 3, 4, 4.2, 5,
  • 6-Junior, 6-Worlds) instead of category. Each level is a collapsible card
  • showing claimed/total + a pink progress bar; collapsed by default so the
  • landscape is browsable without overwhelming the page.
  • Every rubric skill renders (claimed + unclaimed), so viewers can see what

Files Changed

Created (1):
  • + scripts/debug/seed-fullout-skills.ts
Modified (7):
  • ~ scripts/debug/seed-fullout-skills.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/[username]/skills/[personSkillId]/verify/page.tsx
  • ~ src/components/pdf/profile-pdf-document.tsx
  • ~ src/components/people/person-skills-manager.tsx
  • ~ src/components/showcase/showcase-profile-view.tsx
  • ~ src/components/verification/verification-upload-client.tsx

Version 0.2.327

SKILLS+VERIFY: by-level visualization, click-to-add, pink hero color, 20s video cap

May 6, 2026 at 11:00 PM GMT+0
pending
๐Ÿ”„Changed
  • Skills tab on profiles is now organized by USP level (1, 2, 3, 4, 4.2, 5, 6-Junior, 6-Worlds) instead of category. Each level is a collapsible card showing claimed/total count and a pink progress bar. Levels are collapsed by default โ€” expand the ones you care about.
  • Every rubric skill is rendered (mastered + unmastered) so viewers can see what an athlete has and hasn't claimed at each level. Unclaimed skills appear as ghost chips.
  • FullOut Verified hero color swapped from emerald to brand pink (#EE2B8C) across the chip, showcase preview, and PDF profile export.
  • Under-review chips moved from amber to soft cyan (#91E5E5) for a calmer in-progress signal.
  • Skills tab copy updated: 'Track your mastered skills. Submit them for review to become FullOut Verified.'
  • Verify page now states the constraints up front: one skill per video, 20s max, three separate clips.
โœจAdded
  • Click-to-add: clicking any unclaimed (ghost) chip on the skills tab adds it as self-reported instantly โ€” no modal. Hover state telegraphs clickability with a pink tint and Plus icon. Spinner shows while the request is in flight.
  • Color legend at the top of the skills tab so viewers know what each chip state means at a glance.
  • Per-level progress bar in each level header showing claimed/total proportion (visible on mobile too).
  • Tooltip-on-hover for every chip showing the full skill name + status (e.g. 'Verified ยท 4/15/2026'). Replaces native title with Radix Tooltip.
  • 20-second client-side cap on verification video uploads. Files are probed via a hidden <video> element before upload โ€” clips longer than 20s are rejected with the actual duration in the error toast, saving bandwidth.
๐Ÿ—‘๏ธRemoved
  • Add Skill modal and its search/filter UI โ€” the by-level grid replaces it. Roughly 150 lines of dialog code retired.
๐Ÿ›Fixed
  • Verify-skill upload link previously pointed at /people/<personId>/... and 404'd because the route expects a username. Now uses person.username with proper URL-encoding.

Files Changed

Created (1):
  • + scripts/debug/seed-fullout-skills.ts
Modified (6):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/[username]/skills/[personSkillId]/verify/page.tsx
  • ~ src/components/people/person-skills-manager.tsx
  • ~ src/components/showcase/showcase-profile-view.tsx
  • ~ src/components/pdf/profile-pdf-document.tsx
  • ~ src/components/verification/verification-upload-client.tsx

Version 0.2.326

SUBSCRIBE+CANCEL+TRIAL: trial-end Klaviyo event, Resume button, banked months UI, cancellation banner

May 6, 2026 at 10:11 PM GMT+0
5828d4b
๐Ÿ”„Changed
  • SUBSCRIBE+CANCEL+TRIAL: trial-end Klaviyo event, Resume button, banked months UI, cancellation banner
  • Trial-ending notification (the actual bug)
  • Webhook now handles customer.subscription.trial_will_end. Stripe fires
  • this 3 days before trial_end automatically; we forward to Klaviyo as a
  • "Trial Ending" event with tier, end date, charge amount, and cadence so
  • a Klaviyo flow can send "your card will be charged on {date}" with a

Files Changed

Created (3):
  • + src/app/api/stripe/resume/route.ts
  • + src/components/subscription/cancellation-banner.tsx
  • + src/components/subscription/resume-inline-button.tsx
Modified (11):
  • ~ src/app/api/stripe/resume/route.ts
  • ~ src/app/api/stripe/webhook/route.ts
  • ~ src/app/layout.tsx
  • ~ src/app/settings/page.tsx
  • ~ src/app/subscribe/page.tsx
  • ~ src/app/subscribe/subscribe-page-client.tsx
  • ~ src/components/settings/settings-layout.tsx
  • ~ src/components/settings/subscription-actions.tsx
  • ~ src/components/subscription/cancellation-banner.tsx
  • ~ src/components/subscription/resume-inline-button.tsx
  • ~ src/lib/klaviyo.ts

Version 0.2.325

PROMO: clearer admin form copy + Stripe coupon-mapping unit tests

May 6, 2026 at 9:50 PM GMT+0
69f6e5c
๐Ÿ”„Changed
  • PROMO: clearer admin form copy + Stripe coupon-mapping unit tests
  • Rewrites the Create/Edit Promo Code dialog so non-engineers can read it:
  • Three preset buttons (1 month free, free forever, 50% off 3 months)
  • Duration field relabeled with an inline cheat-sheet (1 / 6 / blank)
  • Live "What the user gets" preview that mirrors the Stripe coupon shape
  • Extracts buildStripeCouponParams() into src/lib/promo-coupon-mapping.ts

Files Changed

Created (3):
  • + scripts/health/check-promo-stripe-mapping.ts
  • + src/lib/__tests__/promo-coupon-mapping.test.ts
  • + src/lib/promo-coupon-mapping.ts
Modified (5):
  • ~ scripts/health/check-promo-stripe-mapping.ts
  • ~ src/app/api/stripe/create-checkout/route.ts
  • ~ src/components/admin/promo-code-form.tsx
  • ~ src/lib/__tests__/promo-coupon-mapping.test.ts
  • ~ src/lib/promo-coupon-mapping.ts

Version 0.2.324

FIX: don't bounce off /login when ?switch or ?add and useSession is stale

May 6, 2026 at 9:45 PM GMT+0
a0b234a
๐Ÿ›Fixed
  • FIX: don't bounce off /login when ?switch or ?add and useSession is stale
  • Account switcher fall-back ended on a blank page: signOut sometimes can't
  • clear the session cookie (e.g. COOKIE_DOMAIN drift), so useSession still
  • reports "authenticated" on /login. The form returned null and redirected
  • to /home, which redirected back to /login โ€” a loop that rendered blank.
  • Always show the form on the explicit switch/add flows so a fresh sign-in

Files Changed

Modified (1):
  • ~ src/app/login/page.tsx

Version 0.2.323

CHORE: gitignore /og-previews/ โ€” local design-review PNG dumps

May 6, 2026 at 9:29 PM GMT+0
dd309a6
๐Ÿ”„Changed
  • CHORE: gitignore /og-previews/ โ€” local design-review PNG dumps
  • Generated by curling the OG image routes from prod for visual QA;
  • shouldn't ship in the repo.

Version 0.2.322

SUBSCRIBE+CANCEL: surface referrer profile + trial copy on subscribe; cancel at period end

May 6, 2026 at 9:28 PM GMT+0
29490e5
๐Ÿ”„Changed
  • SUBSCRIBE+CANCEL: surface referrer profile + trial copy on subscribe; cancel at period end
  • Subscribe page
  • Show the referrer's avatar, name, and profile link in the green
  • callout when arriving via a ?ref= URL. /api/referral/validate now
  • returns name/username/image instead of hardcoded "A friend".
  • Mirror the server-side REFERRAL coupon client-side so the Order

Files Changed

Modified (7):
  • ~ src/app/api/referral/validate/route.ts
  • ~ src/app/api/stripe/cancel/route.ts
  • ~ src/app/api/user/delete/route.ts
  • ~ src/app/settings/page.tsx
  • ~ src/app/subscribe/subscribe-page-client.tsx
  • ~ src/components/settings/billing-management.tsx
  • ~ src/components/settings/subscription-actions.tsx

Version 0.2.321

ADJUST: bump OG card text sizes/weights + load real Inter font

May 6, 2026 at 9:05 PM GMT+0
c3776d5
๐Ÿ”„Changed
  • ADJUST: bump OG card text sizes/weights + load real Inter font
  • Per design feedback that the OG cards looked thin/small:
  • Load Inter from Google Fonts at render time (subsetted to only the
  • glyphs each card uses, ~80% bandwidth saving) and pass to
  • ImageResponse so fontWeight 700-900 actually renders heavy. Without
  • this Satori falls back to its built-in font where every weight looks

Files Changed

Modified (5):
  • ~ src/app/gyms/[id]/opengraph-image.tsx
  • ~ src/app/opengraph-image.tsx
  • ~ src/app/people/[username]/opengraph-image.tsx
  • ~ src/app/teams/[id]/opengraph-image.tsx
  • ~ src/lib/og-shared.tsx

Version 0.2.320

FIX: team KPI strip overlapping sidebar + truncating labels at lg

May 6, 2026 at 9:01 PM GMT+0
7aa4a70
๐Ÿ›Fixed
  • FIX: team KPI strip overlapping sidebar + truncating labels at lg
  • Switched the strip to a 3-col grid at lg (5-col at xl) and removed the
  • mobile edge-bleed margins once the sidebar layout activates, so the
  • cards stay inside the left column instead of crashing into the Athletes
  • sidebar. Trimmed cell padding to px-3 at lg so "PERFORMANCES" fits.

Files Changed

Modified (1):
  • ~ src/components/teams/team-stats-strip.tsx

Version 0.2.319

FIX: inline FullOut logo as base64 so OG entity routes actually find it

May 6, 2026 at 8:07 PM GMT+0
ec772c1
๐Ÿ›Fixed
  • FIX: inline FullOut logo as base64 so OG entity routes actually find it
  • outputFileTracingIncludes globs with bracketed dynamic segments like
  • [id] don't reliably bundle public/ assets โ€” minimatch treats brackets
  • as character classes. The brand /opengraph-image route worked because
  • its key was a simple path; /teams/[id]/opengraph-image kept ENOENT'ing.
  • Inline the 84KB PNG as a base64 data URI in src/lib/og-logo.ts. The

Files Changed

Created (1):
  • + src/lib/og-logo.ts
Modified (2):
  • ~ src/lib/og-logo.ts
  • ~ src/lib/og-shared.tsx

Version 0.2.318

FIX: bundle public/Logos with OG image routes via outputFileTracingIncludes

May 6, 2026 at 7:59 PM GMT+0
cf7fa16
๐Ÿ›Fixed
  • FIX: bundle public/Logos with OG image routes via outputFileTracingIncludes
  • The redesigned OG cards read the FullOut logo PNG with fs.readFile, but
  • the public/ directory isn't auto-traced into Vercel's serverless bundles.
  • Result: ENOENT on every entity OG render. Following the existing pattern
  • in this config (already used for /api/admin/.../scorecards and the cron
  • content routes) to explicitly include public/Logos for the four OG routes.

Version 0.2.317

ADJUST: bigger FullOut logo + Build Your Legacy tagline + higher contrast on OG cards

May 6, 2026 at 7:53 PM GMT+0
02a54b5
๐Ÿ”„Changed
  • ADJUST: bigger FullOut logo + Build Your Legacy tagline + higher contrast on OG cards
  • Per design feedback:
  • Replace the small text wordmark with the actual FullOut logo PNG
  • (read once per cold start from public/Logos and embedded as a base64
  • data URI so the renderer doesn't depend on a reachable host)
  • Add the "Build Your Legacy" tagline directly under the logo on every

Files Changed

Modified (5):
  • ~ src/app/gyms/[id]/opengraph-image.tsx
  • ~ src/app/opengraph-image.tsx
  • ~ src/app/people/[username]/opengraph-image.tsx
  • ~ src/app/teams/[id]/opengraph-image.tsx
  • ~ src/lib/og-shared.tsx

Version 0.2.316

FIX: drop explicit openGraph.images so file-based OG cards take effect

May 6, 2026 at 7:36 PM GMT+0
45a4dc1
๐Ÿ›Fixed
  • FIX: drop explicit openGraph.images so file-based OG cards take effect
  • The new src/app/opengraph-image.tsx (brand) and
  • src/app/people/[username]/opengraph-image.tsx (profile) cards weren't
  • showing up because both pages set openGraph.images explicitly in their
  • generateMetadata, which beats the file-based metadata convention.
  • Removing the explicit array lets Next.js auto-attach the rendered PNGs.

Files Changed

Modified (2):
  • ~ src/app/page.tsx
  • ~ src/app/people/[username]/page.tsx

Version 0.2.315

ADD: branded opengraph-image cards for profiles, gyms, teams + brand fallback

May 6, 2026 at 7:29 PM GMT+0
0230b40
โœจAdded
  • ADD: branded opengraph-image cards for profiles, gyms, teams + brand fallback
  • Drops the one-off /build-your-legacy OG image and replaces it with a
  • cascading set:
  • src/app/opengraph-image.tsx โ€” brand fallback (FullOut ยท Build Your
  • Legacy) used by every route that doesn't override it
  • src/app/people/[username]/opengraph-image.tsx โ€” avatar + name + handle

Files Changed

Created (5):
  • + src/app/gyms/[id]/opengraph-image.tsx
  • + src/app/opengraph-image.tsx
  • + src/app/people/[username]/opengraph-image.tsx
  • + src/app/teams/[id]/opengraph-image.tsx
  • + src/lib/og-shared.tsx
Modified (6):
  • ~ src/app/build-your-legacy/opengraph-image.tsx
  • ~ src/app/gyms/[id]/opengraph-image.tsx
  • ~ src/app/opengraph-image.tsx
  • ~ src/app/people/[username]/opengraph-image.tsx
  • ~ src/app/teams/[id]/opengraph-image.tsx
  • ~ src/lib/og-shared.tsx

Version 0.2.314

ADD: opengraph-image.tsx for /build-your-legacy

May 6, 2026 at 7:12 PM GMT+0
47b0f05
โœจAdded
  • ADD: opengraph-image.tsx for /build-your-legacy
  • 1200x630 PNG generated from JSX via next/og, pulling the featured athlete
  • (currently @babygraham) from the DB. Auto-attached to the page via
  • Next.js metadata file convention, so any platform that scrapes the URL
  • (Slack, iMessage, Twitter, Discord, LinkedIn) shows a rich preview.
  • Cached for 1h. Directly downloadable at

Files Changed

Created (1):
  • + src/app/build-your-legacy/opengraph-image.tsx
Modified (1):
  • ~ src/app/build-your-legacy/opengraph-image.tsx

Version 0.2.313

FIX: escape apostrophes in referral admin + card so prod build passes

May 6, 2026 at 5:36 PM GMT+0
8472f37
๐Ÿ›Fixed
  • FIX: escape apostrophes in referral admin + card so prod build passes
  • ESLint react/no-unescaped-entities was failing the build, blocking the
  • SKILLS+VERIFY deploy that fixes the prod 500s on every user page.

Files Changed

Modified (2):
  • ~ src/app/admin/referrals/page.tsx
  • ~ src/components/settings/referral-card.tsx

Version 0.2.312

SKILLS+VERIFY: rebuild skills system on USP rubric + ship FullOut Verified Phase 1+2

May 6, 2026 at 5:27 PM GMT+0
d557426
๐Ÿ”„Changed
  • SKILLS+VERIFY: rebuild skills system on USP rubric + ship FullOut Verified Phase 1+2
  • Replaces the hand-curated 77-skill catalog with a versioned-rubric foundation
  • so atomic skills survive when scoring orgs republish levels season-to-season.
  • Atomic skills are durable (Back Handspring is always Back Handspring); the
  • level/tier they earn at lives in LevelRubricEntry per (ScoringSystem ร— season),
  • so when USP shifts a skill in 2027-2028 we add new mapping rows without

Files Changed

Created (13):
  • + scripts/debug/check-rubric-dupes.ts
  • + scripts/import/import-usp-rubric.ts
  • + src/app/admin/verification-queue/page.tsx
  • + src/app/api/admin/verifiers/route.ts
  • + src/app/api/person/[id]/skills/[personSkillId]/verification/route.ts
  • + src/app/api/skills/route.ts
  • + src/app/api/verification/[attemptId]/decision/route.ts
  • + src/app/api/verification/[attemptId]/media/route.ts
  • + src/app/api/verification/[attemptId]/submit/route.ts
  • + src/app/people/[username]/skills/[personSkillId]/verify/page.tsx
  • + src/components/admin/verification-queue-client.tsx
  • + src/components/verification/verification-upload-client.tsx
  • + src/lib/verification.ts
Modified (20):
  • ~ prisma/schema.prisma
  • ~ scripts/debug/check-rubric-dupes.ts
  • ~ scripts/import/import-usp-rubric.ts
  • ~ src/app/admin/page.tsx
  • ~ src/app/admin/verification-queue/page.tsx
  • ~ src/app/api/admin/verifiers/route.ts
  • ~ src/app/api/pdf/profile/[username]/route.tsx
  • ~ src/app/api/person/[id]/skills/[personSkillId]/route.ts
  • ~ src/app/api/person/[id]/skills/[personSkillId]/verification/route.ts
  • ~ src/app/api/person/[id]/skills/route.ts
  • ~ src/app/api/skills/route.ts
  • ~ src/app/api/verification/[attemptId]/decision/route.ts
  • ~ src/app/api/verification/[attemptId]/media/route.ts
  • ~ src/app/api/verification/[attemptId]/submit/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/[username]/skills/[personSkillId]/verify/page.tsx
  • ~ src/components/admin/verification-queue-client.tsx
  • ~ src/components/pdf/profile-pdf-document.tsx
  • ~ src/components/people/person-skills-manager.tsx
  • ~ src/components/showcase/showcase-profile-view.tsx

Version 0.2.311

AFFILIATE+REFERRAL: namespace campaign URLs, stackable referral months for everyone

May 6, 2026 at 5:01 PM GMT+0
bb98c0f
๐Ÿ”„Changed
  • AFFILIATE+REFERRAL: namespace campaign URLs, stackable referral months for everyone
  • Partner program
  • PartnerCampaign.code: drop global @unique, add @@unique([partnerId, code]).
  • Campaign URLs now live under the partner slug (?p=joe-rodgers/test-1)
  • so two partners can't collide on the same root code. Validate, track,
  • checkout, webhook, OG-metadata, referral, and admin paths all parse

Files Changed

Created (3):
  • + scripts/maintenance/build-partner-banners.ts
  • + src/app/admin/referrals/page.tsx
  • + src/lib/partner-code.ts
Modified (20):
  • ~ prisma/schema.prisma
  • ~ scripts/maintenance/build-partner-banners.ts
  • ~ src/app/admin/referrals/page.tsx
  • ~ src/app/api/admin/partners/[id]/campaigns/route.ts
  • ~ src/app/api/partner/dashboard/campaigns/route.ts
  • ~ src/app/api/partner/dashboard/stats/route.ts
  • ~ src/app/api/partner/track/route.ts
  • ~ src/app/api/partner/validate/route.ts
  • ~ src/app/api/referral/apply/route.ts
  • ~ src/app/api/referral/route.ts
  • ~ src/app/api/referral/stats/route.ts
  • ~ src/app/api/stripe/create-checkout/route.ts
  • ~ src/app/api/stripe/webhook/route.ts
  • ~ src/app/settings/page.tsx
  • ~ src/app/subscribe/page.tsx
  • ~ src/components/partner/partner-banners.tsx
  • ~ src/components/partner/partner-campaigns.tsx
  • ~ src/components/partner/partner-dashboard.tsx
  • ~ src/components/settings/referral-card.tsx
  • ~ src/components/settings/settings-layout.tsx

Version 0.2.310

FIX: desktop sidebar avatar disappearing in md-to-lg viewport range

May 6, 2026 at 3:20 PM GMT+0
547393f
๐Ÿ›Fixed
  • FIX: desktop sidebar avatar disappearing in md-to-lg viewport range
  • Sidebar grid is 72px wide below lg even when expanded, but the avatar
  • block was using sidebarCollapsed alone to switch between small avatar
  • and full profile card โ€” and the full card was gated on `hidden lg:block`.
  • Result: at md (768-1023px) with sidebar expanded, neither variant
  • rendered. Always render the small avatar when the sidebar column is

Files Changed

Modified (1):
  • ~ src/components/app-shell.tsx

Version 0.2.309

LEGAL: Children's Privacy Policy + COPPA-compliant signup with verifiable parental consent

May 6, 2026 at 3:14 PM GMT+0
2ada1fd
๐Ÿ”„Changed
  • LEGAL: Children's Privacy Policy + COPPA-compliant signup with verifiable parental consent
  • The previous flow had a self-attestation checkbox at upload time that does not
  • satisfy 16 CFR ยง 312.5(b) โ€” under-13 PII was collectable based on the child
  • clicking 'my parent approves'. This commit closes that gap on the front end and
  • fills the entire ยง 312.4(d) notice obligation.
  • Front-end:

Files Changed

Created (6):
  • + src/app/api/auth/parent-consent/[token]/route.ts
  • + src/app/awaiting-parent-consent/page.tsx
  • + src/app/childrens-privacy/page.tsx
  • + src/app/parent-consent/[token]/page.tsx
  • + src/app/parent-consent/[token]/parent-consent-form.tsx
  • + src/lib/parent-consent.ts
Modified (12):
  • ~ prisma/schema.prisma
  • ~ src/app/api/auth/parent-consent/[token]/route.ts
  • ~ src/app/api/auth/register/route.ts
  • ~ src/app/awaiting-parent-consent/page.tsx
  • ~ src/app/childrens-privacy/page.tsx
  • ~ src/app/layout.tsx
  • ~ src/app/parent-consent/[token]/page.tsx
  • ~ src/app/parent-consent/[token]/parent-consent-form.tsx
  • ~ src/app/privacy/page.tsx
  • ~ src/app/signup/page.tsx
  • ~ src/app/terms/page.tsx
  • ~ src/lib/parent-consent.ts

Version 0.2.308

LEGAL: Children's Privacy Policy + COPPA-compliant signup with verifiable parental consent

May 6, 2026 at 3:30 PM GMT+0
66f6428
โœจAdded
  • Children's Privacy Policy at /childrens-privacy covering all 16 CFR ยง 312.4(d) notice elements: operator identification (FullOut LLC), what we collect from children, how we use it, third-party disclosure categories, written retention policy, persistent identifier handling, parental rights, and contact info.
  • Date-of-birth field on signup with under-13 branching: when the entered DOB indicates the user is under 13, the form asks for a parent or guardian's email instead of creating an account immediately, and the submit button reads 'Send approval request'.
  • Parental consent magic-link flow: under-13 signups create a ParentConsentRequest row instead of a User; the parent receives an email at the address they provided with a 7-day signed link to /parent-consent/[token] where they review the data practices, confirm parental status, accept the policy, and approve. On approval the User+Profile+Person are created in a single transaction with parentalConsentAt set and isPublic=false (private by default for under-13).
  • Awaiting-approval landing page at /awaiting-parent-consent for the child to see after they submit.
  • Footer 'Children's Privacy' link in src/app/layout.tsx between Privacy and Terms.
๐Ÿ”„Changed
  • Privacy Policy fully rewritten to be COPPA-honest: identifies FullOut LLC as the operator with full mailing address, phone, and team@fullout.energy email; replaces the prior 'we do not knowingly collect from children under 13' line (which was inaccurate given Mini/Youth profiles) with a pointer to the Children's Privacy Policy; documents specific service-provider categories (Vercel, Supabase, Mux, Stripe, Resend, Google Analytics); adds a written retention policy (active data while account exists, 30-day deletion, 90-day backup overwrite, 24-month log retention).
  • Terms of Service updated with age requirements (must be 13+ to self-register; under-13 profiles must be parent-created with verifiable consent), FullOut LLC entity block, and references to both privacy policies.
  • Register API now requires birthDate; for 13+ accounts the birthDate is stored on the Person record (previously not captured at signup).
๐Ÿ”’Security
  • Under-13 signups never create a User row until verifiable parental consent is recorded โ€” the child's hashed password is held in ParentConsentRequest until approval and discarded if expired or denied.
  • Parent consent links expire in 7 days; expired links surface a clear error page rather than silently failing.
  • Re-using an already-approved or already-denied consent link shows a final-state page instead of letting it be replayed.

Files Changed

Modified (13):
  • ~ package.json
  • ~ prisma/schema.prisma
  • ~ src/app/api/auth/register/route.ts
  • ~ src/app/layout.tsx
  • ~ src/app/privacy/page.tsx
  • ~ src/app/signup/page.tsx
  • ~ src/app/terms/page.tsx
  • ~ src/app/childrens-privacy/page.tsx
  • ~ src/app/awaiting-parent-consent/page.tsx
  • ~ src/app/parent-consent/[token]/page.tsx
  • ~ src/app/parent-consent/[token]/parent-consent-form.tsx
  • ~ src/app/api/auth/parent-consent/[token]/route.ts
  • ~ src/lib/parent-consent.ts

Version 0.2.307

UI: tighten radii globally + fix mobile overflow on gym page and post action bar

May 6, 2026 at 2:46 PM GMT+0
84d7d74
๐Ÿ”„Changed
  • UI: tighten radii globally + fix mobile overflow on gym page and post action bar
  • Drop the borderRadius scale from xl=24px/2xl=32px down to xl=8px/2xl=10px
  • across all rounded-* tokens so cards and surfaces feel less bubbly. Fix
  • gym page double-padding (was stacking px-4 over app-frame), kill the
  • overflow-x-auto wrapper that was masking long competition names, and
  • truncate the comp name link properly with flex-1 min-w-0. Hide

Files Changed

Modified (4):
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/components/gyms/gym-season-stats.tsx
  • ~ src/components/profile/media-report-button.tsx
  • ~ src/components/profile/media-share-buttons.tsx

Version 0.2.306

DATA: check in Worlds 2026 Finals scraper + importer (already run in prod)

May 5, 2026 at 2:30 PM GMT+0
4ff707c
โœจAdded
  • scripts/import/scrape-worlds-2026-results.ts: scrape the master Finals Score Ranking table from cheertheory.com/the-cheerleading-worlds-2026-finals-results/ and write data/inbox/worlds-2026-cheertheory-finals.json. The per-division sections higher on the page render scores inline (no <table>) so we deliberately parse only the master table.
  • scripts/import/import-worlds-2026-results.ts: idempotent importer for the Finals JSON. Maps rawDivision โ†’ canonical name to match the schedule importer's DIVISION_CODE_MAP, parses country suffix off team and program names, routes through the alias-aware gym/team matchers. Defaults to --dry-run; --execute writes; --reset wipes existing Finals rows for this competition only (scoped to (competitionId, round='Finals')).
  • Already run in prod โ€” checking these in for posterity so the import path is reproducible.

Files Changed

Created (2):
  • + scripts/import/scrape-worlds-2026-results.ts
  • + scripts/import/import-worlds-2026-results.ts

Version 0.2.305

DATA: durable team-name dedupe โ€” strip gym prefix on write + backfill

May 5, 2026 at 2:00 PM GMT+0
fd877f3
๐Ÿ”„Changed
  • New helper src/lib/teams/normalize-team-name.ts strips a leading gym-name prefix from a team name ("Cheer Athletics Panthers" at gym "Cheer Athletics" โ†’ "Panthers"). Comparison is case + punctuation insensitive ('Twist & Shout' == 'Twist and Shout'). Single-token gym names, mid-word matches, and brand-tail-only remainders (athletics/allstars/cheer/...) are guarded against to avoid corrupting names when the gym side itself is a stub.
  • src/lib/import/team-matcher.ts findOrCreateTeam now normalizes the incoming team name through the helper before computing the cache key + DB lookup, so dirty inputs hit the same canonical row instead of creating duplicates. Gym name is cached per gymId.
  • scripts/maintenance/normalize-team-names.ts backfills historical rows: rename in place when no sibling clash, otherwise merge the prefix-team into the cleaner sibling (re-point Performance/Deduction/ScheduleEntry FKs, handle unique-constraint collisions, delete the loser). Defaults to --dry-run; --execute writes. Scope with --gym-name= or --gym-id=. Stubs (team.name === gym.name) are intentionally skipped.

Files Changed

Created (2):
  • + src/lib/teams/normalize-team-name.ts
  • + scripts/maintenance/normalize-team-names.ts
Modified (1):
  • ~ src/lib/import/team-matcher.ts

Version 0.2.304

OPS: temporarily disable SMS notifications while we investigate volume

May 5, 2026 at 1:00 PM GMT+0
140fc34
๐Ÿ”„Changed
  • sendSms() in src/lib/sms.ts now short-circuits with a single console.warn and returns false when SMS_NOTIFICATIONS_DISABLED is true. Twilio client is not constructed; no outbound SMS leaves the app.
  • This is a hot-patch kill switch, not a config flag โ€” flipping it back on is a one-line revert. Track the underlying volume investigation separately.

Files Changed

Modified (1):
  • ~ src/lib/sms.ts

Version 0.2.303

FIX: feed shows latest round per team-comp, sorted by when score actually landed

May 5, 2026 at 3:00 AM GMT+0
241b67c
๐Ÿ›Fixed
  • Feed was showing Pumas' Summit Semi-Finals (97.27, 3rd) instead of Finals (97.58, 3rd). Cause: /api/feed sorted performances by Competition.date, which is identical for every round at a multi-day event, so Finals vs Semis was a non-deterministic tie and one round often got dropped from the page. The 'Xd ago' label was also the comp's start date, not when the score landed.
  • Switched the orderBy to scoreChangedAt โ†’ performedAt โ†’ Competition.date, widened the cursor filter to match, mapped the feed item createdAt to the same effective timestamp, and added per-(team, competition) dedup that keeps the latest round. Verified Summit data: 2253/2253 performances have scoreChangedAt populated, and Pumas Finals' scoreChangedAt is later than Semis' as expected.

Files Changed

Modified (1):
  • ~ src/app/api/feed/route.ts

Version 0.2.302

UI: clear nav search on pathname change + widen team stats breakpoint to xl

May 5, 2026 at 1:45 AM GMT+0
26b1bf4
๐Ÿ”„Changed
  • UI: clear nav search on pathname change + widen team stats breakpoint to xl
  • HomeSearch holds the previous query when the navbar persists across
  • client-side navigations (typing "lions" then clicking a result left
  • "lions" in the input). Reset query/results/open-state on pathname change.
  • TeamStatsStrip switches its mobile-stackโ†’grid breakpoint from lg to xl
  • and adds whitespace-nowrap to label rows so multi-word stats don't wrap

Files Changed

Modified (2):
  • ~ src/components/home-search.tsx
  • ~ src/components/teams/team-stats-strip.tsx

Version 0.2.301

DATA: durable Division-name dedupe โ€” normalize on write + consolidate existing dupes

May 5, 2026 at 1:12 AM GMT+0
6872835
๐Ÿ”„Changed
  • DATA: durable Division-name dedupe โ€” normalize on write + consolidate existing dupes
  • Across ingest paths Division.name had accumulated 1,667 near-duplicate rows
  • that differed only by whitespace, dash style, or punctuation
  • ("L1 Youth - D2 - Medium - WC" vs "L1 Youth - D2 Medium - WC", "L4 U17 -" vs
  • "L4 - U17"). These bypassed @@unique([disciplineId, name]) and split single
  • competition divisions into multiple Division rows, which split team

Files Changed

Created (2):
  • + scripts/maintenance/consolidate-duplicate-divisions.ts
  • + src/lib/division-name.ts
Modified (3):
  • ~ scripts/maintenance/consolidate-duplicate-divisions.ts
  • ~ src/lib/division-name.ts
  • ~ src/lib/prisma.ts

Version 0.2.300

UI: team page โ€” clickable Level/Age/Size chips, drop medal emoji, score-signature dedupe

May 4, 2026 at 10:18 PM GMT+0
41847e3
๐Ÿ”„Changed
  • UI: team page โ€” clickable Level/Age/Size chips, drop medal emoji, score-signature dedupe
  • TeamHero now renders Level / Age / Size as individually clickable filter chips,
  • plus a combined Level Age Size badge that filters /teams by all three
  • PerformanceCard shows uniform numeric placement circles instead of trophy
  • emoji medals for top placements
  • Performance dedupe key drops round so identical placement+score+deductions at

Files Changed

Created (1):
  • + scripts/debug/find-duplicate-divisions.ts
Modified (4):
  • ~ scripts/debug/find-duplicate-divisions.ts
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/teams/performance-card.tsx
  • ~ src/components/teams/team-hero.tsx

Version 0.2.299

FIX: route scraped-score imports through alias-aware gym/team matchers

May 4, 2026 at 9:58 PM GMT+0
e97c6a7
๐Ÿ›Fixed
  • FIX: route scraped-score imports through alias-aware gym/team matchers
  • The score-import pipeline (scripts/import/import-scraped-data.ts) had its
  • own naive findOrCreateGym/Team that did exact case-insensitive name
  • match and created a new row on miss โ€” bypassing GymAlias entirely. So
  • every scrape after a gym merge would happily re-create the duplicate,
  • fragmenting the data we just consolidated.

Files Changed

Modified (1):
  • ~ scripts/import/import-scraped-data.ts

Version 0.2.298

DATA: merge Spirit of Texas Houston into Spirit of Texas

May 4, 2026 at 9:43 PM GMT+0
94d74d4
๐Ÿ”„Changed
  • DATA: merge Spirit of Texas Houston into Spirit of Texas
  • Two gym rows for the same All Star program in Houston, TX โ€” one created
  • 2026-03-14 with the rich historical data (47 teams, 1018 perfs), one
  • created 2026-03-21 from a recent live-scrape import (18 teams, 42 perfs)
  • with the cleaner /gyms/spirit-of-texas slug. Merge preserves the slug
  • the user wants to keep while pulling all historical scoring/follow data

Files Changed

Created (2):
  • + scripts/debug/check-spirit-of-texas.ts
  • + scripts/maintenance/merge-gyms.ts
Modified (2):
  • ~ scripts/debug/check-spirit-of-texas.ts
  • ~ scripts/maintenance/merge-gyms.ts

Version 0.2.297

DATA: cleanup prefix-artifact team names in Woodlands Elite chain

May 4, 2026 at 9:32 PM GMT+0
68f7cb9
๐Ÿ”„Changed
  • DATA: cleanup prefix-artifact team names in Woodlands Elite chain
  • The CheerTheory importer strips "Gym - Team" prefixes correctly but the
  • live-scrape import path does not, so new All Star imports keep creating
  • teams named "Woodlands Elite - Black Ops" instead of "Black Ops". The
  • April 15 cleanup (commit f0660e4) handled the backlog at the time, and
  • 17 new artifacts have accumulated in the Woodlands Elite chain since.

Files Changed

Created (4):
  • + scripts/debug/audit-prefix-artifacts.ts
  • + scripts/debug/audit-woodlands-elite-prefixes.ts
  • + scripts/debug/check-we-team-names.ts
  • + scripts/maintenance/cleanup-prefixed-teams-in-chain.ts
Modified (4):
  • ~ scripts/debug/audit-prefix-artifacts.ts
  • ~ scripts/debug/audit-woodlands-elite-prefixes.ts
  • ~ scripts/debug/check-we-team-names.ts
  • ~ scripts/maintenance/cleanup-prefixed-teams-in-chain.ts

Version 0.2.296

UI: deterministic initials-avatar fallback when logo/photo missing

May 4, 2026 at 9:21 PM GMT+0
0550eb2
๐Ÿ”„Changed
  • UI: deterministic initials-avatar fallback when logo/photo missing
  • New <InitialsAvatar name src size /> in src/components/ui/. Renders the
  • image when src is set, otherwise a colored circle with name initials.
  • Background hue is a deterministic hash of name, so the same brand
  • lands the same color across pages.
  • Replaced six bare-icon placeholders (Building2/Users/GraduationCap/

Files Changed

Created (2):
  • + scripts/maintenance/backfill-woodlands-elite-logo.ts
  • + src/components/ui/initials-avatar.tsx
Modified (4):
  • ~ scripts/maintenance/backfill-woodlands-elite-logo.ts
  • ~ src/app/discover/page.tsx
  • ~ src/components/discover/sortable-tables.tsx
  • ~ src/components/ui/initials-avatar.tsx

Version 0.2.295

UI: show gym + round on feed performance cards

May 4, 2026 at 9:20 PM GMT+0
4016b7f
๐Ÿ”„Changed
  • UI: show gym + round on feed performance cards

Files Changed

Modified (3):
  • ~ src/app/api/feed/route.ts
  • ~ src/app/home/page.tsx
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.294

UI: smarter discover-page ranking โ€” follow-boost, starts-with, quality tiebreakers

May 4, 2026 at 9:12 PM GMT+0
3a5a6df
๐Ÿ”„Changed
  • UI: smarter discover-page ranking โ€” follow-boost, starts-with, quality tiebreakers
  • Discover-page results were effectively alphabetical because trigram
  • similarity ties (every "Wild..." team scored the same) had no useful
  • secondary sort. Apply the same boost pattern shipped to the typeahead,
  • plus a starts-with bonus and per-type quality tiebreakers.
  • Discover ORDER BY layers (per entity type):

Files Changed

Modified (2):
  • ~ src/app/api/search/route.ts
  • ~ src/app/discover/page.tsx

Version 0.2.293

UI: tighten feed card radius; fix avatar fallback for non-letter usernames

May 4, 2026 at 9:07 PM GMT+0
33c1874
๐Ÿ”„Changed
  • UI: tighten feed card radius; fix avatar fallback for non-letter usernames

Files Changed

Modified (2):
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.292

UI: smarter search โ€” follow-boost, follows-on-focus, substring highlight

May 4, 2026 at 8:54 PM GMT+0
f5b8b38
๐Ÿ”„Changed
  • UI: smarter search โ€” follow-boost, follows-on-focus, substring highlight
  • /api/search now boosts followed entities in ORDER BY. Teams whose gym
  • you follow outrank unfollowed teams of equal similarity; directly-
  • followed teams outrank same-gym matches. Anonymous users see no boost
  • (empty arrays make ANY('{}'::text[]) a no-op).
  • Empty query returns the 24 most-recent follows (gyms, teams, people,

Files Changed

Modified (3):
  • ~ src/app/api/search/route.ts
  • ~ src/components/home-search.tsx
  • ~ src/components/navbar.tsx

Version 0.2.291

UI: smarter search โ€” follow-boost ranking, follows-on-focus, substring highlight

May 4, 2026 at 8:55 PM GMT+0
pending
โœจAdded
  • Search: focusing the navbar search with no query now shows your followed teams, gyms, people, and choreographers immediately so the most-relevant entities are one click away.
  • Search: typing 1 character filters your follows locally (instant, no network); 2+ chars hits the full trigram search.
  • Search: matched query tokens are highlighted in result names and subtitles.
๐Ÿ”„Changed
  • Search ranking now boosts followed entities. Teams whose gym you follow rank above unfollowed teams of equal similarity (so 'Wild...' surfaces the Wildcats from your followed gym first). Directly-followed teams beat same-gym matches.
  • Wired HomeSearch typeahead into the navbar (replacing the plain submit form on both desktop and mobile auth views) with a new compact size variant.

Files Changed

Modified (5):
  • ~ src/app/api/search/route.ts
  • ~ src/components/home-search.tsx
  • ~ src/components/navbar.tsx
  • ~ package.json
  • ~ CHANGELOG.json

Version 0.2.290

UI: hide stray feed-tabs scrollbar; unify feed card style across breakpoints

May 4, 2026 at 8:47 PM GMT+0
93707c4
๐Ÿ”„Changed
  • UI: hide stray feed-tabs scrollbar; unify feed card style across breakpoints

Files Changed

Modified (2):
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/feed-tabs-nav.tsx

Version 0.2.289

UI: show rank in performance trends tooltips (gym + team pages)

May 4, 2026 at 8:37 PM GMT+0
3d258c5
๐Ÿ”„Changed
  • UI: show rank in performance trends tooltips (gym + team pages)

Files Changed

Modified (6):
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/gyms/gym-ps-chart.tsx
  • ~ src/components/my-teams/single-team-analysis.tsx
  • ~ src/components/teams/team-ps-chart.tsx
  • ~ src/types/charts.ts

Version 0.2.288

UI: surface division + placement on /home performance cards, link to division group page

May 4, 2026 at 8:37 PM GMT+0
f85db28
๐Ÿ”„Changed
  • UI: surface division + placement on /home performance cards, link to division group page
  • Pull Division (with slug + display fields) and Performance.placement into
  • the home feed query (both server-render in app/home/page.tsx and the
  • infinite-scroll API in app/api/feed/route.ts) and pre-compute a
  • divisionHref on each performance feed item.
  • Performance cards now show the division name as a third subtitle line and

Files Changed

Modified (3):
  • ~ src/app/api/feed/route.ts
  • ~ src/app/home/page.tsx
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.287

DEBUG: add paid-tier audit script

May 4, 2026 at 8:02 PM GMT+0
3bf4de9
๐Ÿ›Fixed
  • DEBUG: add paid-tier audit script
  • scripts/debug/audit-paid-tier-users.ts groups users by subscriptionTier
  • and lists every paid-tier account with its role, Stripe state, and most
  • recent Subscription row. Used to verify admin-driven tier flips after
  • the auth.ts session-refresh fix.

Files Changed

Created (1):
  • + scripts/debug/audit-paid-tier-users.ts
Modified (1):
  • ~ scripts/debug/audit-paid-tier-users.ts

Version 0.2.286

FIX: resumable + hash-skipped imports so live events update fast

May 4, 2026 at 7:58 PM GMT+0
cfad39f
๐Ÿ›Fixed
  • FIX: resumable + hash-skipped imports so live events update fast
  • The Summit (220 divisions, 2145 teams) couldn't finish a full import in
  • the live-monitor cron's 5-min maxDuration. Status never flipped to
  • COMPLETED, the next tick re-imported from scratch, and the loop never
  • made progress โ€” Finals from May 4 never reached the DB.
  • Two changes, one chokepoint:

Files Changed

Created (1):
  • + scripts/maintenance/unstick-import-jobs.ts
Modified (4):
  • ~ prisma/schema.prisma
  • ~ scripts/maintenance/unstick-import-jobs.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/live-monitor.ts

Version 0.2.285

UI: cleanup competition page โ€” collapsibles, rank numbers, Insights tab

May 4, 2026 at 7:58 PM GMT+0
88feb02
๐Ÿ”„Changed
  • UI: cleanup competition page โ€” collapsibles, rank numbers, Insights tab
  • My Teams & Gyms: card and each gym row now collapsible via native
  • <details>; gym rows default closed and toggle on click (no longer
  • navigates to gym page).
  • Division cards: replace medal emojis with #1/#2/#3 rank numbers; #1
  • renders bold in primary color. Show all divisions per level (drop the

Files Changed

Modified (3):
  • ~ src/components/competitions/competition-tabs.tsx
  • ~ src/components/competitions/divisions-tab.tsx
  • ~ src/components/competitions/my-follows-at-competition.tsx

Version 0.2.284

UI: align navbar bottom border with page content shell

May 4, 2026 at 7:57 PM GMT+0
a4b4194
๐Ÿ”„Changed
  • UI: align navbar bottom border with page content shell
  • Move border-b from the full-width <header> onto an inner div sitting
  • inside the app-frame's 12px gutter so the navbar's visible bottom line
  • ends at the same horizontal extent as the sticky profile header, the
  • profile card, and the photo feed below. Background stays edge-to-edge
  • so the iOS status-bar area still renders consistently.

Files Changed

Modified (1):
  • ~ src/components/navbar.tsx

Version 0.2.283

FIX: admin tier changes ignored until user re-logs in

May 4, 2026 at 7:42 PM GMT+0
269298b
๐Ÿ›Fixed
  • FIX: admin tier changes ignored until user re-logs in
  • Session callback was overlaying token.subscriptionTier and token.role
  • into the session without ever refreshing them from the User row. So
  • when an admin updated a user's tier in /admin/users, the User.subscriptionTier
  • column flipped correctly, but the user's existing JWT still carried the
  • old value. Every paywalled page reads session.user.subscriptionTier, so

Files Changed

Created (1):
  • + scripts/debug/check-graham-tier.ts
Modified (2):
  • ~ scripts/debug/check-graham-tier.ts
  • ~ src/lib/auth.ts

Version 0.2.282

FIX: live-scores feed showing stale rows as "1m ago"

May 4, 2026 at 6:17 PM GMT+0
7d52e26
๐Ÿ›Fixed
  • FIX: live-scores feed showing stale rows as "1m ago"
  • The feed was sorting by Performance.updatedAt, which Prisma bumps on any
  • row touch. The live-monitor cron's 5-min function timeout was killing
  • the post-import status flip on large events, so every minute it
  • re-imported the same SCRAPE_COMPLETE Summit job, bumping updatedAt on
  • 1500+ unchanged rows. The user saw 4-day-old scores marked "1m ago".

Files Changed

Created (4):
  • + scripts/debug/check-live-scores-staleness.ts
  • + scripts/debug/check-score-changed-at.ts
  • + scripts/maintenance/backfill-score-changed-at.ts
  • + scripts/maintenance/install-score-changed-at-triggers.ts
Modified (11):
  • ~ prisma/schema.prisma
  • ~ scripts/debug/check-live-scores-staleness.ts
  • ~ scripts/debug/check-score-changed-at.ts
  • ~ scripts/maintenance/backfill-score-changed-at.ts
  • ~ scripts/maintenance/install-score-changed-at-triggers.ts
  • ~ src/app/api/live-scores/route.ts
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/live/page.tsx
  • ~ src/lib/import/index.ts
  • ~ src/lib/live-monitor.ts
  • ~ src/lib/live-score-order.ts

Version 0.2.281

FIX: live scores feed showing stale rows as "1m ago"

May 4, 2026 at 6:00 PM GMT+0
pending
๐Ÿ›Fixed
  • Live-scores feed was sorting by Performance.updatedAt, which Prisma bumps on any row touch โ€” so the live-monitor cron's idempotent re-imports made every Summit row look like it just changed.
  • Add Performance.scoreChangedAt column maintained by Postgres triggers โ€” bumps only when score values or placement materially change. Defense-in-depth: every writer (Prisma, raw SQL, scripts) participates automatically.
  • Live-monitor harvest now atomically claims jobs (SCRAPE_COMPLETE โ†’ IMPORTING โ†’ COMPLETED). Stuck IMPORTING jobs re-arm to SCRAPE_COMPLETE after 45min instead of failing. Fixes the root cause: 5-min function timeout was killing the COMPLETED flip, causing infinite re-import.
  • Live-scores API + /live + /gyms/[id] now sort and display freshness based on scoreChangedAt instead of updatedAt.
  • Backfilled scoreChangedAt for 325k existing rows using COALESCE(notifiedAt, score.createdAt, performance.createdAt).

Files Changed

Modified (9):
  • ~ prisma/schema.prisma
  • ~ src/lib/live-monitor.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/live-score-order.ts
  • ~ src/app/api/live-scores/route.ts
  • ~ src/app/live/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ scripts/maintenance/install-score-changed-at-triggers.ts
  • ~ scripts/maintenance/backfill-score-changed-at.ts

Version 0.2.280

FIX: move iOS-zoom @media block out of @layer base

May 4, 2026 at 5:59 PM GMT+0
1eac475
๐Ÿ›Fixed
  • FIX: move iOS-zoom @media block out of @layer base
  • Nesting @media inside @layer base appears to have broken Tailwind/PostCSS
  • compilation, causing the page to render as unstyled HTML. Move the rule
  • to the top level of globals.css where it's processed independently.

Files Changed

Modified (1):
  • ~ src/app/globals.css

Version 0.2.279

UI: add "My Teams & Gyms" panel to competition page

May 4, 2026 at 5:57 PM GMT+0
e047bf5
๐Ÿ”„Changed
  • UI: add "My Teams & Gyms" panel to competition page
  • Shows followed teams and gyms performing at the competition, grouped
  • by gym โ†’ team โ†’ rounds, above the Division Winners chart. Followed-gym
  • includes all of that gym's teams at the comp; followed-team is shown
  • on its own under its gym. Each team lists every round it competed
  • (Prelims/Semis/Finals/etc.) with final score and placement; #1

Files Changed

Created (2):
  • + scripts/debug/check-summit-rounds.ts
  • + src/components/competitions/my-follows-at-competition.tsx
Modified (3):
  • ~ scripts/debug/check-summit-rounds.ts
  • ~ src/app/competitions/[id]/page.tsx
  • ~ src/components/competitions/my-follows-at-competition.tsx

Version 0.2.278

FIX: iOS Safari auto-zooming on input focus

May 4, 2026 at 5:57 PM GMT+0
97f3f35
๐Ÿ›Fixed
  • FIX: iOS Safari auto-zooming on input focus
  • Force inputs/textareas/selects to 16px on viewports <=768px so iOS doesn't
  • zoom in when focusing the search box and other small inputs.

Files Changed

Modified (1):
  • ~ src/app/globals.css

Version 0.2.277

FIX: team cards on /discover missing logo when gym only has photoUrl

April 24, 2026 at 8:44 PM GMT+0
70a2957
๐Ÿ›Fixed
  • FIX: team cards on /discover missing logo when gym only has photoUrl
  • Team query SELECT'd g."logoUrl" but not g."photoUrl", so the
  • team.gymLogoUrl fallback was null for gyms with only photoUrl set
  • (e.g. Cheer Athletics - Frisco โ†’ NovaCats).
  • Added g."photoUrl" AS "gymPhotoUrl" to the query, extended TeamResult
  • + TeamRow types, and appended gymPhotoUrl to the fallback chain in

Files Changed

Modified (2):
  • ~ src/app/discover/page.tsx
  • ~ src/components/discover/sortable-tables.tsx

Version 0.2.276

FIX: competition page showing Prelims when Finals have scored

April 24, 2026 at 8:19 PM GMT+0
7744c8b
๐Ÿ›Fixed
  • FIX: competition page showing Prelims when Finals have scored
  • User reported Youth Summit 2026 competition overview showing Prelims
  • for L3 Youth - Medium even though Finals had landed in the DB with
  • real placements + scores. Division detail page was correct.
  • Root cause in src/components/competitions/divisions-tab.tsx: the round
  • picker filtered out any performance whose performedAt was in the future

Files Changed

Modified (1):
  • ~ src/components/competitions/divisions-tab.tsx

Version 0.2.275

FIX: Varsity scraper dropping Finals for divisions with Prelims

April 24, 2026 at 7:48 PM GMT+0
ca9a488
๐Ÿ›Fixed
  • FIX: Varsity scraper dropping Finals for divisions with Prelims
  • User reported Finals visible on Varsity TV but missing from competition
  • pages. Investigation on Youth Summit 2026: 46 of 54 divisions had only
  • Prelims, 7 had both rounds, 1 had only Finals. Scraper ran 18 times today
  • and completed cleanly every time โ€” Finals were being fetched from Varsity
  • and then thrown away.

Files Changed

Created (1):
  • + python-scraper/tests/test_division_merge_key.py
Modified (2):
  • ~ python-scraper/scraper/varsity_api_scraper.py
  • ~ python-scraper/tests/test_division_merge_key.py

Version 0.2.274

FIX: Varsity scraper was dropping Finals for divisions that also had Prelims

April 24, 2026 at 7:55 PM GMT+0
3ba94af
๐Ÿ›Fixed
  • Youth Summit 2026 and similar live events were missing Finals rounds
  • on most divisions (46 of 54 Prelims-only, only 7 with both rounds).
  • Root cause was in the Python scraper's filter-sweep merge step: when
  • Varsity TV's results endpoint is queried with a roundName facet, it
  • often returns a record whose name field has been stripped of the
  • round suffix, so a Prelims query and a Finals query produce records
  • with identical names. The four merge sites in varsity_api_scraper.py
  • all keyed on the raw name, collapsing the two records into one via
  • choose_preferred_division โ€” which prefers team count, so Prelims
  • (larger field) always won and Finals were silently dropped.
๐Ÿ”„Changed
  • python-scraper/scraper/varsity_api_scraper.py: new division_merge_key()
  • helper keys on (base_name, round_label); all four merge sites now use
  • it so Prelims and Finals survive as distinct records.
  • python-scraper/tests/test_division_merge_key.py: 9 unit tests locking
  • in the round-preservation invariant.

Files Changed

Modified (2):
  • ~ python-scraper/scraper/varsity_api_scraper.py
  • ~ python-scraper/tests/test_division_merge_key.py

Version 0.2.273

FIX: canonicalize Division.level at the write layer

April 24, 2026 at 7:29 PM GMT+0
3ba94af
๐Ÿ›Fixed
  • FIX: canonicalize Division.level at the write layer
  • User reported Youth Summit 2026 showed only 2 of 16 L2 divisions. Root
  • cause was inconsistent Division.level spelling across imports โ€” 2,455 rows
  • DB-wide stored "Level N" while others stored "LN", splitting single levels
  • into separate UI groups.
  • Four-layer fix:

Files Changed

Created (4):
  • + scripts/debug/smoke-test-level-extension.ts
  • + scripts/maintenance/normalize-division-levels.ts
  • + src/lib/__tests__/division-level.test.ts
  • + src/lib/division-level.ts
Modified (6):
  • ~ scripts/debug/smoke-test-level-extension.ts
  • ~ scripts/maintenance/normalize-division-levels.ts
  • ~ src/components/competitions/divisions-tab.tsx
  • ~ src/lib/__tests__/division-level.test.ts
  • ~ src/lib/division-level.ts
  • ~ src/lib/prisma.ts

Version 0.2.272

FIX: canonicalize Division.level at the write layer (Youth Summit 2026)

April 24, 2026 at 7:40 PM GMT+0
1d46473
๐Ÿ›Fixed
  • Competition pages were splitting a single level (e.g. L2) into two
  • separate headers when some divisions had been imported as 'Level 2'
  • and others as 'L2'. Most visible on Youth Summit 2026, which showed
  • only 2 of 16 L2 divisions under the 'Level 2' heading. 2,455 rows
  • across the whole DB had non-canonical level strings (Level 1-7).
๐Ÿ”„Changed
  • src/lib/division-level.ts: new canonical normalizeLevel() utility.
  • src/lib/prisma.ts: Prisma client $extends hook routes every
  • division.create/createMany/update/updateMany/upsert through
  • normalizeLevel so no import path can write a non-canonical value.
  • src/components/competitions/divisions-tab.tsx: normalizes at grouping
  • as defense-in-depth.
  • scripts/maintenance/normalize-division-levels.ts: idempotent backfill
  • (ran once to clean up 2,455 historical rows).

Files Changed

Modified (8):
  • ~ src/lib/division-level.ts
  • ~ src/lib/__tests__/division-level.test.ts
  • ~ src/lib/prisma.ts
  • ~ src/components/competitions/divisions-tab.tsx
  • ~ scripts/maintenance/normalize-division-levels.ts
  • ~ scripts/debug/smoke-test-level-extension.ts
  • ~ CLAUDE.md
  • ~ tasks/lessons.md

Version 0.2.271

FIX: live-monitor now harvests SCRAPE_COMPLETE jobs (admin-sync race)

April 23, 2026 at 9:54 PM GMT+0
db7186c
๐Ÿ›Fixed
  • FIX: live-monitor now harvests SCRAPE_COMPLETE jobs (admin-sync race)
  • The admin scraper dashboard polls /api/admin/scraper/jobs every 10s
  • whenever an admin has the page open, and its sync function flips any
  • SCRAPING row whose Python work is done to SCRAPE_COMPLETE. Because
  • live-monitor Phase 1 only harvested jobs with status="SCRAPING", any
  • scrape the admin path caught first got stuck forever โ€” Python finished,

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.270

LIVE: tighten live-monitor cadence to 10 min (was 45 min)

April 23, 2026 at 6:07 PM GMT+0
8d2d622
๐Ÿ”„Changed
  • LIVE: tighten live-monitor cadence to 10 min (was 45 min)
  • Competitions in their live window are now re-scraped every 10 minutes
  • instead of every 45. Also split "in-flight" from "recently completed"
  • checks so the tighter cadence can't stack duplicate scrapes on the same
  • event while one is still running โ€” STALE_JOB_THRESHOLD_MS (45 min)
  • still reclaims truly stuck jobs.

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.269

LIVE: tighten live-monitor cadence to 10 min (was 45 min)

April 23, 2026 at 6:06 PM GMT+0
b90cad9
๐Ÿ”„Changed
  • LIVE: tighten live-monitor cadence to 10 min (was 45 min)
  • Competitions in their live window are now re-scraped every 10 minutes
  • instead of every 45. Also split "in-flight" from "recently completed"
  • checks so the tighter cadence can't stack duplicate scrapes on the same
  • event while one is still running โ€” STALE_JOB_THRESHOLD_MS (45 min)
  • still reclaims truly stuck jobs.

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.267

DOCS: consolidate brand positioning across overview + brand guide

April 23, 2026 at 1:19 AM GMT+0
9fc394b
๐Ÿ”„Changed
  • DOCS: consolidate brand positioning across overview + brand guide
  • Rewrite FULLOUT_COMPANY_OVERVIEW.md to align with media-company + athlete-first positioning, drop the phantom 4th tier, and use Prep/Elite/Pro naming. Fix stray "Novice" tier references in brand-guide.md and upgrade-prompt-audit.md to match live /pricing.

Version 0.2.266

FIX: guard against session.user.id=undefined in dashboard layout

April 22, 2026 at 6:36 PM GMT+0
918dc1c
๐Ÿ›Fixed
  • FIX: guard against session.user.id=undefined in dashboard layout
  • Prod logs showed "Invalid prisma.user.findUnique() invocation: where.id=undefined"
  • on GET /home when a session existed without an id. Tightening the guard from
  • session?.user to session?.user?.id redirects those requests to /login instead.

Files Changed

Modified (1):
  • ~ src/app/dashboard/layout.tsx

Version 0.2.265

DATA: strip "TBD" prefix from competition names at all ingest + display paths

April 22, 2026 at 6:21 PM GMT+0
07b7440
๐Ÿ”„Changed
  • DATA: strip "TBD" prefix from competition names at all ingest + display paths
  • Varsity event listings sometimes use a "TBD" placeholder prefix for unfinalized
  • event titles (e.g. "TBDThe U.S. Finals Worcester"). Only the schedule-intake
  • route was sanitizing it โ€” auto-discover, bulk-scrape, and rescrape-orchestrator
  • all wrote raw titles. Now all three run parseEventName(), the /competitions and
  • /competitions/browse pages scrub names on render, and the fix-competition-names

Files Changed

Modified (6):
  • ~ scripts/fix-competition-names.ts
  • ~ src/app/competitions/browse/page.tsx
  • ~ src/app/competitions/page.tsx
  • ~ src/lib/auto-discover.ts
  • ~ src/lib/bulk-scrape.ts
  • ~ src/lib/rescrape-orchestrator.ts

Version 0.2.264

DATA: audit + merge 19 duplicate gyms created by STUNT import

April 22, 2026 at 5:35 PM GMT+0
1b92bdc
โœจAdded
  • DATA: audit + merge 19 duplicate gyms created by STUNT import
  • The 2026-04-20 STUNT import created new gym records for entities that
  • already existed (e.g. "Cheer Athletics Frisco" vs "Cheer Athletics -
  • Frisco", Purdue ร— 2, UT ร— 2, etc.). scripts/debug/stunt-audit.ts tiers
  • candidates by normalized-name + city/state match; scripts/maintenance/
  • merge-stunt-gyms.ts moves all 15 gym FK references from dupe โ†’ canonical

Files Changed

Created (8):
  • + scripts/debug/inspect-failed-merges.ts
  • + scripts/debug/list-gym-fks.ts
  • + scripts/debug/stunt-audit.ts
  • + scripts/debug/verify-all-merges.ts
  • + scripts/debug/verify-frisco-merge.ts
  • + scripts/maintenance/create-gemini-team.ts
  • + scripts/maintenance/merge-stunt-gyms.ts
  • + scripts/maintenance/update-ca-frisco-stunt.ts
Modified (8):
  • ~ scripts/debug/inspect-failed-merges.ts
  • ~ scripts/debug/list-gym-fks.ts
  • ~ scripts/debug/stunt-audit.ts
  • ~ scripts/debug/verify-all-merges.ts
  • ~ scripts/debug/verify-frisco-merge.ts
  • ~ scripts/maintenance/create-gemini-team.ts
  • ~ scripts/maintenance/merge-stunt-gyms.ts
  • ~ scripts/maintenance/update-ca-frisco-stunt.ts

Version 0.2.263

UI: consolidate /search + /explore + /discover into single search page

April 22, 2026 at 5:34 PM GMT+0
6982286
๐Ÿ”„Changed
  • UI: consolidate /search + /explore + /discover into single search page
  • /discover now hosts the full search experience: trigram + normalized-ILIKE
  • matching (fixes "cheer athletic plano" returning no results), tabs with
  • counts, grid/table view toggle with sortable table columns, claim banner,
  • and category cards as the empty state. /search and /explore became 301
  • redirects. Updated all callers (home autocomplete, landing hero, mobile

Files Changed

Created (1):
  • + src/components/discover/sortable-tables.tsx
Modified (10):
  • ~ src/app/discover/page.tsx
  • ~ src/app/explore/page.tsx
  • ~ src/app/search/page.tsx
  • ~ src/components/dashboard/dashboard-shell.tsx
  • ~ src/components/discover/sortable-tables.tsx
  • ~ src/components/explore/explore-results.tsx
  • ~ src/components/explore/explore-view-toggle.tsx
  • ~ src/components/explore/results-per-page-selector.tsx
  • ~ src/components/home-search.tsx
  • ~ src/components/landing/landing-search.tsx

Version 0.2.262

PCL: add International Cheer + NBA disciplines, link national teams

April 22, 2026 at 2:33 PM GMT+0
a5e86bb
๐Ÿ”„Changed
  • PCL: add International Cheer + NBA disciplines, link national teams
  • Two new disciplines for PCL athletes' non-all-star/college experiences:
  • international_cheer (USA Cheer Coed Premier, All Girl Premier,
  • National Team โ€” Anuhea Keene, Maddie Hayes, Kollin Cockrell, Ryan
  • Claunch, Hailey Smith, Sahanna Doherty, James Thomas, Anuhea Keene)
  • nba (Utah Jazz Stunt Team โ€” Kollin Cockrell, Hailey Smith)

Files Changed

Created (1):
  • + scripts/setup/link-pcl-national-teams.ts
Modified (3):
  • ~ scripts/setup/backfill-pcl-gym-logos.ts
  • ~ scripts/setup/link-pcl-national-teams.ts
  • ~ src/lib/disciplines/registry.ts

Version 0.2.261

PCL: backfill gym/team logos and create missing program stubs

April 22, 2026 at 2:17 PM GMT+0
ba5f1e6
โœจAdded
  • PCL: backfill gym/team logos and create missing program stubs
  • backfill-pcl-gym-logos.ts gains throttling + Wikimedia PNG-thumb URLs
  • (Supabase bucket rejects image/svg+xml). Pulled 12 college logos
  • (Navarro, TX Tech, Kennesaw, UCF, UWG, Louisville, Morehead State,
  • Troy, Sam Houston, Eastern Michigan, UGA, Weber State, Lindenwood)
  • plus 3 program logos (Southwestern Christian, Twist & Shout,

Files Changed

Created (2):
  • + scripts/setup/create-missing-pcl-gyms.ts
  • + scripts/setup/propagate-team-logos-from-gyms.ts
Modified (3):
  • ~ scripts/setup/backfill-pcl-gym-logos.ts
  • ~ scripts/setup/create-missing-pcl-gyms.ts
  • ~ scripts/setup/propagate-team-logos-from-gyms.ts

Version 0.2.260

PCL: link athlete experiences to real gym/team IDs

April 22, 2026 at 2:06 PM GMT+0
d5a888c
๐Ÿ”„Changed
  • PCL: link athlete experiences to real gym/team IDs
  • Resolved 88% of PCL athletes' historical PersonExperience rows
  • (224 / 255 gym links, 174 / 255 team links). Previously all rows had
  • \`manualGymName\` / \`manualTeamName\` strings only โ€” so PCL pros never
  • showed up on their former gym/team pages.
  • scripts/setup/link-pcl-gyms-teams.ts โ€” manual rule table for the messy

Files Changed

Created (13):
  • + scripts/debug/audit-pcl-experiences.ts
  • + scripts/debug/audit-pcl-final.ts
  • + scripts/debug/audit-pcl-photos.ts
  • + scripts/debug/check-caleb-henderson.ts
  • + scripts/debug/check-existing-gym-photos.ts
  • + scripts/debug/find-pcl-teams.ts
  • + scripts/debug/list-pcl-gym-teams.ts
  • + scripts/debug/match-pcl-gyms.ts
  • + scripts/debug/revert-bad-navarro-match.ts
  • + scripts/debug/show-navarro.ts
  • + scripts/debug/show-pcl-person.ts
  • + scripts/setup/backfill-pcl-gym-logos.ts
  • + scripts/setup/link-pcl-gyms-teams.ts
Modified (13):
  • ~ scripts/debug/audit-pcl-experiences.ts
  • ~ scripts/debug/audit-pcl-final.ts
  • ~ scripts/debug/audit-pcl-photos.ts
  • ~ scripts/debug/check-caleb-henderson.ts
  • ~ scripts/debug/check-existing-gym-photos.ts
  • ~ scripts/debug/find-pcl-teams.ts
  • ~ scripts/debug/list-pcl-gym-teams.ts
  • ~ scripts/debug/match-pcl-gyms.ts
  • ~ scripts/debug/revert-bad-navarro-match.ts
  • ~ scripts/debug/show-navarro.ts
  • ~ scripts/debug/show-pcl-person.ts
  • ~ scripts/setup/backfill-pcl-gym-logos.ts
  • ~ scripts/setup/link-pcl-gyms-teams.ts

Version 0.2.259

UI: add /gyms/[id]/athletes + /teams/[id]/athletes roster pages

April 22, 2026 at 2:06 PM GMT+0
99c533d
๐Ÿ”„Changed
  • UI: add /gyms/[id]/athletes + /teams/[id]/athletes roster pages
  • The compact sidebar's "View all" link was pointing at an #athletes
  • anchor that didn't exist on desktop, so historical athletes (PCL pros
  • whose tenure was years ago) had no way to surface โ€” the season filter
  • hid them and there was no full-roster view to fall back on.
  • New AthleteRosterBrowser with search, season filter, and sort

Files Changed

Created (3):
  • + src/app/gyms/[id]/athletes/page.tsx
  • + src/app/teams/[id]/athletes/page.tsx
  • + src/components/athletes/athlete-roster-browser.tsx
Modified (5):
  • ~ src/app/gyms/[id]/athletes/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/athletes/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/athletes/athlete-roster-browser.tsx

Version 0.2.258

UI: render discipline badges across search, team listings, gym rosters, and athlete profiles

April 22, 2026 at 3:06 AM GMT+0
465d760
๐Ÿ”„Changed
  • UI: render discipline badges across search, team listings, gym rosters, and athlete profiles
  • Teams carry their own Team.disciplineId; athletes aggregate disciplines from
  • their team history (PersonExperience + PersonTeamTimeline) so multi-discipline
  • pros โ€” e.g. PCL players with All Star and College history โ€” surface all three
  • badges side-by-side. Wave 1 covers the home search dropdown and athlete profile
  • header; Wave 2 covers /teams grid + list views and the gym page team roster.

Files Changed

Modified (7):
  • ~ src/app/api/search/route.ts
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/teams/page.tsx
  • ~ src/components/gyms/gym-teams-section.tsx
  • ~ src/components/home-search.tsx
  • ~ src/components/profile/profile-card-clean.tsx

Version 0.2.257

PERF: speed up schedule filters by removing nested Division where-clauses

April 22, 2026 at 12:31 AM GMT+0
d4c792e
๐Ÿ”„Changed
  • PERF: speed up schedule filters by removing nested Division where-clauses
  • The /competitions/[id]/schedule filters were slow because both API routes
  • used `where.Division = {...}`, which CLAUDE.md flags as generating slow
  • correlated subqueries through PgBouncer (~15x slower). filter-options
  • also re-scanned every entry with a Division JOIN on each filter click
  • (300ms debounced), and the SSR page re-derived sessions/dates from a

Files Changed

Created (1):
  • + src/lib/schedule-division-filter.ts
Modified (4):
  • ~ src/app/api/competitions/[id]/schedule/entries/route.ts
  • ~ src/app/api/competitions/[id]/schedule/filter-options/route.ts
  • ~ src/app/competitions/[id]/schedule/page.tsx
  • ~ src/lib/schedule-division-filter.ts

Version 0.2.256

STUNT: import Youth Summit 2026 schedule (551 performances)

April 22, 2026 at 12:01 AM GMT+0
e7d8a61
๐Ÿ”„Changed
  • STUNT: import Youth Summit 2026 schedule (551 performances)
  • Parse Varsity PDF performance order and insert CompetitionSchedule +
  • ScheduleEntry rows for youth-summit-2026. Thursday, April 23 is split
  • across West/Central/East Hall (179/181/191 entries). Friday finals are
  • skipped โ€” they are blank bracket slots in the source PDF.
  • Match rates: 551/551 divisions, 545/551 gyms, 148 teams exact-matched.

Files Changed

Created (1):
  • + scripts/import/import-youth-summit-2026-schedule.ts
Modified (1):
  • ~ scripts/import/import-youth-summit-2026-schedule.ts

Version 0.2.255

STUNT: import 849 PSAL HS matches with point scores (2015-2026)

April 21, 2026 at 4:12 PM GMT+0
d4a775c
๐Ÿ”„Changed
  • STUNT: import 849 PSAL HS matches with point scores (2015-2026)
  • Reverse-engineered PSAL's WCF JSON service at /SportDisplay.svc โ€” same
  • API the team-standings.aspx page uses. Bootstrap session by GETting any
  • public PSAL page (cookies set automatically), then call:
  • GetSportLeague?csports='069'&season='YYYY' (find STUNT leagues per year)
  • getTeamScheduleAny?csports='069'&season=YYYY&schoolid='XXXXX'

Files Changed

Created (5):
  • + scripts/debug/analyze-psal-data.ts
  • + scripts/debug/count-psal-imports.ts
  • + scripts/import/import-psal-stunt.ts
  • + scripts/maintenance/dedupe-psal-matches.ts
  • + scripts/scrape/scrape-psal-stunt.ts
Modified (5):
  • ~ scripts/debug/analyze-psal-data.ts
  • ~ scripts/debug/count-psal-imports.ts
  • ~ scripts/import/import-psal-stunt.ts
  • ~ scripts/maintenance/dedupe-psal-matches.ts
  • ~ scripts/scrape/scrape-psal-stunt.ts

Version 0.2.254

UI: fix unreadable gym popup on /gyms map

April 21, 2026 at 3:18 PM GMT+0
bdefa9f
๐Ÿ”„Changed
  • UI: fix unreadable gym popup on /gyms map
  • The global maplibre popup override strips background/padding for the dark
  • theme, so the gyms-map popup's dark text rendered invisible on the dark
  • basemap. Wrap the popup content in a dark card with light text, matching
  • the density map treatment.

Files Changed

Modified (1):
  • ~ src/components/gyms/gyms-map.tsx

Version 0.2.253

STUNT: import 5 historical club championship finals (2022-2024)

April 20, 2026 at 2:09 PM GMT+0
35ebc72
๐Ÿ”„Changed
  • STUNT: import 5 historical club championship finals (2022-2024)
  • From stuntthesport.org/club-team-rankings/ "Club STUNT Championship
  • History" table (10 rows = 5 finals ร— 2 teams each).
  • Covered:
  • 2024 West Coast Regional (18U + 14U)
  • 2023 West Coast Regional (18U + 14U)

Files Changed

Created (3):
  • + scripts/debug/find-similar-names.ts
  • + scripts/debug/show-club-championships.ts
  • + scripts/import/import-club-championship-history.ts
Modified (3):
  • ~ scripts/debug/find-similar-names.ts
  • ~ scripts/debug/show-club-championships.ts
  • ~ scripts/import/import-club-championship-history.ts

Version 0.2.252

PROFILE: build Chris Muniz athlete/coach profile + career history

April 20, 2026 at 2:00 PM GMT+0
e1885a6
๐Ÿ”„Changed
  • PROFILE: build Chris Muniz athlete/coach profile + career history
  • Person record @roostermuniz with 24 PersonExperience rows covering
  • 1999-2019 career arc (Cheer Athletics Plano, TVCC, U of Houston,
  • GymTyme, PowerHouse Belton, World Cup Freehold, + 4 historical gyms
  • created: Texas Air Force, Cheer Nation, Texas Lonestar teams).
  • Also materializes 30 Performance records across 16 newly-created

Files Changed

Created (6):
  • + scripts/setup/build-chris-muniz-performances.ts
  • + scripts/setup/build-chris-muniz-profile.ts
  • + scripts/setup/create-chris-muniz-missing-orgs.ts
  • + scripts/setup/fix-chris-muniz-team-links.ts
  • + scripts/setup/fix-powerhouse-worldcup-dupes.ts
  • + scripts/setup/upload-chris-muniz-photo.ts
Modified (6):
  • ~ scripts/setup/build-chris-muniz-performances.ts
  • ~ scripts/setup/build-chris-muniz-profile.ts
  • ~ scripts/setup/create-chris-muniz-missing-orgs.ts
  • ~ scripts/setup/fix-chris-muniz-team-links.ts
  • ~ scripts/setup/fix-powerhouse-worldcup-dupes.ts
  • ~ scripts/setup/upload-chris-muniz-photo.ts

Version 0.2.251

STUNT: import 2025 Youth Club Nationals brackets (22 matches)

April 20, 2026 at 12:19 AM GMT+0
6887486
๐Ÿ”„Changed
  • STUNT: import 2025 Youth Club Nationals brackets (22 matches)
  • Scraped via Playwright MCP from stuntthesport.org/youthclubnationals/.
  • Two schedule tables (Day 1, Day 2) โ€” winners are bolded text in either
  • the Home or Away cell. Two championship rows (18U + 14U) lack the
  • "Game (N)" pattern, parsed separately.
  • Special case: 18U Championship row has no bolded winner in HTML โ€” only

Files Changed

Created (7):
  • + scripts/debug/check-stunt-match-shape.ts
  • + scripts/debug/check-stunt-team-seasons.ts
  • + scripts/debug/inspect-nationals-bolding.ts
  • + scripts/debug/verify-youth-nationals.ts
  • + scripts/import/import-youth-nationals-2025.ts
  • + scripts/maintenance/cleanup-ycn-dupes.ts
  • + scripts/scrape/parse-youth-nationals.ts
Modified (7):
  • ~ scripts/debug/check-stunt-match-shape.ts
  • ~ scripts/debug/check-stunt-team-seasons.ts
  • ~ scripts/debug/inspect-nationals-bolding.ts
  • ~ scripts/debug/verify-youth-nationals.ts
  • ~ scripts/import/import-youth-nationals-2025.ts
  • ~ scripts/maintenance/cleanup-ycn-dupes.ts
  • ~ scripts/scrape/parse-youth-nationals.ts

Version 0.2.250

STUNT: webpoint Gym team-coverage diagnostic

April 19, 2026 at 11:56 PM GMT+0
ad0f224
๐Ÿ”„Changed
  • STUNT: webpoint Gym team-coverage diagnostic
  • Cross-references webpoint-imported Gyms with their Team counts:
  • 71% are directory-only (no teams yet โ€” expected, will accrue from
  • competition data). Big all-star programs already have 15-43 teams
  • from Varsity TV imports; webpoint just enriched their contact info.

Files Changed

Created (1):
  • + scripts/debug/webpoint-team-coverage.ts
Modified (1):
  • ~ scripts/debug/webpoint-team-coverage.ts

Version 0.2.249

STUNT: ingest entire 545-program webpoint directory + 188 logos

April 19, 2026 at 11:30 PM GMT+0
57060fc
๐Ÿ”„Changed
  • STUNT: ingest entire 545-program webpoint directory + 188 logos
  • Scraped via Playwright MCP: empty-filter search on usacheer.webpoint.us
  • returned the complete USA Cheer programs database (545 listings, no
  • pagination cap). Cf_clearance cookie from interactive session passed
  • Cloudflare invisibly.
  • Pipeline:

Files Changed

Created (7):
  • + scripts/debug/analyze-webpoint-dump.ts
  • + scripts/debug/check-webpoint-logos.ts
  • + scripts/debug/find-webpoint-dupes.ts
  • + scripts/debug/verify-webpoint-all-import.ts
  • + scripts/import/import-webpoint-all.ts
  • + scripts/maintenance/dedupe-webpoint-gyms.ts
  • + scripts/scrape/download-webpoint-logos.ts
Modified (7):
  • ~ scripts/debug/analyze-webpoint-dump.ts
  • ~ scripts/debug/check-webpoint-logos.ts
  • ~ scripts/debug/find-webpoint-dupes.ts
  • ~ scripts/debug/verify-webpoint-all-import.ts
  • ~ scripts/import/import-webpoint-all.ts
  • ~ scripts/maintenance/dedupe-webpoint-gyms.ts
  • ~ scripts/scrape/download-webpoint-logos.ts

Version 0.2.248

STUNT: import 42 more teams from webpoint via interactive browser

April 19, 2026 at 10:54 PM GMT+0
7df2b58
๐Ÿ”„Changed
  • STUNT: import 42 more teams from webpoint via interactive browser
  • Pivoted from custom scraper to using the Playwright MCP browser directly
  • in the user's interactive session. cf_clearance cookie from prior
  • solves let us pass Cloudflare Turnstile invisibly. Searched
  • CompanyName=STUNT on usacheer.webpoint.us/Clubs-wp.php โ†’ 47 STUNT-named
  • programs returned with full address + head coach contact info.

Files Changed

Created (2):
  • + scripts/debug/verify-webpoint-import.ts
  • + scripts/import/import-webpoint-stunt.ts
Modified (2):
  • ~ scripts/debug/verify-webpoint-import.ts
  • ~ scripts/import/import-webpoint-stunt.ts

Version 0.2.247

STUNT: import 51 non-college teams from stuntthesport.org

April 19, 2026 at 10:34 PM GMT+0
c8aea21
๐Ÿ”„Changed
  • STUNT: import 51 non-college teams from stuntthesport.org
  • Webpoint scraper hit a wall โ€” Cloudflare requires a fresh Turnstile token
  • in every form POST body, not just the cf_clearance cookie, so cookie-replay
  • via Playwright's APIRequestContext also returns a challenge. Captured the
  • attempt in scrape-webpoint-http.ts as documentation; persistent-profile
  • flow stays as scrape-webpoint.ts (only useful with paid Captcha solver).

Files Changed

Created (5):
  • + scripts/debug/dbg-sts-tables.ts
  • + scripts/debug/verify-sts-import.ts
  • + scripts/import/import-stunt-rankings.ts
  • + scripts/scrape/parse-stuntthesport-rankings.ts
  • + scripts/scrape/scrape-webpoint-http.ts
Modified (6):
  • ~ scripts/debug/dbg-sts-tables.ts
  • ~ scripts/debug/verify-sts-import.ts
  • ~ scripts/import/import-stunt-rankings.ts
  • ~ scripts/scrape/parse-stuntthesport-rankings.ts
  • ~ scripts/scrape/scrape-webpoint-http.ts
  • ~ scripts/scrape/scrape-webpoint.ts

Version 0.2.246

STUNT: webpoint scraper using persistent Chromium profile

April 19, 2026 at 9:48 PM GMT+0
41bc870
๐Ÿ”„Changed
  • STUNT: webpoint scraper using persistent Chromium profile
  • Bypasses Cloudflare Turnstile checkbox-mode challenge by using
  • chromium.launchPersistentContext โ€” user solves the checkbox once on
  • first run, cf_clearance cookie persists in playwright-profile/ for
  • subsequent unattended runs.
  • Iterates 7 webpoint categories (Club, Dev Club, Elem-Club, HS,

Files Changed

Created (1):
  • + scripts/scrape/scrape-webpoint.ts
Modified (1):
  • ~ scripts/scrape/scrape-webpoint.ts

Version 0.2.245

PDF extractor: NCA cheer-21 + flex-no-toss templates, max-value validation

April 19, 2026 at 9:45 PM GMT+0
c98f75f
๐Ÿ”„Changed
  • PDF extractor: NCA cheer-21 + flex-no-toss templates, max-value validation
  • pdf-score-extractor: nca_cheer_21 template (NCA Division Averages PDFs
  • omit runningTumblingMpd; 21 values per team), cheer_flex_no_toss_20
  • template (Flex divisions skip TOSS, have RT MAX/MPD)
  • pdf-completeness-loop: per-field FIELD_MAX bounds reject mis-mapped values
  • from shifted templates so we don't propagate garbage scores

Files Changed

Created (13):
  • + scripts/debug/check-hiss-raw.ts
  • + scripts/debug/check-hiss-score.ts
  • + scripts/debug/check-sea-to-sky-comp.ts
  • + scripts/debug/debug-hiss-extract.ts
  • + scripts/debug/diagnose-stuck-templates.ts
  • + scripts/debug/dump-lines.ts
  • + scripts/debug/find-special-pdf.ts
  • + scripts/debug/inspect-pdf-by-id.ts
  • + scripts/debug/inspect-pdf-headers.ts
  • + scripts/debug/test-u18nt-extract.ts
  • + scripts/debug/trace-extract.ts
  • + scripts/maintenance/clear-corrupted-pdf-breakdowns.ts
  • + scripts/maintenance/flag-nonstandard-competitions.ts
Modified (15):
  • ~ scripts/debug/check-hiss-raw.ts
  • ~ scripts/debug/check-hiss-score.ts
  • ~ scripts/debug/check-sea-to-sky-comp.ts
  • ~ scripts/debug/debug-hiss-extract.ts
  • ~ scripts/debug/diagnose-stuck-templates.ts
  • ~ scripts/debug/dump-lines.ts
  • ~ scripts/debug/find-special-pdf.ts
  • ~ scripts/debug/inspect-pdf-by-id.ts
  • ~ scripts/debug/inspect-pdf-headers.ts
  • ~ scripts/debug/test-u18nt-extract.ts
  • ~ scripts/debug/trace-extract.ts
  • ~ scripts/maintenance/clear-corrupted-pdf-breakdowns.ts
  • ~ scripts/maintenance/flag-nonstandard-competitions.ts
  • ~ scripts/maintenance/pdf-completeness-loop.ts
  • ~ src/lib/import/pdf-score-extractor.ts

Version 0.2.244

STUNT discipline launch: hub, ~2k matches, scoring + standings

April 19, 2026 at 9:44 PM GMT+0
4c8e728
๐Ÿ”„Changed
  • STUNT discipline launch: hub, ~2k matches, scoring + standings
  • Schema: VarsityOrClub enum, Gym.ncaaDivision/institutionConference,
  • Team.varsityOrClub/conference/scholarshipsOffered, StuntMatchTeam.quarterScores
  • Discipline registry as single source of truth (src/lib/disciplines/registry.ts)
  • /stunt hub: landing, programs directory, match feed, match detail with
  • quarter-by-quarter scoring, standings, conferences

Files Changed

Created (20):
  • + scripts/debug/audit-allstar-dupe.ts
  • + scripts/debug/audit-stunt-gyms.ts
  • + scripts/debug/check-cheerabilities.ts
  • + scripts/debug/check-stunt-import.ts
  • + scripts/debug/check-stunt-match-progress.ts
  • + scripts/debug/find-dupes.ts
  • + scripts/debug/find-pm-accounts.ts
  • + scripts/debug/inspect-cstunt-oldest.ts
  • + scripts/debug/inspect-cstunt-tables.ts
  • + scripts/debug/inspect-name-collisions.ts
  • + scripts/debug/inspect-null-discipline-teams.ts
  • + scripts/debug/move-leftover-divs.ts
  • + scripts/debug/probe-collegestunt-api.ts
  • + scripts/debug/probe-collegestunt-endpoints.ts
  • + scripts/debug/probe-stunt-schema.ts
  • + scripts/debug/reconcile-cstunt-teams.ts
  • + scripts/debug/verify-cali-coed.ts
  • + scripts/debug/verify-stunt-in-picker.ts
  • + scripts/import/import-cstunt-matches.ts
  • + scripts/import/import-cstunt-staff.ts
Modified (20):
  • ~ prisma/schema.prisma
  • ~ scripts/debug/audit-allstar-dupe.ts
  • ~ scripts/debug/audit-stunt-gyms.ts
  • ~ scripts/debug/check-cheerabilities.ts
  • ~ scripts/debug/check-stunt-import.ts
  • ~ scripts/debug/check-stunt-match-progress.ts
  • ~ scripts/debug/find-dupes.ts
  • ~ scripts/debug/find-pm-accounts.ts
  • ~ scripts/debug/inspect-cstunt-oldest.ts
  • ~ scripts/debug/inspect-cstunt-tables.ts
  • ~ scripts/debug/inspect-name-collisions.ts
  • ~ scripts/debug/inspect-null-discipline-teams.ts
  • ~ scripts/debug/move-leftover-divs.ts
  • ~ scripts/debug/probe-collegestunt-api.ts
  • ~ scripts/debug/probe-collegestunt-endpoints.ts
  • ~ scripts/debug/probe-stunt-schema.ts
  • ~ scripts/debug/reconcile-cstunt-teams.ts
  • ~ scripts/debug/verify-cali-coed.ts
  • ~ scripts/debug/verify-stunt-in-picker.ts
  • ~ scripts/import/import-cstunt-matches.ts

Version 0.2.244

STUNT discipline launch โ€” full hub, ~2k match results, scoring + standings

April 20, 2026 at 1:34 AM GMT+0
48e7d26
โœจAdded
  • STUNT (Stunt The Sport) added as first-class discipline with MATCH scoring model
  • /stunt hub with category navigation (College, Conferences, Matches, Standings)
  • /stunt/programs filterable directory of 88 college programs
  • /stunt/matches feed with quarter-by-quarter scoring on detail pages
  • /stunt/standings with W/L/PF/PA grouped by NCAA division
  • /stunt/conferences and /stunt/conferences/[slug] for league-level browsing
  • <DisciplineBadge> component with color-coded discipline tags integrated into team-hero, gym-hero, athlete experience
  • Discipline registry at src/lib/disciplines/registry.ts as single source of truth
  • ~2,000 historical STUNT matches imported from collegestunt.org with quarter-by-quarter scoring
  • 36 STUNT head coaches imported with team affiliations
  • Daily collegestunt.org sync + weekly usacheer.org sync wired into Railway worker
๐Ÿ”„Changed
  • Discipline taxonomy cleaned up: 5 inactive disciplines activated (~15,700 hidden teams now visible in filters)
  • Renamed legacy STUNT discipline (140 Group Stunt teams) to Group Stunt
  • Merged All Star duplicate discipline into All Star Cheer (1,196 teams + 533 divisions consolidated)
  • 2,496 NULL-discipline teams classified via heuristic
  • 67 STUNT logos mirrored to Supabase storage to remove partner-CDN dependency
  • Sitemap updated to include /stunt routes
๐Ÿ—‘๏ธRemoved
  • Empty placeholder disciplines deleted: CheerABILITIES, Rec Cheer (dupe), Pro, Sideline

Version 0.2.243

Pricing page: align features with actual tier gates, add audit skill

April 19, 2026 at 5:48 PM GMT+0
b565778
๐Ÿ”„Changed
  • Pricing page: align features with actual tier gates, add audit skill
  • Added missing features to comparison table: media uploads, PDF export,
  • scorecard share, coach/choreographer pages, division access, CSV export,
  • advanced filters, schedule reminders
  • Removed SMS notifications (not shipped)
  • Fixed Score Breakdown using wrong feature flag

Files Changed

Created (1):
  • + src/docs/design-audit-prompt.md
Modified (3):
  • ~ src/app/pricing/page.tsx
  • ~ src/docs/design-audit-prompt.md
  • ~ src/lib/pricing-plans.ts

Version 0.2.242

Cross-surface polish: consistent heading styles, profile max-width

April 19, 2026 at 4:54 PM GMT+0
0e2c884
๐Ÿ”„Changed
  • Cross-surface polish: consistent heading styles, profile max-width
  • Division page season chart CardTitle aligned to text-base (was text-sm)
  • Athlete profile constrained to max-w-3xl to prevent ultrawide stretch

Files Changed

Modified (2):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/app/people/[username]/page.tsx

Version 0.2.241

Athlete profile: PDF export, empty states, motion, perf, a11y

April 19, 2026 at 4:32 PM GMT+0
3520fa1
๐Ÿ”„Changed
  • Athlete profile: PDF export, empty states, motion, perf, a11y
  • PDF export route (/api/pdf/profile/[username]) generates resume-style
  • PDF with experience, skills, competition results, stats, and profile URL
  • Pro tier can export any profile, Elite can export their own, free users
  • see upgrade CTA
  • Timeline empty state shows helpful message instead of blank

Files Changed

Created (2):
  • + src/app/api/pdf/profile/[username]/route.tsx
  • + src/components/pdf/profile-pdf-document.tsx
Modified (7):
  • ~ src/app/api/pdf/profile/[username]/route.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/pdf/profile-pdf-document.tsx
  • ~ src/components/people/person-timeline-viz.tsx
  • ~ src/components/people/recent-results-list.tsx
  • ~ src/components/profile/profile-card-clean.tsx
  • ~ src/components/profile/profile-tabs.tsx

Version 0.2.240

Athlete profile: KPIs in header, remove profile type badges, auto-derive discipline

April 19, 2026 at 3:44 PM GMT+0
648577c
๐Ÿ”„Changed
  • Athlete profile: KPIs in header, remove profile type badges, auto-derive discipline
  • KPI stats (Performances, Wins, Podiums, Avg Score) render inside the
  • profile card on desktop, eliminating the standalone strip
  • Removed profile type badges (ATHLETE, PARENT, etc.) โ€” role is shown
  • via experiences instead
  • Discipline field removed from Add/Edit Experience form โ€” auto-fills

Files Changed

Modified (4):
  • ~ src/app/api/teams/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/people/person-experience.tsx
  • ~ src/components/profile/profile-card-clean.tsx

Version 0.2.239

Athlete profile: add See Less toggle on results, taller timeline with uncropped tooltips

April 19, 2026 at 3:42 AM GMT+0
a0a1a1d
๐Ÿ”„Changed
  • Athlete profile: add See Less toggle on results, taller timeline with uncropped tooltips
  • RecentResultsList client component with View All / See Less toggle (5 initial)
  • Timeline height scales to 350px/year and 50px per performance marker
  • Performance hover tooltips no longer truncated or clipped by container

Files Changed

Created (1):
  • + src/components/people/recent-results-list.tsx
Modified (3):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/people/person-timeline-viz.tsx
  • ~ src/components/people/recent-results-list.tsx

Version 0.2.238

Add season-based athlete filtering and confirmation system

April 19, 2026 at 3:32 AM GMT+0
439ba4a
โœจAdded
  • Add season-based athlete filtering and confirmation system
  • Athletes on team/gym pages now filter by the selected season dropdown
  • instead of being hardcoded to the current season. Ongoing experiences
  • require confirmation each August โ€” athletes see "Still on [Team]?"
  • on their home feed and profile, preventing stale rosters.
  • SeasonAthleteGrid client component filters by season context

Files Changed

Created (5):
  • + src/app/api/cron/create-seasons/route.ts
  • + src/app/api/person/[id]/experience/confirm/route.ts
  • + src/components/athletes/season-athlete-grid.tsx
  • + src/components/people/season-confirmation-prompt.tsx
  • + src/lib/season-experience.ts
Modified (11):
  • ~ prisma/schema.prisma
  • ~ src/app/api/cron/create-seasons/route.ts
  • ~ src/app/api/person/[id]/experience/confirm/route.ts
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/home/page.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/athletes/season-athlete-grid.tsx
  • ~ src/components/people/person-timeline-viz.tsx
  • ~ src/components/people/season-confirmation-prompt.tsx
  • ~ src/lib/season-experience.ts

Version 0.2.237

Division page: remove confusing charts, add analyze button, clean up line chart

April 19, 2026 at 2:32 AM GMT+0
ca0c8fa
๐Ÿ”„Changed
  • Division page: remove confusing charts, add analyze button, clean up line chart
  • Removed Score Bands chart (confusing, low value)
  • Kept Season line chart with fixes: removed tick marks, transparent
  • dots (only current competition shows filled dots), tighter margins
  • Added "Analyze [Division]" button that loads all division teams
  • into /analyze workspace as temporary group

Files Changed

Modified (3):
  • ~ src/app/[username]/analyze/page.tsx
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/components/competitions/division-team-history-chart.tsx

Version 0.2.236

Competition page: Pro tier division modal, wins filter on gym map

April 19, 2026 at 1:59 AM GMT+0
00a9ecb
๐Ÿ”„Changed
  • Competition page: Pro tier division modal, wins filter on gym map
  • Division cards show glass upgrade overlay for non-Pro users instead
  • of redirecting to /pricing. "Upgrade to Pro to unlock" + Dismiss.
  • Divisions limited to 6 per level with expand link
  • Gym map: Wins | All | No Wins filter on same row as D1/D2 toggle
  • "No Wins" shows blue-gray bubbles (same size as 1-win)

Files Changed

Modified (4):
  • ~ src/components/competitions/divisions-tab.tsx
  • ~ src/components/competitions/gym-wins-map-wrapper.tsx
  • ~ src/components/competitions/gym-wins-map.tsx
  • ~ src/components/competitions/gyms-tab.tsx

Version 0.2.235

Competition page: admin tier override, division limit, glass upgrade modal

April 19, 2026 at 1:30 AM GMT+0
419da28
๐Ÿ”„Changed
  • Competition page: admin tier override, division limit, glass upgrade modal
  • Admin accounts get PRO-equivalent tier access
  • Divisions limited to 6 per level with "Show all" expand link
  • Free users see glass overlay on division cards instead of redirect
  • to /pricing โ€” "Unlock full scorecard details" + Upgrade/Dismiss
  • Cards use overflow-hidden to contain the overlay

Files Changed

Modified (3):
  • ~ src/app/competitions/[id]/page.tsx
  • ~ src/components/competitions/competition-tabs.tsx
  • ~ src/components/competitions/divisions-tab.tsx

Version 0.2.234

Design overhaul: Teams + Gyms pages, design system foundation, tier gating

April 19, 2026 at 12:07 AM GMT+0
8a94d2e
๐Ÿ”„Changed
  • Design overhaul: Teams + Gyms pages, design system foundation, tier gating
  • Phase 3: Design system foundation
  • 29 new UI primitives (scoring, skills, progression, tier, layout)
  • Design tokens (level colors, skill categories, tier colors, locked states)
  • Spring motion system (snappy/smooth/bouncy/heavy presets)
  • /design-system preview page

Files Changed

Created (20):
  • + src/app/design-system/page.tsx
  • + src/app/teams/[id]/not-found.tsx
  • + src/components/gyms/gym-hero.tsx
  • + src/components/gyms/gym-more-button.tsx
  • + src/components/teams/performance-card.tsx
  • + src/components/teams/performance-history.tsx
  • + src/components/teams/team-hero.tsx
  • + src/components/teams/team-performance-view-toggle.tsx
  • + src/components/teams/team-stats-strip.tsx
  • + src/components/ui/animated-counter.tsx
  • + src/components/ui/badge-display.tsx
  • + src/components/ui/bottom-sheet.tsx
  • + src/components/ui/category-bar.tsx
  • + src/components/ui/celebration-overlay.tsx
  • + src/components/ui/comparison-ghost-slot.tsx
  • + src/components/ui/comparison-row.tsx
  • + src/components/ui/deduction-tag.tsx
  • + src/components/ui/dimmed-data-preview.tsx
  • + src/components/ui/division-status-pill.tsx
  • + src/components/ui/downgrade-notice.tsx
Modified (20):
  • ~ scripts/setup/seed-score-maximums.ts
  • ~ src/app/design-system/page.tsx
  • ~ src/app/globals.css
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/loading.tsx
  • ~ src/app/teams/[id]/not-found.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/gym-analysis/gym-dashboard.tsx
  • ~ src/components/gyms/gym-choreography-section.tsx
  • ~ src/components/gyms/gym-hero.tsx
  • ~ src/components/gyms/gym-more-button.tsx
  • ~ src/components/gyms/gym-more-section.tsx
  • ~ src/components/gyms/gym-season-filter.tsx
  • ~ src/components/gyms/gym-season-kpis.tsx
  • ~ src/components/gyms/gym-teams-section.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/components/teams/performance-card.tsx
  • ~ src/components/teams/performance-history.tsx
  • ~ src/components/teams/team-hero.tsx

Version 0.2.233

Perf: faster builds and page loads โ€” force-dynamic, parallel queries, lazy charts

April 17, 2026 at 5:59 PM GMT+0
d0dd2a9
๐Ÿ”„Changed
  • Perf: faster builds and page loads โ€” force-dynamic, parallel queries, lazy charts
  • Add force-dynamic to 78 DB-backed pages to prevent build-time static generation
  • (eliminates DB connections/timeouts during Vercel builds)
  • Remove duplicate prisma generate from build script (postinstall handles it)
  • Dynamic import 15+ Recharts chart components with ssr:false (~90KB bundle savings)
  • Parallelize sequential DB queries in schedules, gyms, leaderboard breakdown API

Files Changed

Modified (20):
  • ~ src/app/[username]/analyze/gym/[slug]/page.tsx
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/page.tsx
  • ~ src/app/[username]/analyze/page.tsx
  • ~ src/app/[username]/analyze/team/[slug]/page.tsx
  • ~ src/app/[username]/competitions/page.tsx
  • ~ src/app/[username]/gyms/page.tsx
  • ~ src/app/[username]/people/page.tsx
  • ~ src/app/[username]/schedules/page.tsx
  • ~ src/app/[username]/teams/page.tsx
  • ~ src/app/admin/analytics/page.tsx
  • ~ src/app/admin/choreographers/[id]/page.tsx
  • ~ src/app/admin/choreographers/page.tsx
  • ~ src/app/admin/coaches/[id]/page.tsx
  • ~ src/app/admin/coaches/page.tsx
  • ~ src/app/admin/competitions/[id]/data/page.tsx
  • ~ src/app/admin/competitions/page.tsx
  • ~ src/app/admin/content/page.tsx
  • ~ src/app/admin/data-audit/page.tsx
  • ~ src/app/admin/disciplines/page.tsx
  • ~ src/app/admin/divisions/page.tsx

Version 0.2.232

Add force-dynamic to search page to prevent static generation DB timeouts

April 17, 2026 at 5:43 PM GMT+0
3b589cc
โœจAdded
  • Add force-dynamic to search page to prevent static generation DB timeouts

Files Changed

Modified (1):
  • ~ src/app/search/page.tsx

Version 0.2.231

Move sidebar collapse toggle above logout divider for clarity

April 17, 2026 at 1:35 PM GMT+0
e8afdab
๐Ÿ”„Changed
  • Move sidebar collapse toggle above logout divider for clarity

Files Changed

Modified (2):
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.230

Update hero background image to Group 198

April 17, 2026 at 1:27 PM GMT+0
151d438
๐Ÿ”„Changed
  • Update hero background image to Group 198

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.229

Fix mobile sticky CTA: hide near final CTA, cap button width

April 17, 2026 at 4:09 AM GMT+0
2b3e467
๐Ÿ›Fixed
  • Fix mobile sticky CTA: hide near final CTA, cap button width

Files Changed

Modified (2):
  • ~ src/components/landing/landing-page.tsx
  • ~ src/components/landing/landing-sticky-cta.tsx

Version 0.2.228

Add bottom padding to final CTA so it clears sticky mobile bar

April 17, 2026 at 3:55 AM GMT+0
a2c3030
โœจAdded
  • Add bottom padding to final CTA so it clears sticky mobile bar

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.227

Hero headline: single line, all white, lighter weight

April 17, 2026 at 3:48 AM GMT+0
7d4bca1
๐Ÿ”„Changed
  • Hero headline: single line, all white, lighter weight

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.226

Add maintenance toolkit, growth docs, search avatars + gitignore cleanup

April 17, 2026 at 3:12 AM GMT+0
2c4b724
โœจAdded
  • Add maintenance toolkit, growth docs, search avatars + gitignore cleanup
  • Search page: add avatar/logo images for gyms, teams, coaches,
  • choreographers, and competitions in search results
  • Growth docs: add outreach scripts, IG calendar, Klaviyo sequences,
  • ManyChat flows, and growth strategy
  • Maintenance scripts: commit 90+ operational tools for data quality,

Files Changed

Created (20):
  • + python-scraper/scrape_single_event.py
  • + python-scraper/scraper/html_scraper.py
  • + python-scraper/scraper/reconciler.py
  • + scripts/audit-missing-fields.ts
  • + scripts/backfill-score-fields.ts
  • + scripts/check-scoresheets.ts
  • + scripts/check-skills.ts
  • + scripts/local-full-scrape.ts
  • + scripts/maintenance/apply-gym-enrichment.ts
  • + scripts/maintenance/apply-late-results.ts
  • + scripts/maintenance/assess-gym-social.ts
  • + scripts/maintenance/audit-pdf-score-gaps.ts
  • + scripts/maintenance/backfill-bell-schedule-ids.ts
  • + scripts/maintenance/backfill-schedule-team-ids.ts
  • + scripts/maintenance/backfill-score-fields.ts
  • + scripts/maintenance/backfill-scores-from-pdf.ts
  • + scripts/maintenance/backfill-top-gym-locations.ts
  • + scripts/maintenance/check-all-missing.ts
  • + scripts/maintenance/check-apparel-data.ts
  • + scripts/maintenance/check-ca-frisco.ts
Modified (20):
  • ~ python-scraper/scrape_single_event.py
  • ~ python-scraper/scraper/html_scraper.py
  • ~ python-scraper/scraper/reconciler.py
  • ~ scripts/audit-missing-fields.ts
  • ~ scripts/backfill-score-fields.ts
  • ~ scripts/check-scoresheets.ts
  • ~ scripts/check-skills.ts
  • ~ scripts/local-full-scrape.ts
  • ~ scripts/maintenance/apply-gym-enrichment.ts
  • ~ scripts/maintenance/apply-late-results.ts
  • ~ scripts/maintenance/assess-gym-social.ts
  • ~ scripts/maintenance/audit-pdf-score-gaps.ts
  • ~ scripts/maintenance/backfill-bell-schedule-ids.ts
  • ~ scripts/maintenance/backfill-schedule-team-ids.ts
  • ~ scripts/maintenance/backfill-score-fields.ts
  • ~ scripts/maintenance/backfill-scores-from-pdf.ts
  • ~ scripts/maintenance/backfill-top-gym-locations.ts
  • ~ scripts/maintenance/check-all-missing.ts
  • ~ scripts/maintenance/check-apparel-data.ts
  • ~ scripts/maintenance/check-ca-frisco.ts

Version 0.2.225

Dedupe 130 gyms + 317 teams + fix Cheer Athletics city data

April 17, 2026 at 3:03 AM GMT+0
a51cf41
๐Ÿ”„Changed
  • Dedupe 130 gyms + 317 teams + fix Cheer Athletics city data
  • Full-database dedup Ralph loop: merged duplicate gyms (exact-name),
  • teams (same-gym exact, prefix-artifact, franchise siblings), cleaned
  • orphans, and fixed CA franchise city/state data (10 locations had
  • wrong city from backfill, e.g. Pensacola showed MS instead of FL,
  • Pittsburgh showed OH instead of PA, St. Louis showed Monroe LA).

Files Changed

Created (3):
  • + scripts/maintenance/dedup-gyms.ts
  • + scripts/maintenance/fix-ca-cities.ts
  • + scripts/maintenance/full-dedup-loop.ts
Modified (4):
  • ~ scripts/maintenance/dedup-gyms.ts
  • ~ scripts/maintenance/fix-ca-cities.ts
  • ~ scripts/maintenance/full-dedup-loop.ts
  • ~ scripts/maintenance/merge-same-gym-prefix-dupes.ts

Version 0.2.224

Make FullOut logo larger, shrink Build Your Legacy to match width

April 17, 2026 at 2:54 AM GMT+0
321571d
๐Ÿ”„Changed
  • Make FullOut logo larger, shrink Build Your Legacy to match width

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.223

Redesign landing page: dark mode, broader positioning, team preview

April 16, 2026 at 10:33 PM GMT+0
4515cd2
๐Ÿ”„Changed
  • Redesign landing page: dark mode, broader positioning, team preview
  • Force dark mode on landing page via wrapper class
  • Update hero subhead to cover scores + profiles (not just profiles)
  • Broaden search placeholder to include competitions
  • Reorder sections: fans/parents module now appears first after hero
  • Add team data preview mockup (Orange / Stingray Allstars) with

Files Changed

Modified (3):
  • ~ src/app/page.tsx
  • ~ src/components/landing/landing-page.tsx
  • ~ src/components/landing/landing-search.tsx

Version 0.2.222

Group nav into My Stuff / Explore / More collapsibles

April 16, 2026 at 9:12 PM GMT+0
3332157
๐Ÿ”„Changed
  • Group nav into My Stuff / Explore / More collapsibles
  • Collapse the flat 15-item nav into 4 top-level anchors (Feed, Scores,
  • Profile, Notifications) plus three collapsible groups:
  • My Stuff: My People, Teams, Gyms, Competitions, Schedules
  • Explore: People, Teams, Gyms, Competitions, Schedules
  • More: News, Learn, Analyze, Settings

Files Changed

Created (3):
  • + src/components/dashboard/nav-group-item.tsx
  • + src/lib/hooks/use-local-storage-boolean.ts
  • + src/lib/nav-config.ts
Modified (5):
  • ~ src/components/dashboard/nav-group-item.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/navbar.tsx
  • ~ src/lib/hooks/use-local-storage-boolean.ts
  • ~ src/lib/nav-config.ts

Version 0.2.221

Fix PDF extractor + UI polish + dedupe R1/R2 scores

April 16, 2026 at 7:28 PM GMT+0
3fbd9d1
๐Ÿ›Fixed
  • Fix PDF extractor + UI polish + dedupe R1/R2 scores
  • PDF extractor (src/lib/import/pdf-score-extractor.ts)
  • Delay team flush until next team label is seen so the 22-field template
  • wins over the 15-field template when the numeric buffer crosses 15.
  • Skip "-" / "--" null placeholders that previously split Team labels.
  • Add header-fragment noise detection ("mansh", "ip", "pyram", etc.) for

Files Changed

Modified (12):
  • ~ scripts/maintenance/pdf-completeness-loop.ts
  • ~ src/app/globals.css
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/competitions/competition-performances.tsx
  • ~ src/components/competitions/division-scorecard.tsx
  • ~ src/components/gym-analysis/gym-scorecard-export.ts
  • ~ src/components/gym-analysis/gym-scorecard.tsx
  • ~ src/components/teams/competition-analysis/team-page-tabs.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/components/teams/team-stats-bar.tsx
  • ~ src/lib/import/pdf-score-extractor.ts

Version 0.2.220

Dedupe 622 more same-gym prefix-artifact Team rows

April 15, 2026 at 10:33 PM GMT+0
50eccda
๐Ÿ”„Changed
  • Dedupe 622 more same-gym prefix-artifact Team rows
  • User still saw "Top Gun All Stars - TGLC" alongside "TGLC" at the same
  • gym โ€” the original audit didn't catch this class because the prefix is
  • only part of the gym name (franchise root), not the full gym name.
  • This adds merge-same-gym-prefix-dupes.ts which, for each Team, tries
  • stripping a leading "<gym-name>[ - | ]" OR "<franchise-prefix>[ - | ]"

Files Changed

Created (1):
  • + scripts/maintenance/merge-same-gym-prefix-dupes.ts
Modified (1):
  • ~ scripts/maintenance/merge-same-gym-prefix-dupes.ts

Version 0.2.219

Dedupe 419 duplicate Team rows + prevent recurrence

April 15, 2026 at 10:14 PM GMT+0
bb07f42
๐Ÿ”„Changed
  • Dedupe 419 duplicate Team rows + prevent recurrence
  • Problem: /search surfaced 15+ fragmented cards for single franchises
  • (Top Gun, Stingray, etc.) because team imports created bare-gym artifact
  • teams alongside the real located-gym teams, and no DB constraint stopped
  • same-gym same-name dupes from forming.
  • Cleanup (data):

Files Changed

Created (5):
  • + prisma/migrations/add_team_unique_name_gym.sql
  • + scripts/maintenance/apply-team-unique-index.ts
  • + scripts/maintenance/audit-team-duplicates.ts
  • + scripts/maintenance/merge-same-gym-exact-dupes.ts
  • + scripts/maintenance/merge-team-clusters.ts
Modified (7):
  • ~ prisma/migrations/add_team_unique_name_gym.sql
  • ~ scripts/maintenance/apply-team-unique-index.ts
  • ~ scripts/maintenance/audit-team-duplicates.ts
  • ~ scripts/maintenance/merge-exact-franchise-team-dupes.ts
  • ~ scripts/maintenance/merge-same-gym-exact-dupes.ts
  • ~ scripts/maintenance/merge-team-clusters.ts
  • ~ src/lib/import/franchise-team-resolver.ts

Version 0.2.218

Dedupe 419 duplicate Team rows + prevent recurrence

April 15, 2026 at 10:13 PM GMT+0
b98ab8d
๐Ÿ”„Changed
  • Dedupe 419 duplicate Team rows + prevent recurrence
  • Problem: /search surfaced 15+ fragmented cards for single franchises
  • (Top Gun, Stingray, etc.) because team imports created bare-gym artifact
  • teams alongside the real located-gym teams, and no DB constraint stopped
  • same-gym same-name dupes from forming.
  • Cleanup (data):

Files Changed

Created (5):
  • + prisma/migrations/add_team_unique_name_gym.sql
  • + scripts/maintenance/apply-team-unique-index.ts
  • + scripts/maintenance/audit-team-duplicates.ts
  • + scripts/maintenance/merge-same-gym-exact-dupes.ts
  • + scripts/maintenance/merge-team-clusters.ts
Modified (7):
  • ~ prisma/migrations/add_team_unique_name_gym.sql
  • ~ scripts/maintenance/apply-team-unique-index.ts
  • ~ scripts/maintenance/audit-team-duplicates.ts
  • ~ scripts/maintenance/merge-exact-franchise-team-dupes.ts
  • ~ scripts/maintenance/merge-same-gym-exact-dupes.ts
  • ~ scripts/maintenance/merge-team-clusters.ts
  • ~ src/lib/import/franchise-team-resolver.ts

Version 0.2.217

Dedupe 419 duplicate Team rows + prevent recurrence

April 15, 2026 at 10:12 PM GMT+0
321d1ed
๐Ÿ”„Changed
  • Dedupe 419 duplicate Team rows + prevent recurrence
  • Problem: /search surfaced 15+ fragmented cards for single franchises
  • (Top Gun, Stingray, etc.) because team imports created bare-gym artifact
  • teams alongside the real located-gym teams, and no DB constraint stopped
  • same-gym same-name dupes from forming.
  • Cleanup (data):

Files Changed

Created (5):
  • + prisma/migrations/add_team_unique_name_gym.sql
  • + scripts/maintenance/apply-team-unique-index.ts
  • + scripts/maintenance/audit-team-duplicates.ts
  • + scripts/maintenance/merge-same-gym-exact-dupes.ts
  • + scripts/maintenance/merge-team-clusters.ts
Modified (7):
  • ~ prisma/migrations/add_team_unique_name_gym.sql
  • ~ scripts/maintenance/apply-team-unique-index.ts
  • ~ scripts/maintenance/audit-team-duplicates.ts
  • ~ scripts/maintenance/merge-exact-franchise-team-dupes.ts
  • ~ scripts/maintenance/merge-same-gym-exact-dupes.ts
  • ~ scripts/maintenance/merge-team-clusters.ts
  • ~ src/lib/import/franchise-team-resolver.ts

Version 0.2.216

Add onboarding routes and harden team import safety

April 12, 2026 at 2:48 PM GMT+0
6b07bb5
โœจAdded
  • Add onboarding routes and harden team import safety

Files Changed

Created (5):
  • + src/app/api/klaviyo/track-cancel/route.ts
  • + src/app/api/klaviyo/track-feature-gated/route.ts
  • + src/app/api/klaviyo/track-referral-shared/route.ts
  • + src/app/api/stripe/pause/route.ts
  • + src/app/welcome/page.tsx
Modified (7):
  • ~ src/app/api/klaviyo/track-cancel/route.ts
  • ~ src/app/api/klaviyo/track-feature-gated/route.ts
  • ~ src/app/api/klaviyo/track-referral-shared/route.ts
  • ~ src/app/api/stripe/pause/route.ts
  • ~ src/app/welcome/page.tsx
  • ~ src/lib/import/team-matcher.ts
  • ~ src/lib/schedule-display.ts

Version 0.2.215

Fix gym season filtering and franchise team resolution

April 12, 2026 at 2:39 PM GMT+0
888a2bf
๐Ÿ›Fixed
  • Fix gym season filtering and franchise team resolution

Files Changed

Created (2):
  • + scripts/maintenance/merge-exact-franchise-team-dupes.ts
  • + src/lib/import/franchise-team-resolver.ts
Modified (8):
  • ~ scripts/maintenance/merge-exact-franchise-team-dupes.ts
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/components/competitions/competition-performances.tsx
  • ~ src/components/competitions/division-scorecard.tsx
  • ~ src/components/competitions/divisions-tab.tsx
  • ~ src/components/gyms/gym-teams-section.tsx
  • ~ src/lib/import/franchise-team-resolver.ts
  • ~ src/lib/import/index.ts

Version 0.2.214

Fix schedule import: strict gym matching + franchise-aware team lookup

April 9, 2026 at 11:07 PM GMT+0
1786835
๐Ÿ›Fixed
  • Fix schedule import: strict gym matching + franchise-aware team lookup
  • Two latent bugs surfaced importing the 2026 Northeast Summit schedule:
  • 1. findOrCreateGym fuzzy-matched at 0.75 with no city/state, collapsing
  • distinct franchises (e.g. "Force Athletics" -> "G-Force Athletics",
  • "Cheer Idol Athletics" -> "Cheer Athletics"). Summit spreadsheets
  • rarely ship city/state, so the fuzzy branch was ungrounded.

Files Changed

Created (7):
  • + scripts/debug/audit-northeast-schedule.ts
  • + scripts/debug/find-northeast-summit.ts
  • + scripts/debug/import-northeast-summit-schedule.ts
  • + scripts/debug/import-summit-2026-regionals.ts
  • + scripts/debug/rerun-northeast-summit.ts
  • + scripts/debug/spot-check-new-teams.ts
  • + scripts/debug/verify-northeast-fix.ts
Modified (10):
  • ~ scripts/debug/audit-northeast-schedule.ts
  • ~ scripts/debug/find-northeast-summit.ts
  • ~ scripts/debug/import-northeast-summit-schedule.ts
  • ~ scripts/debug/import-summit-2026-regionals.ts
  • ~ scripts/debug/rerun-northeast-summit.ts
  • ~ scripts/debug/spot-check-new-teams.ts
  • ~ scripts/debug/verify-northeast-fix.ts
  • ~ src/lib/import/gym-matcher.ts
  • ~ src/lib/import/schedule-import.ts
  • ~ src/lib/import/schedule-matcher.ts

Version 0.2.213

Match desktop sidebar to mobile drawer (parity nav)

April 9, 2026 at 11:04 PM GMT+0
1df74c1
๐Ÿ”„Changed
  • Match desktop sidebar to mobile drawer (parity nav)
  • Desktop sidebar was showing 4 items (Feed/Scores/Plan/Me) while mobile
  • drawer has 15. Rewrites DashboardSidebarNav to render the full rich list
  • that mirrors the drawer, so every destination reachable from mobile is
  • also reachable from desktop in one click.
  • Desktop sidebar now shows:

Files Changed

Modified (1):
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.212

Add My People and News to mobile drawer nav

April 9, 2026 at 10:48 PM GMT+0
3b6bd0b
โœจAdded
  • Add My People and News to mobile drawer nav
  • Drawer was missing two destinations users want quick access to:
  • My People (/:username/people) โ€” follows people/athletes
  • News (/news) โ€” the public cheer hub
  • Added to the main drawer section alongside the other personal destinations.

Files Changed

Modified (1):
  • ~ src/components/navbar.tsx

Version 0.2.211

Fix empty mobile drawer: rich Twitter/X-style personal hub

April 9, 2026 at 10:37 PM GMT+0
ca567d5
๐Ÿ›Fixed
  • Fix empty mobile drawer: rich Twitter/X-style personal hub
  • Phase 5 scoped the drawer down too far โ€” it ended up with 4 items in a full-height container, looking broken. Rebuild the drawer as a proper Twitter/X-style personal navigation hub.
  • User header card at top (tap to Profile): avatar, display name, @handle
  • Main personal destinations: Profile, Notifications (with unread badge), My Teams, My Schedules, My Gyms, My Competitions, Analyze, Groups
  • Settings section: Settings, Switch accounts, Send feedback, Learn
  • Conditional Upgrade to Elite pill (free tier only) with the existing pink/purple gradient

Files Changed

Modified (1):
  • ~ src/components/navbar.tsx

Version 0.2.210

Nav redesign: mobile header + 4-tab bottom bar + audience-aware /my

April 9, 2026 at 9:31 PM GMT+0
d1b2c93
๐Ÿ”„Changed
  • Nav redesign: mobile header + 4-tab bottom bar + audience-aware /my
  • Mobile header now has search + notification bell for auth users (was logo-only)
  • Bottom bar: Feed / Scores / Plan / Me (4 tabs, renamed from 5). News merged into Feed context
  • Me tab routes to /my (dashboard), unorphaning the personalization surface
  • /my hero card adapts to audience: athletes see profile completion pull, free watchers with 2+ follows see Elite upgrade CTA, new users see welcome nudge
  • /my tile grid reorders by audience (athlete/watcher/new)

Files Changed

Created (2):
  • + src/components/feed-tabs-nav.tsx
  • + src/components/my/my-hero-card.tsx
Modified (9):
  • ~ src/app/home/page.tsx
  • ~ src/app/my/page.tsx
  • ~ src/app/news/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/feed-tabs-nav.tsx
  • ~ src/components/my/my-hero-card.tsx
  • ~ src/components/my/my-stuff-grid.tsx
  • ~ src/components/navbar.tsx

Version 0.2.209

Allow logged-in users to view landing page at /

April 9, 2026 at 6:30 PM GMT+0
2b94705
๐Ÿ”„Changed
  • Allow logged-in users to view landing page at /
  • Remove the RootPage redirect to /home so both guests and authenticated
  • users can revisit the onboarding pitch and product overview on the
  • landing page. Middleware already treats / as public, so no other
  • changes were needed.

Files Changed

Modified (1):
  • ~ src/app/page.tsx

Version 0.2.208

Fix schedule display: Summit routine codes + /schedules dedupe

April 9, 2026 at 2:56 PM GMT+0
d2a8260
๐Ÿ›Fixed
  • Fix schedule display: Summit routine codes + /schedules dedupe
  • Three schedule-page bugs spotted on fullout.energy:
  • 1. Summit regional schedules rendered routine/entry IDs (L2S82936, L3Y0114,
  • CA-EL102772) as bold team names because Varsity's Summit spreadsheets put
  • codes in the "Team" column and the matcher created Team rows keyed to
  • them. New isRoutineCode() helper in src/lib/schedule-display.ts; card

Files Changed

Created (2):
  • + scripts/import/import-missing-summit-schedules.ts
  • + src/lib/schedule-display.ts
Modified (6):
  • ~ scripts/import/import-missing-summit-schedules.ts
  • ~ src/app/schedules/page.tsx
  • ~ src/components/schedules/grouped-schedule-table.tsx
  • ~ src/components/schedules/schedule-card.tsx
  • ~ src/components/schedules/schedule-table.tsx
  • ~ src/lib/schedule-display.ts

Version 0.2.207

Fix Stingray Allstars franchise mapping: split 291-team HQ into 15 locations

April 9, 2026 at 2:47 PM GMT+0
2f5e25d
๐Ÿ›Fixed
  • Fix Stingray Allstars franchise mapping: split 291-team HQ into 15 locations
  • The main "The Stingray Allstars" Marietta gym had 291 teams dumped into it
  • across multiple real franchise locations. Research-verified the full list
  • of ~15 active Stingray Allstars franchises and re-assigned teams by theme:
  • Marietta HQ: 291 โ†’ 73 (Green flagship + core colors)
  • Cartersville: 8 โ†’ 40 (weather/elements)

Files Changed

Created (5):
  • + scripts/investigate-stingray-main-gym.ts
  • + scripts/investigate-stingray.ts
  • + scripts/maintenance/cleanup-stingray-empty-gyms.ts
  • + scripts/maintenance/fix-stingray-franchises.ts
  • + scripts/verify-stingray-final.ts
Modified (5):
  • ~ scripts/investigate-stingray-main-gym.ts
  • ~ scripts/investigate-stingray.ts
  • ~ scripts/maintenance/cleanup-stingray-empty-gyms.ts
  • ~ scripts/maintenance/fix-stingray-franchises.ts
  • ~ scripts/verify-stingray-final.ts

Version 0.2.206

Fix Vercel build: add missing src/components/growth/ directory

April 9, 2026 at 1:52 PM GMT+0
95df868
๐Ÿ›Fixed
  • Fix Vercel build: add missing src/components/growth/ directory
  • subscription-actions.tsx was committed earlier (a7a0156) importing
  • @/components/growth/CancelSaveFlow but the growth/ directory was left
  • untracked, breaking the Vercel build. Adds the three growth components
  • that were sitting in the working tree so the build can resolve the import.

Files Changed

Created (3):
  • + src/components/growth/CancelSaveFlow.tsx
  • + src/components/growth/ReferralPrompt.tsx
  • + src/components/growth/UpgradePrompt.tsx
Modified (3):
  • ~ src/components/growth/CancelSaveFlow.tsx
  • ~ src/components/growth/ReferralPrompt.tsx
  • ~ src/components/growth/UpgradePrompt.tsx

Version 0.2.205

Import The Cheerleading Worlds (2004-2025) + 2026 schedule + franchise remap

April 9, 2026 at 1:47 PM GMT+0
ac0d26e
๐Ÿ”„Changed
  • Import The Cheerleading Worlds (2004-2025) + 2026 schedule + franchise remap
  • Adds full historical Worlds ranking data from thecheerleadingworlds.net
  • and the 2026 compete order PDF, plus cleanup tools for the franchise
  • gym naming drift that the import surfaced.
  • Historical import (2004-2025, 2020 cancelled for COVID):
  • scripts/import/scrape-cheerleading-worlds.ts parses the TablePress HTML

Files Changed

Created (9):
  • + scripts/import/import-cheerleading-worlds.ts
  • + scripts/import/import-worlds-2026-schedule.ts
  • + scripts/import/remap-worlds-flagship-fixes.ts
  • + scripts/import/remap-worlds-franchise-gyms.ts
  • + scripts/import/scrape-cheerleading-worlds.ts
  • + src/components/ui/worlds-champion-badge.tsx
  • + src/lib/import/worlds-parsers.ts
  • + src/lib/worlds-event-dates.ts
  • + src/lib/worlds-utils.ts
Modified (11):
  • ~ scripts/import/import-cheerleading-worlds.ts
  • ~ scripts/import/import-worlds-2026-schedule.ts
  • ~ scripts/import/remap-worlds-flagship-fixes.ts
  • ~ scripts/import/remap-worlds-franchise-gyms.ts
  • ~ scripts/import/scrape-cheerleading-worlds.ts
  • ~ src/app/schedules/[slug]/page.tsx
  • ~ src/components/competitions/series-page-client.tsx
  • ~ src/components/ui/worlds-champion-badge.tsx
  • ~ src/lib/import/worlds-parsers.ts
  • ~ src/lib/worlds-event-dates.ts
  • ~ src/lib/worlds-utils.ts

Version 0.2.204

C:/Program Files/Git/home Instagram redesign + /scores cleanup + perf pass

April 9, 2026 at 1:25 PM GMT+0
b3ec2f1
๐Ÿ”„Changed
  • C:/Program Files/Git/home Instagram redesign + /scores cleanup + perf pass
  • /home feed redesign
  • Kill giant "Your feed of highlights..." header (wasted 20% of viewport)
  • Kill "Photo uploaded / Video uploaded / Performance update" titles
  • Collapse card to Instagram layout: avatar + name + relative time in one row,
  • edge-to-edge media on mobile, icon-only share action, name-prefixed caption

Files Changed

Modified (15):
  • ~ src/app/api/competitions/[id]/route.ts
  • ~ src/app/api/competitions/route.ts
  • ~ src/app/api/feed/route.ts
  • ~ src/app/api/live-scores/route.ts
  • ~ src/app/globals.css
  • ~ src/app/home/page.tsx
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/profile/media-share-buttons.tsx
  • ~ src/components/profile/profile-video-player.tsx
  • ~ src/components/providers/page-transition-provider.tsx
  • ~ src/components/scores/competitions-tab.tsx
  • ~ src/components/scores/scores-tab-nav.tsx
  • ~ src/lib/auth.ts
  • ~ src/lib/prisma.ts
  • ~ src/lib/utils.ts

Version 0.2.203

Schedule filters + grouping: dynamic Division + Discipline

April 9, 2026 at 1:21 PM GMT+0
ae17f3e
๐Ÿ”„Changed
  • Schedule filters + grouping: dynamic Division + Discipline
  • The schedule viewer's filters and group-by were hardcoded around
  • all-star data (level L1โ€“L7, Tiny/Mini/Youth ages, etc.), so college
  • schedules showed empty filter sections and no useful grouping
  • options (level/age/size/divisionGroup were all null for NCA
  • Collegiate rows).

Files Changed

Created (2):
  • + scripts/debug/resolve-nca-schedule-slug.ts
  • + scripts/maintenance/set-nca-college-schedule-matched.ts
Modified (12):
  • ~ scripts/debug/resolve-nca-schedule-slug.ts
  • ~ scripts/import/import-nca-college-2026-schedule.ts
  • ~ scripts/maintenance/set-nca-college-schedule-matched.ts
  • ~ src/app/api/schedules/[slug]/entries/route.ts
  • ~ src/app/api/schedules/[slug]/filter-options/route.ts
  • ~ src/components/schedules/grouped-schedule-cards.tsx
  • ~ src/components/schedules/grouped-schedule-table.tsx
  • ~ src/components/schedules/schedule-filters-sheet.tsx
  • ~ src/components/schedules/schedule-filters-sidebar.tsx
  • ~ src/components/schedules/schedule-viewer.tsx
  • ~ src/lib/import/discipline-inference.ts
  • ~ src/lib/schedule-slug.ts

Version 0.2.202

Phase 3e: Elite 14-day trial + invite friends + Klaviyo events + brand polish

April 9, 2026 at 12:14 AM GMT+0
7773c7b
๐Ÿ”„Changed
  • Phase 3e: Elite 14-day trial + invite friends + Klaviyo events + brand polish
  • Five threads of polish landing together:
  • 1. 14-day free trial for Elite monthly
  • Stripe checkout accepts a new trial: true flag and sets trialDays=14
  • when the plan is Elite monthly with no conflicting offer code.
  • Pricing page adds a secondary "Try Elite Free for 14 Days" button

Files Changed

Modified (20):
  • ~ src/app/api/stripe/create-checkout/route.ts
  • ~ src/app/build-your-legacy/page.tsx
  • ~ src/app/go-pro/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/how-scores-work/page.tsx
  • ~ src/app/plan-your-day/page.tsx
  • ~ src/app/pricing/page.tsx
  • ~ src/app/settings/page.tsx
  • ~ src/app/signup/page.tsx
  • ~ src/app/subscribe/subscribe-page-client.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/landing/landing-page.tsx
  • ~ src/components/navbar.tsx
  • ~ src/components/settings/settings-layout.tsx
  • ~ src/components/settings/subscription-actions.tsx
  • ~ src/components/teams/team-header.tsx
  • ~ src/components/welcome/welcome-step-friends.tsx
  • ~ src/components/welcome/welcome-step-intro.tsx
  • ~ src/components/welcome/welcome-step-share.tsx
  • ~ src/components/welcome/welcome-step-upgrade.tsx

Version 0.2.201

Track college cheer + dance: NCA Collegiate 2026 setup

April 8, 2026 at 11:55 PM GMT+0
23374ea
๐Ÿ”„Changed
  • Track college cheer + dance: NCA Collegiate 2026 setup
  • The site has never tracked college cheer or dance as first-class
  • disciplines before. NCA & NDA Collegiate Nationals (Daytona Beach)
  • starts 2026-04-09, so:
  • Activate College Cheer discipline (was inactive) and add new
  • College Dance discipline with category+tier classification schema.

Files Changed

Created (14):
  • + scripts/debug/audit-college-inference.ts
  • + scripts/debug/check-live-monitor-detection.ts
  • + scripts/debug/check-nca-college-state.ts
  • + scripts/debug/check-schedule-entries.ts
  • + scripts/debug/inspect-nca-college-pdf.ts
  • + scripts/debug/inspect-nca-dance-section.ts
  • + scripts/debug/review-nca-college-schedule.ts
  • + scripts/debug/review-nca-suspicious.ts
  • + scripts/debug/test-parse-event-name.ts
  • + scripts/import/import-nca-college-2026-schedule.ts
  • + scripts/maintenance/fix-nca-college-2026.ts
  • + scripts/maintenance/fix-nca-college-schedule-rows.ts
  • + scripts/setup/activate-college-disciplines.ts
  • + src/lib/import/discipline-inference.ts
Modified (17):
  • ~ scripts/debug/audit-college-inference.ts
  • ~ scripts/debug/check-live-monitor-detection.ts
  • ~ scripts/debug/check-nca-college-state.ts
  • ~ scripts/debug/check-schedule-entries.ts
  • ~ scripts/debug/inspect-nca-college-pdf.ts
  • ~ scripts/debug/inspect-nca-dance-section.ts
  • ~ scripts/debug/review-nca-college-schedule.ts
  • ~ scripts/debug/review-nca-suspicious.ts
  • ~ scripts/debug/test-parse-event-name.ts
  • ~ scripts/import/import-nca-college-2026-schedule.ts
  • ~ scripts/maintenance/fix-nca-college-2026.ts
  • ~ scripts/maintenance/fix-nca-college-schedule-rows.ts
  • ~ scripts/setup/activate-college-disciplines.ts
  • ~ src/app/api/admin/scraper/schedule-intake/route.ts
  • ~ src/lib/import/discipline-inference.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/import/schedule-import.ts

Version 0.2.200

Update hero search helper copy on landing page

April 8, 2026 at 11:46 PM GMT+0
103ed48
๐Ÿ”„Changed
  • Update hero search helper copy on landing page
  • Replace "Find your team โ€” your data might already be here" with
  • "Your team's already here. Now build your profile." The old copy
  • sounded surveillance-y ("your data might already be here"). The new
  • line leads with the real value prop (team history is already tracked)
  • and ties directly to the primary CTA.

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.199

Content queue: swap Buffer schedule for in-app post flow

April 8, 2026 at 11:35 PM GMT+0
8d18cd2
๐Ÿ”„Changed
  • Content queue: swap Buffer schedule for in-app post flow
  • Replace the "Schedule to Buffer" button with a self-contained manual
  • posting workflow. Everything stays on the app โ€” no external service
  • dependency for daily use.
  • Admin queue preview dialog now has three footer actions:
  • Download Image โ€” downloads the rendered PNG with a filename-safe slug

Files Changed

Modified (1):
  • ~ src/components/admin/content-actions.tsx

Version 0.2.198

Phase 3c + 3d: Kill ambient upgrade nags + Pro tier /go-pro showcase

April 8, 2026 at 11:29 PM GMT+0
3357d19
๐Ÿ”„Changed
  • Phase 3c + 3d: Kill ambient upgrade nags + Pro tier /go-pro showcase
  • Phase 3c โ€” Contextual upgrade prompts
  • Based on the Phase 1c audit, the app had two patterns competing: ambient
  • banners / persistent sidebar nags (passive, annoying, low-converting) and
  • contextual prompts that fire at the moment of the limit (targeted,
  • high-converting). This phase removes the ambient pattern and doubles down

Files Changed

Created (1):
  • + src/app/go-pro/page.tsx
Modified (8):
  • ~ src/app/compose/page.tsx
  • ~ src/app/go-pro/page.tsx
  • ~ src/app/news/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/competitions/competition-tabs.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/welcome/welcome-step-upgrade.tsx
  • ~ src/middleware.ts

Version 0.2.197

Phase 2: Restructure core logged-in experience

April 8, 2026 at 11:21 PM GMT+0
b78c893
๐Ÿ”„Changed
  • Phase 2: Restructure core logged-in experience
  • Three sub-phases that together rebuild the /home experience, create a
  • public /news hub, and simplify the navigation to 5 clear destinations.
  • ## Phase 2a โ€” Move hub to /news
  • The existing content hub (scores ticker, news articles, podcasts,
  • leaderboards, featured gyms, competition timeline, etc.) now lives at

Files Changed

Created (1):
  • + src/app/news/page.tsx
Modified (8):
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/app/home/page.tsx
  • ~ src/app/news/page.tsx
  • ~ src/app/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/navbar.tsx
  • ~ src/middleware.ts

Version 0.2.196

Content factory: add athlete, rankings, gym generators + LLM captions

April 8, 2026 at 11:09 PM GMT+0
4dbd262
๐Ÿ”„Changed
  • Content factory: add athlete, rankings, gym generators + LLM captions
  • Expands the content queue into a hands-off weekly content machine covering
  • all 5 content pillars from the growth playbook.
  • New generators (all follow the existing satoriโ†’resvgโ†’sharp pipeline):
  • ATHLETE_SPOTLIGHT: picks a high-density public Person (photos + teams +
  • badges), renders portrait card for the Build Your Legacy track. 30-day

Files Changed

Created (10):
  • + src/app/api/admin/content/competitions/[id]/divisions/route.ts
  • + src/app/api/admin/content/competitions/route.ts
  • + src/app/api/cron/content-athlete-spotlight/route.ts
  • + src/app/api/cron/content-gym-story/route.ts
  • + src/app/api/cron/content-season-standings/route.ts
  • + src/components/admin/competition-scorecard-dialog.tsx
  • + src/lib/content/athlete-spotlight.ts
  • + src/lib/content/caption-variants.ts
  • + src/lib/content/gym-story.ts
  • + src/lib/content/season-standings.ts
Modified (19):
  • ~ src/app/admin/content/page.tsx
  • ~ src/app/api/admin/content/competitions/[id]/divisions/route.ts
  • ~ src/app/api/admin/content/competitions/route.ts
  • ~ src/app/api/admin/content/generate/route.ts
  • ~ src/app/api/cron/content-athlete-spotlight/route.ts
  • ~ src/app/api/cron/content-gym-story/route.ts
  • ~ src/app/api/cron/content-season-standings/route.ts
  • ~ src/components/admin/competition-scorecard-dialog.tsx
  • ~ src/components/admin/content-actions.tsx
  • ~ src/components/admin/content-generate-button.tsx
  • ~ src/lib/competition-scorecards.ts
  • ~ src/lib/content/athlete-spotlight.ts
  • ~ src/lib/content/caption-templates.ts
  • ~ src/lib/content/caption-variants.ts
  • ~ src/lib/content/gym-story.ts
  • ~ src/lib/content/score-drop.ts
  • ~ src/lib/content/season-standings.ts
  • ~ src/lib/content/weekend-preview.ts
  • ~ src/lib/content/weekly-roundup.ts

Version 0.2.195

Phase 3a + 3b: Expand /welcome to 6 steps with pain setup, friends finder, soft paywall

April 8, 2026 at 10:27 PM GMT+0
bd65a2a
๐Ÿ”„Changed
  • Phase 3a + 3b: Expand /welcome to 6 steps with pain setup, friends finder, soft paywall
  • Rebuild the post-signup onboarding flow following validated patterns from
  • Duolingo, Strava, and Hudl: remind users of the pain, show the solution,
  • ask for commitment (soft paywall) before the celebration.
  • Previous flow (3 steps):
  • Photo โ†’ Follow team โ†’ Share link

Files Changed

Created (8):
  • + src/components/welcome/welcome-flow.tsx
  • + src/components/welcome/welcome-progress.tsx
  • + src/components/welcome/welcome-step-follow.tsx
  • + src/components/welcome/welcome-step-friends.tsx
  • + src/components/welcome/welcome-step-intro.tsx
  • + src/components/welcome/welcome-step-photo.tsx
  • + src/components/welcome/welcome-step-share.tsx
  • + src/components/welcome/welcome-step-upgrade.tsx
Modified (9):
  • ~ src/components/navbar.tsx
  • ~ src/components/welcome/welcome-flow.tsx
  • ~ src/components/welcome/welcome-progress.tsx
  • ~ src/components/welcome/welcome-step-follow.tsx
  • ~ src/components/welcome/welcome-step-friends.tsx
  • ~ src/components/welcome/welcome-step-intro.tsx
  • ~ src/components/welcome/welcome-step-photo.tsx
  • ~ src/components/welcome/welcome-step-share.tsx
  • ~ src/components/welcome/welcome-step-upgrade.tsx

Version 0.2.194

Phase 1: Content lock + Athletes tab + upgrade audit + docs realign

April 8, 2026 at 10:14 PM GMT+0
76e8a97
๐Ÿ”„Changed
  • Phase 1: Content lock + Athletes tab + upgrade audit + docs realign
  • Three independent tactical wins that prepare FullOut for monetization
  • and reinforce the profile-first pitch, plus PRD and brand guide updates
  • to match the new product direction.
  • ## Content creation locked to Elite+ (Phase 1a)
  • Free users can no longer post photos, videos, or link embeds. The prior

Files Changed

Created (1):
  • + src/components/athletes/athlete-card.tsx
Modified (8):
  • ~ src/app/api/videos/route.ts
  • ~ src/app/compose/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/athletes/athlete-card.tsx
  • ~ src/components/dashboard/post-content.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/teams/competition-analysis/team-page-tabs.tsx

Version 0.2.193

Link profile mockup and feature cards to /build-your-legacy, use pink logo

April 8, 2026 at 4:00 PM GMT+0
24ca775
๐Ÿ”„Changed
  • Link profile mockup and feature cards to /build-your-legacy, use pink logo
  • Phone mockup in profile preview is now a clickable link to the
  • profile walkthrough, with a subtle hover lift
  • The three "Everything an athlete needs" feature cards now link to
  • /build-your-legacy as well
  • Swap the hero logo from white to the pink brand logo and nearly

Files Changed

Modified (1):
  • ~ src/components/landing/landing-page.tsx

Version 0.2.192

Add showcase pages, viral loop, and search conversion funnel

April 8, 2026 at 3:56 PM GMT+0
96b40ee
โœจAdded
  • Add showcase pages, viral loop, and search conversion funnel
  • The landing page drives signups, but the rest of the site wasn't converting โ€”
  • search dumped 200+ raw results, profile pages had no viral hook, and the
  • value props (scores, schedules) had no marketing surface. This adds three
  • showcase experiences that sell each value prop with real data, a search
  • redesign that converts instead of just retrieves, and a viral loop on every

Files Changed

Created (10):
  • + src/app/build-your-legacy/page.tsx
  • + src/app/how-scores-work/page.tsx
  • + src/app/plan-your-day/page.tsx
  • + src/components/search/claim-banner.tsx
  • + src/components/showcase/showcase-level-preview.tsx
  • + src/components/showcase/showcase-profile-view.tsx
  • + src/components/viral/built-with-badge.tsx
  • + src/components/viral/viral-footer-cta.tsx
  • + src/lib/showcase-competition.ts
  • + src/lib/showcase-schedule.ts
Modified (14):
  • ~ src/app/build-your-legacy/page.tsx
  • ~ src/app/globals.css
  • ~ src/app/how-scores-work/page.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/plan-your-day/page.tsx
  • ~ src/app/search/page.tsx
  • ~ src/components/landing/landing-page.tsx
  • ~ src/components/search/claim-banner.tsx
  • ~ src/components/showcase/showcase-level-preview.tsx
  • ~ src/components/showcase/showcase-profile-view.tsx
  • ~ src/components/viral/built-with-badge.tsx
  • ~ src/components/viral/viral-footer-cta.tsx
  • ~ src/lib/showcase-competition.ts
  • ~ src/lib/showcase-schedule.ts

Version 0.2.191

Add sitemap, robots, and per-route metadata for SEO

April 8, 2026 at 1:34 PM GMT+0
e8e3484
โœจAdded
  • Add sitemap, robots, and per-route metadata for SEO
  • robots.ts: allow root, block /admin, /api, /settings, /onboarding,
  • /monitoring. Points crawlers at /sitemap.xml.
  • sitemap.ts: static routes + dynamic entries for up to 2k competitions,
  • 10k gyms, 20k teams (slug-preferred URLs). Revalidates daily. Queries
  • are .catch()-guarded so one failing section can't nuke the sitemap.

Files Changed

Created (5):
  • + src/app/login/layout.tsx
  • + src/app/pricing/layout.tsx
  • + src/app/robots.ts
  • + src/app/signup/layout.tsx
  • + src/app/sitemap.ts
Modified (5):
  • ~ src/app/login/layout.tsx
  • ~ src/app/pricing/layout.tsx
  • ~ src/app/robots.ts
  • ~ src/app/signup/layout.tsx
  • ~ src/app/sitemap.ts

Version 0.2.190

Optimize hub data queries: batch N+1, cache, remove nested relation filters

April 8, 2026 at 1:32 PM GMT+0
03164be
๐Ÿ”„Changed
  • Optimize hub data queries: batch N+1, cache, remove nested relation filters
  • getPersonalizedTeams: was firing 2 queries per followed team in a loop
  • (~22 round-trips for 10 teams). Now batches into 3 parallel findMany
  • calls and groups in-memory. Also wrapped in unstable_cache with a
  • per-user key and 60s TTL.
  • getCompetitionTimeline: previously uncached, now wrapped in

Files Changed

Modified (1):
  • ~ src/lib/hub-data.ts

Version 0.2.189

Add landing-focused SEO metadata to root route

April 8, 2026 at 1:27 PM GMT+0
608b246
โœจAdded
  • Add landing-focused SEO metadata to root route
  • Most visits to `/` from social shares and search engines are
  • unauthenticated, so the metadata should target the guest landing page
  • experience rather than the hub defaults from the root layout.

Files Changed

Modified (1):
  • ~ src/app/page.tsx

Version 0.2.188

Add profile-focused landing page for logged-out visitors

April 8, 2026 at 1:26 PM GMT+0
67a4f79
โœจAdded
  • Add profile-focused landing page for logged-out visitors
  • Split the root route by auth state: guests see a new mobile-first landing
  • page that sells "Build Your Legacy" and athlete profiles, while logged-in
  • users keep the existing hub. Also adds people to search results, brings
  • the brand pink in line with #EE2B8C, and fixes mobile overflow on the
  • search page.

Files Changed

Created (4):
  • + src/components/landing/landing-page.tsx
  • + src/components/landing/landing-scroll-reveal.tsx
  • + src/components/landing/landing-search.tsx
  • + src/components/landing/landing-sticky-cta.tsx
Modified (9):
  • ~ src/app/globals.css
  • ~ src/app/layout.tsx
  • ~ src/app/page.tsx
  • ~ src/app/search/page.tsx
  • ~ src/components/landing/landing-page.tsx
  • ~ src/components/landing/landing-scroll-reveal.tsx
  • ~ src/components/landing/landing-search.tsx
  • ~ src/components/landing/landing-sticky-cta.tsx
  • ~ src/components/navbar.tsx

Version 0.2.187

Overlap profile avatar on cover photo like Twitter/X

April 8, 2026 at 1:05 PM GMT+0
87f01c4
๐Ÿ”„Changed
  • Overlap profile avatar on cover photo like Twitter/X
  • Avatar now sits halfway over the cover photo bottom edge. Cover and
  • profile card are bundled in a single rounded/shadow container so they
  • read as one unit.

Files Changed

Modified (2):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/profile/profile-card-clean.tsx

Version 0.2.186

Fix mobile overflow on competition cards by adding min-w-0

April 8, 2026 at 2:05 AM GMT+0
31f8dd1
๐Ÿ›Fixed
  • Fix mobile overflow on competition cards by adding min-w-0
  • CSS Grid children default to min-width:auto, preventing text
  • truncation from working. min-w-0 lets overflow-hidden take effect.

Files Changed

Modified (1):
  • ~ src/components/hub/competition-card.tsx

Version 0.2.185

Improve weekend preview card and add job numbers to content queue

April 3, 2026 at 1:40 AM GMT+0
49d3659
๐Ÿ”„Changed
  • Improve weekend preview card and add job numbers to content queue
  • Weekend preview: bump comp name 30โ†’38px, always show city/state below
  • each competition, drop venue line, reduce max items 6โ†’5, use FONT_SIZES
  • constants throughout. Content queue: add sequential # column for easy
  • reference when discussing corrections.

Files Changed

Modified (2):
  • ~ src/app/admin/content/page.tsx
  • ~ src/lib/content/weekend-preview.ts

Version 0.2.184

Increase content card font sizes to match scorecard generator minimums

April 2, 2026 at 2:24 AM GMT+0
c6459c3
๐Ÿ”„Changed
  • Increase content card font sizes to match scorecard generator minimums
  • Aligned FONT_SIZES with competition-scorecards.ts scale (sy() at 1920โ†’1350).
  • Body text 18โ†’22px, primary 22โ†’28px, scores 24โ†’32px, sections 30โ†’34px.
  • Reduced max items per card from 4โ†’3 to fit the larger text. All generators
  • now use FONT_SIZES constants with nothing below 22px.

Files Changed

Modified (4):
  • ~ src/lib/content/brand.ts
  • ~ src/lib/content/score-drop.ts
  • ~ src/lib/content/weekend-preview.ts
  • ~ src/lib/content/weekly-roundup.ts

Version 0.2.183

Fix Vercel build: move serverExternalPackages and outputFileTracingIncludes under experimental

April 1, 2026 at 9:34 PM GMT+0
4975dc5
๐Ÿ›Fixed
  • Fix Vercel build: move serverExternalPackages and outputFileTracingIncludes under experimental
  • Next.js 14 expects these under `experimental`, not at the top level. The top-level
  • keys were silently ignored, causing webpack to try bundling @resvg/resvg-js native
  • binaries which fails on Vercel.

Version 0.2.182

Add uniform brand icons to gyms listing page

April 1, 2026 at 9:33 PM GMT+0
f1b6784
โœจAdded
  • Add uniform brand icons to gyms listing page
  • The uniformBrand field wasn't being fetched or rendered on the gyms
  • page, so Rebel/Varsity icons were missing next to gym names.

Files Changed

Modified (1):
  • ~ src/app/gyms/page.tsx

Version 0.2.181

Add collapsible "More" section to sidebar nav for Leaderboards and Analyze

April 1, 2026 at 9:26 PM GMT+0
2a0cfe4
โœจAdded
  • Add collapsible "More" section to sidebar nav for Leaderboards and Analyze
  • These pages became unreachable after the March hub redesign removed them from
  • the main nav. Adds a "More" toggle below Settings (desktop) and a popover on
  • mobile bottom nav. Auto-expands when the user is already on one of those pages.

Files Changed

Modified (1):
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.180

Fix satori module not found on Vercel by using direct ES imports

April 1, 2026 at 7:10 PM GMT+0
572ba6b
๐Ÿ›Fixed
  • Fix satori module not found on Vercel by using direct ES imports
  • Replaced __non_webpack_require__ dynamic require hack with standard ES
  • module imports. These packages are already in serverExternalPackages in
  • next.config.js so Next.js resolves them from node_modules at runtime.

Files Changed

Modified (1):
  • ~ src/lib/content/image-renderer.ts

Version 0.2.179

Remove broken "From the Cheer Community" Instagram gallery from hub

April 1, 2026 at 7:04 PM GMT+0
0a634cc
๐Ÿ—‘๏ธRemoved
  • Remove broken "From the Cheer Community" Instagram gallery from hub

Files Changed

Modified (1):
  • ~ src/app/page.tsx

Version 0.2.178

Enforce minimum font sizes on social media content cards for mobile legibility

April 1, 2026 at 6:46 PM GMT+0
fa721a3
๐Ÿ”„Changed
  • Enforce minimum font sizes on social media content cards for mobile legibility
  • Instagram images are 1080px but viewed at ~360px on phones (3ร— reduction).
  • Added FONT_SIZES constants (min 18px body, 22px primary, 30px section) and
  • applied across all three card types. Reduced visible items per card (5โ†’4) to
  • compensate. Also excluded Prep and Cheerabilities divisions from score drops.

Files Changed

Modified (4):
  • ~ src/lib/content/brand.ts
  • ~ src/lib/content/score-drop.ts
  • ~ src/lib/content/weekend-preview.ts
  • ~ src/lib/content/weekly-roundup.ts

Version 0.2.177

Add calendar preview, upgrade CTA, feed rename, switch account, and mobile nav polish

April 1, 2026 at 6:46 PM GMT+0
9ebe5ef
โœจAdded
  • Add calendar preview, upgrade CTA, feed rename, switch account, and mobile nav polish
  • Competitions page: add calendar + upcoming events section above browse CTA
  • Home page: add Elite upgrade banner for free-tier authenticated users
  • Feed page: rename "Home" to "My Feed", remove "Restart setup" button
  • Settings: add Switch Account option to Account section
  • Mobile bottom nav: increase glass opacity for readability over dark images

Files Changed

Created (2):
  • + src/components/competitions/competition-calendar-preview.tsx
  • + src/components/hub/upgrade-cta-banner.tsx
Modified (6):
  • ~ src/app/competitions/page.tsx
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/app/page.tsx
  • ~ src/components/competitions/competition-calendar-preview.tsx
  • ~ src/components/hub/upgrade-cta-banner.tsx
  • ~ src/components/settings/settings-layout.tsx

Version 0.2.176

Add upgrade-to-Pro CTA in sidebar for free-tier users

April 1, 2026 at 6:45 PM GMT+0
4606bc2
โœจAdded
  • Add upgrade-to-Pro CTA in sidebar for free-tier users

Files Changed

Modified (1):
  • ~ src/components/app-shell.tsx

Version 0.2.175

Redesign nav and competitions page: add My Feed, rename Schedules to Competitions

April 1, 2026 at 5:38 PM GMT+0
ff457e4
๐Ÿ”„Changed
  • Redesign nav and competitions page: add My Feed, rename Schedules to Competitions
  • Add "My Feed" to sidebar nav (auth users) linking to /dashboard/feed
  • Rename "Schedules" to "Competitions" in nav, pointing to /competitions
  • Remove "People" from auth nav (accessible via Discover)
  • Replace mobile bottom nav People with My Feed
  • Competitions page: featured hero cards + weekly timeline + browse CTA

Files Changed

Created (1):
  • + src/app/competitions/browse/page.tsx
Modified (4):
  • ~ src/app/competitions/browse/page.tsx
  • ~ src/app/competitions/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx

Version 0.2.174

Make Recent Top Scores cards clickable and hide scoreless competitions from Last Week

April 1, 2026 at 5:01 PM GMT+0
6490a52
๐Ÿ”„Changed
  • Make Recent Top Scores cards clickable and hide scoreless competitions from Last Week
  • Score ticker cards now link to the division scores page using a stretched-link pattern
  • Added competitionSlug/divisionSlug to ScoreTickerItem type and query
  • Last Week tab filters out competitions with zero performances
  • Watch link remains independently clickable above the card link

Files Changed

Modified (2):
  • ~ src/components/hub/score-ticker.tsx
  • ~ src/lib/hub-data.ts

Version 0.2.173

Improve hub home page: news layout, scores, podcasts, social ordering

April 1, 2026 at 2:42 PM GMT+0
d512e86
๐Ÿ”„Changed
  • Improve hub home page: news layout, scores, podcasts, social ordering
  • Recent Top Scores: show highest scores from most recent competitions, exclude Prep divisions
  • Cheer News: split articles with images (visual grid) from text-only (compact list)
  • Podcasts: increase to 12 episodes, interleave shows to avoid same show back-to-back
  • Social: sort FullOut entries to top of Follow the Community section
  • Hide broken IG gallery section (From The Cheer Community) until images are fixed

Files Changed

Modified (5):
  • ~ src/app/page.tsx
  • ~ src/components/hub/news-card.tsx
  • ~ src/components/hub/news-section.tsx
  • ~ src/components/hub/social-section.tsx
  • ~ src/lib/hub-data.ts

Version 0.2.172

Fix build: remove unused @ts-expect-error directives in image-renderer

April 1, 2026 at 2:41 PM GMT+0
7df1fa3
๐Ÿ›Fixed
  • Fix build: remove unused @ts-expect-error directives in image-renderer
  • Vercel build failed because TypeScript flagged unused @ts-expect-error
  • directives โ€” the underlying expressions don't actually produce TS errors.

Files Changed

Modified (1):
  • ~ src/lib/content/image-renderer.ts

Version 0.2.171

Simplify people page: replace filter sidebar with search box and grid/list toggle

March 31, 2026 at 6:30 PM GMT+0
f6f6ed2
๐Ÿ”„Changed
  • Simplify people page: replace filter sidebar with search box and grid/list toggle

Files Changed

Created (1):
  • + src/components/people/people-search-bar.tsx
Modified (2):
  • ~ src/app/people/page.tsx
  • ~ src/components/people/people-search-bar.tsx

Version 0.2.170

Add missing scores tab components that broke the build

March 31, 2026 at 3:07 PM GMT+0
8b15726
โœจAdded
  • Add missing scores tab components that broke the build
  • rankings-tab.tsx and competitions-tab.tsx were imported by
  • scores-tab-nav.tsx but never committed, causing build failure.

Files Changed

Created (2):
  • + src/components/scores/competitions-tab.tsx
  • + src/components/scores/rankings-tab.tsx
Modified (2):
  • ~ src/components/scores/competitions-tab.tsx
  • ~ src/components/scores/rankings-tab.tsx

Version 0.2.169

Add PCL team detail pages with season stats and news coverage

March 31, 2026 at 3:04 PM GMT+0
0e7ecc7
โœจAdded
  • Add PCL team detail pages with season stats and news coverage
  • Create /pcl/teams/[slug] pages with season stats (W-L, points, rank),
  • match-by-match results, notable performances, roster, and news
  • Add Founding Season PCL Substack RSS feed for PCL news coverage
  • Add News & Coverage section to PCL hub page
  • Update all PCL team links to use /pcl/teams/ routes

Files Changed

Created (1):
  • + src/app/pcl/teams/[slug]/page.tsx
Modified (6):
  • ~ scripts/setup/seed-rss-feeds.ts
  • ~ src/app/pcl/matches/[slug]/page.tsx
  • ~ src/app/pcl/page.tsx
  • ~ src/app/pcl/teams/[slug]/page.tsx
  • ~ src/components/hub/news-card.tsx
  • ~ src/components/pcl/pcl-standings.tsx

Version 0.2.168

Lazy-load scores tabs, auto-poll on empty feed, add Vercel ignoreCommand

March 30, 2026 at 11:58 PM GMT+0
bdee7b1
๐Ÿ”„Changed
  • Lazy-load scores tabs, auto-poll on empty feed, add Vercel ignoreCommand
  • Live scores feed: poll immediately on mount when no initial items provided
  • Scores tab nav: lazy-load Rankings and Competitions tabs (was static links)
  • vercel.json: add ignoreCommand to skip builds when only non-source files change

Files Changed

Modified (2):
  • ~ src/components/live/live-scores-feed.tsx
  • ~ src/components/scores/scores-tab-nav.tsx

Version 0.2.167

Add setup scripts for hub content management

March 30, 2026 at 9:35 PM GMT+0
5b6843b
โœจAdded
  • Add setup scripts for hub content management
  • Scripts for: fixing feed URLs, podcast feeds (iTunes API lookup),
  • IG profile pic matching, RSS thumbnail auditing, content state checks.

Files Changed

Created (7):
  • + scripts/setup/check-content-state.ts
  • + scripts/setup/check-ig-data.ts
  • + scripts/setup/check-rss-thumbs.ts
  • + scripts/setup/fetch-ig-profile-pics.ts
  • + scripts/setup/fix-feed-urls.ts
  • + scripts/setup/fix-podcast-feeds.ts
  • + scripts/setup/match-social-photos.ts
Modified (7):
  • ~ scripts/setup/check-content-state.ts
  • ~ scripts/setup/check-ig-data.ts
  • ~ scripts/setup/check-rss-thumbs.ts
  • ~ scripts/setup/fetch-ig-profile-pics.ts
  • ~ scripts/setup/fix-feed-urls.ts
  • ~ scripts/setup/fix-podcast-feeds.ts
  • ~ scripts/setup/match-social-photos.ts

Version 0.2.166

Add content blocks CMS, YouTube support, podcast fetch

March 30, 2026 at 7:21 PM GMT+0
62d47c8
โœจAdded
  • Add content blocks CMS, YouTube support, podcast fetch
  • Content block system:
  • HubContentBlock CRUD API (/api/admin/hub/blocks)
  • Admin UI: create/edit/delete/reorder blocks with type selector
  • (Custom HTML, YouTube Channel, CTA, Featured Content)
  • Display options: wide, half, square, carousel

Files Changed

Created (4):
  • + scripts/setup/trigger-hub-fetch.ts
  • + src/app/api/admin/hub/blocks/route.ts
  • + src/components/admin/hub/content-block-manager.tsx
  • + src/components/hub/content-block.tsx
Modified (9):
  • ~ scripts/setup/trigger-hub-fetch.ts
  • ~ src/app/admin/hub/page.tsx
  • ~ src/app/api/admin/hub/blocks/route.ts
  • ~ src/app/page.tsx
  • ~ src/components/admin/hub/content-block-manager.tsx
  • ~ src/components/admin/hub/rss-feed-manager.tsx
  • ~ src/components/hub/content-block.tsx
  • ~ src/lib/hub-data.ts
  • ~ src/lib/rss.ts

Version 0.2.165

Hub v2: visual overhaul, admin feed management, IG scraper, content blocks

March 30, 2026 at 2:58 PM GMT+0
ebcb4da
๐Ÿ”„Changed
  • Hub v2: visual overhaul, admin feed management, IG scraper, content blocks
  • Visual improvements:
  • Fix blurry Cheer Theory thumbnails (strip WP -150x150 size suffix)
  • Top Scores by Division: podium-style scorecards with gym photos,
  • placement badges, video links (L6+ only, top 3 per division)
  • Social section: compact two-column link list (no fake image cards)

Files Changed

Created (10):
  • + python-scraper/scraper/ig_post_scraper.py
  • + scripts/setup/add-hub-sections.ts
  • + scripts/setup/audit-hub-visuals.ts
  • + scripts/setup/fix-blurry-thumbnails.ts
  • + scripts/setup/seed-rss-feeds.ts
  • + src/app/api/admin/hub/feeds/route.ts
  • + src/components/admin/hub/podcast-manager.tsx
  • + src/components/admin/hub/rss-feed-manager.tsx
  • + src/components/hub/featured-gyms.tsx
  • + src/components/hub/ig-gallery.tsx
Modified (18):
  • ~ prisma/schema.prisma
  • ~ python-scraper/scraper/ig_post_scraper.py
  • ~ scripts/setup/add-hub-sections.ts
  • ~ scripts/setup/audit-hub-visuals.ts
  • ~ scripts/setup/fix-blurry-thumbnails.ts
  • ~ scripts/setup/seed-rss-feeds.ts
  • ~ src/app/admin/hub/page.tsx
  • ~ src/app/api/admin/hub/feeds/route.ts
  • ~ src/app/api/cron/fetch-hub-content/route.ts
  • ~ src/app/page.tsx
  • ~ src/components/admin/hub/podcast-manager.tsx
  • ~ src/components/admin/hub/rss-feed-manager.tsx
  • ~ src/components/hub/featured-gyms.tsx
  • ~ src/components/hub/ig-gallery.tsx
  • ~ src/components/hub/leaderboard-snapshot.tsx
  • ~ src/components/hub/social-section.tsx
  • ~ src/lib/hub-data.ts
  • ~ src/lib/rss.ts

Version 0.2.164

Add IG profile pics via unavatar.io + improve leaderboard display

March 30, 2026 at 4:54 AM GMT+0
bad2183
โœจAdded
  • Add IG profile pics via unavatar.io + improve leaderboard display
  • Social cards now pull Instagram profile pictures from unavatar.io
  • as a fallback when no imageUrl is set in the database
  • Bigger circular avatar overlays on gradient headers
  • Leaderboard query improved: picks divisions with most performances
  • (min 5) instead of random L6/L7 divisions

Files Changed

Modified (3):
  • ~ src/components/hub/leaderboard-snapshot.tsx
  • ~ src/components/hub/social-card.tsx
  • ~ src/lib/hub-data.ts

Version 0.2.163

Fix CSP for RSS images + hydration mismatch on date

March 30, 2026 at 4:45 AM GMT+0
6c08696
๐Ÿ›Fixed
  • Fix CSP for RSS images + hydration mismatch on date
  • Open img-src to allow all https/http images (RSS thumbnails come
  • from arbitrary domains)
  • Pin HubHero date to America/Chicago timezone to prevent server/client
  • hydration mismatch

Files Changed

Modified (1):
  • ~ src/components/hub/hub-hero.tsx

Version 0.2.162

Fix hub 500: remove onClick handler from server component

March 30, 2026 at 4:31 AM GMT+0
7580e14
๐Ÿ›Fixed
  • Fix hub 500: remove onClick handler from server component
  • ScoreTicker is rendered as a server component but had an onClick
  • event handler on an <a> tag. Event handlers can't be passed to
  • client component props from server components.

Files Changed

Modified (1):
  • ~ src/components/hub/score-ticker.tsx

Version 0.2.161

Fix hub 500: wrap ALL data fetches including getHubConfig in catch

March 30, 2026 at 4:21 AM GMT+0
f645e4e
๐Ÿ›Fixed
  • Fix hub 500: wrap ALL data fetches including getHubConfig in catch
  • The error was happening before the safe() wrappers โ€” getHubConfig()
  • and getSession() could throw and crash the entire page. Now every
  • single data fetch has a catch handler with fallback defaults.
  • Also added default section order when HubConfig is empty.

Files Changed

Modified (1):
  • ~ src/app/page.tsx

Version 0.2.160

Fix hub 500: wrap all data fetches in safe catch handlers

March 30, 2026 at 4:13 AM GMT+0
42af3ed
๐Ÿ›Fixed
  • Fix hub 500: wrap all data fetches in safe catch handlers
  • Each hub section data fetch is now wrapped in try/catch so one failing
  • query doesn't crash the entire page. Failed sections silently render
  • empty instead of taking down the home page.

Files Changed

Modified (1):
  • ~ src/app/page.tsx

Version 0.2.159

Fix home page 500: remove invalid discFilter from competition query

March 30, 2026 at 4:00 AM GMT+0
2b2a5d0
๐Ÿ›Fixed
  • Fix home page 500: remove invalid discFilter from competition query
  • Competition model doesn't have a Division relation, so spreading
  • activeDisciplineFilter() into the where clause caused a runtime error.
  • Removed the filter since competitions don't need discipline filtering
  • at the timeline level.

Files Changed

Modified (1):
  • ~ src/lib/hub-data.ts

Version 0.2.158

Visual overhaul: sharper corners, richer hub with images and scores

March 30, 2026 at 3:54 AM GMT+0
8b4cf65
๐Ÿ”„Changed
  • Visual overhaul: sharper corners, richer hub with images and scores
  • Reduce global border-radius from 0.75rem to 0.375rem (sharper, less soft)
  • Competition cards: show photo headers with gradient overlays, gym logos in scores
  • News section: featured hero card with big image for top article
  • Score ticker: ESPN-style horizontal scoreboard with gym logos, scores, video links
  • Leaderboard: gym logos, placement badges with color hierarchy

Files Changed

Created (1):
  • + src/components/hub/score-ticker.tsx
Modified (11):
  • ~ src/app/globals.css
  • ~ src/app/page.tsx
  • ~ src/components/hub/competition-card.tsx
  • ~ src/components/hub/leaderboard-snapshot.tsx
  • ~ src/components/hub/news-card.tsx
  • ~ src/components/hub/news-section.tsx
  • ~ src/components/hub/personalized-section.tsx
  • ~ src/components/hub/podcast-card.tsx
  • ~ src/components/hub/score-ticker.tsx
  • ~ src/components/hub/social-card.tsx
  • ~ src/lib/hub-data.ts

Version 0.2.157

Transform home page into content hub + simplify navigation

March 30, 2026 at 3:12 AM GMT+0
41ef07f
๐Ÿ”„Changed
  • Transform home page into content hub + simplify navigation
  • Replace SaaS landing page with "The Home of Competitive Cheer" content hub:
  • Competition timeline (last/this/next week with L6/L7 top scores)
  • Curated news from 8 cheer RSS feeds
  • Podcast episodes, social personality cards, leaderboard snapshot
  • Personalized "Your Teams" section for logged-in users

Files Changed

Created (20):
  • + scripts/setup/seed-hub-content.ts
  • + src/app/admin/hub/page.tsx
  • + src/app/api/admin/hub/featured/route.ts
  • + src/app/api/admin/hub/route.ts
  • + src/app/api/cron/fetch-hub-content/route.ts
  • + src/app/api/hub/competitions/route.ts
  • + src/app/discover/loading.tsx
  • + src/app/discover/page.tsx
  • + src/app/my/loading.tsx
  • + src/app/my/page.tsx
  • + src/app/scores/loading.tsx
  • + src/app/scores/page.tsx
  • + src/components/admin/hub/featured-competitions.tsx
  • + src/components/admin/hub/feed-source-toggles.tsx
  • + src/components/admin/hub/section-manager.tsx
  • + src/components/home-legacy/gyms-map-section.tsx
  • + src/components/home-legacy/hero-section.tsx
  • + src/components/home-legacy/live-scores-section.tsx
  • + src/components/home-legacy/pillar-section.tsx
  • + src/components/home-legacy/pillar-visuals.tsx
Modified (20):
  • ~ prisma/schema.prisma
  • ~ scripts/setup/seed-hub-content.ts
  • ~ src/app/admin/hub/page.tsx
  • ~ src/app/admin/page.tsx
  • ~ src/app/api/admin/hub/featured/route.ts
  • ~ src/app/api/admin/hub/route.ts
  • ~ src/app/api/cron/fetch-hub-content/route.ts
  • ~ src/app/api/hub/competitions/route.ts
  • ~ src/app/discover/loading.tsx
  • ~ src/app/discover/page.tsx
  • ~ src/app/home/page.tsx
  • ~ src/app/my/loading.tsx
  • ~ src/app/my/page.tsx
  • ~ src/app/page.tsx
  • ~ src/app/scores/loading.tsx
  • ~ src/app/scores/page.tsx
  • ~ src/components/admin/hub/featured-competitions.tsx
  • ~ src/components/admin/hub/feed-source-toggles.tsx
  • ~ src/components/admin/hub/section-manager.tsx
  • ~ src/components/app-shell.tsx

Version 0.2.156

Increase scraper timeouts and limit concurrent scrapes

March 29, 2026 at 10:12 PM GMT+0
5371aab
๐Ÿ”„Changed
  • Increase scraper timeouts and limit concurrent scrapes
  • JustDance Grand Nationals has 267+ divisions across 8 sub-events โ€”
  • each takes 15-30 min to scrape. The 15-min stale threshold was reclaiming
  • jobs before the scraper finished, creating an infinite retry loop.
  • Increase stale threshold from 15 to 45 minutes
  • Increase recent job window from 30 to 45 minutes

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.155

Fix live monitor timeout: switch to fire-and-forget scrape with async harvest

March 29, 2026 at 9:45 PM GMT+0
b58a14c
๐Ÿ›Fixed
  • Fix live monitor timeout: switch to fire-and-forget scrape with async harvest
  • The live monitor was waiting inline for scrape completion (3-min timeout).
  • Large events like JustDance Grand Nationals (267 divisions) take 10+ minutes
  • to scrape, causing every job to fail with "Scrape timeout" and no scores
  • imported โ€” which means no score notifications fire.
  • New two-phase approach:

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.154

Fix score notifications not firing: add notifiedAt tracking to prevent silent skips

March 29, 2026 at 7:47 PM GMT+0
62fdb9c
๐Ÿ›Fixed
  • Fix score notifications not firing: add notifiedAt tracking to prevent silent skips
  • Root cause: score change detection only fired when totalScore changed numerically.
  • If a score was already imported (by worker, manual import, or prior cycle), re-scraping
  • the same data produced no change โ€” silently skipping all notifications.
  • Fix: Add notifiedAt field to Score model. Notifications now fire when:
  • totalScore actually changed (existing behavior), OR

Files Changed

Created (1):
  • + scripts/maintenance/backfill-notified-at.ts
Modified (5):
  • ~ prisma/schema.prisma
  • ~ scripts/maintenance/backfill-notified-at.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/notifications/reminder-engine.ts
  • ~ src/lib/notifications/score-notifications.ts

Version 0.2.153

Fix mobile bottom nav floating mid-screen in WebView browsers

March 28, 2026 at 5:35 PM GMT+0
ff76906
๐Ÿ›Fixed
  • Fix mobile bottom nav floating mid-screen in WebView browsers
  • Move MobileBottomNav out of AppShell (which is inside Framer Motion's
  • PageTransitionProvider context) and render it directly in root layout as
  • a sibling of Toaster/PushPrompt. This ensures no ancestor transform from
  • page transitions can break position:fixed, especially in in-app browsers
  • like Telegram's WebView.

Files Changed

Modified (2):
  • ~ src/app/layout.tsx
  • ~ src/components/app-shell.tsx

Version 0.2.152

Remove temporary VAPID debug endpoint

March 28, 2026 at 5:15 PM GMT+0
b1b31d3
๐Ÿ›Fixed
  • Remove temporary VAPID debug endpoint

Files Changed

Modified (1):
  • ~ src/app/api/debug/vapid/route.ts

Version 0.2.151

Debug: add push send test to VAPID endpoint

March 28, 2026 at 5:11 PM GMT+0
3661710
๐Ÿ›Fixed
  • Debug: add push send test to VAPID endpoint

Files Changed

Modified (1):
  • ~ src/app/api/debug/vapid/route.ts

Version 0.2.150

Add temporary VAPID debug endpoint

March 28, 2026 at 5:07 PM GMT+0
1f7069d
๐Ÿ›Fixed
  • Add temporary VAPID debug endpoint

Files Changed

Created (1):
  • + src/app/api/debug/vapid/route.ts
Modified (1):
  • ~ src/app/api/debug/vapid/route.ts

Version 0.2.149

Add try/catch around push sends in score notifications

March 28, 2026 at 4:22 PM GMT+0
545307b
โœจAdded
  • Add try/catch around push sends in score notifications
  • Same fix as reminder engine โ€” push errors were unhandled and could
  • crash the entire score notification flow, preventing email/SMS/telegram
  • from being sent for that score.

Files Changed

Modified (1):
  • ~ src/lib/notifications/score-notifications.ts

Version 0.2.148

Fix reminder engine: prevent duplicates and catch push errors

March 28, 2026 at 4:19 PM GMT+0
602046e
๐Ÿ›Fixed
  • Fix reminder engine: prevent duplicates and catch push errors
  • Two bugs:
  • 1. Push send had no try/catch โ€” if VAPID was misconfigured on prod,
  • the crash prevented SentReminder dedup rows from being written,
  • causing duplicate in-app notifications every cron cycle.
  • 2. Dedup was at the end after all sends. Moved it BEFORE sends so

Files Changed

Modified (1):
  • ~ src/lib/notifications/reminder-engine.ts

Version 0.2.147

Auto-resync push subscription with server on page load

March 28, 2026 at 2:42 PM GMT+0
22b38e1
๐Ÿ”„Changed
  • Auto-resync push subscription with server on page load
  • If the browser has a push subscription but the server lost the record
  • (e.g., deleted during cleanup), the hook now re-sends the subscription
  • data to /api/push/subscribe on every page load. This is an upsert so
  • it's safe to call repeatedly. Fixes the case where the UI shows push
  • as enabled but the server can't send because it has no subscription.

Files Changed

Modified (1):
  • ~ src/hooks/use-push-subscription.ts

Version 0.2.146

Auto-enable reminders when saving a schedule

March 28, 2026 at 1:43 PM GMT+0
38437d4
๐Ÿ”„Changed
  • Auto-enable reminders when saving a schedule
  • Previously, reminders were opt-in after save โ€” users had to click
  • "Enable Reminders" on the success screen. Most users skipped this,
  • resulting in 22/25 saved schedules having 0 bells and no notifications.
  • Now bells are automatically created when a schedule is saved (for
  • eligible tiers). The success screen confirms reminders are on instead

Files Changed

Modified (1):
  • ~ src/components/schedules/save-schedule-dialog.tsx

Version 0.2.145

Fix push notification subscription pruning: only delete on 404/410

March 27, 2026 at 6:26 PM GMT+0
275ca9e
๐Ÿ›Fixed
  • Fix push notification subscription pruning: only delete on 404/410
  • Previously, sendPushToUser deleted subscriptions on ANY send failure
  • (including VAPID misconfiguration, network errors, 401/403). This meant
  • a temporary server-side issue would permanently nuke all push subscriptions,
  • requiring users to manually re-subscribe.
  • Now sendPushNotification returns "ok" | "expired" | "error", and only

Files Changed

Modified (1):
  • ~ src/lib/push.ts

Version 0.2.144

Improve schedule filter performance: debounce search input

March 27, 2026 at 3:55 PM GMT+0
1961282
๐Ÿ”„Changed
  • Improve schedule filter performance: debounce search input
  • Add 400ms debounce to search filter input (was triggering API call per
  • keystroke โ€” typing "Texas" fired 5 separate requests)
  • Remove availableOptions from fetchFilterOptions dependency array to
  • break circular re-fetch loop
  • Search now uses pendingSearch pattern matching state/city debounce

Files Changed

Modified (1):
  • ~ src/components/schedules/schedule-viewer.tsx

Version 0.2.143

Add schedule PDFs to public/uploads for download links

March 27, 2026 at 3:43 PM GMT+0
45c1521
โœจAdded
  • Add schedule PDFs to public/uploads for download links
  • Force-add the 4 schedule PDFs so they're served from Vercel.
  • Also optimize announcement image for Instagram mobile readability:
  • bigger title, simplified cards (name + date only), larger text throughout.

Version 0.2.142

Fix announcement image font: use satori + resvg for proper Bebas Neue rendering

March 27, 2026 at 3:26 PM GMT+0
b437d6a
๐Ÿ›Fixed
  • Fix announcement image font: use satori + resvg for proper Bebas Neue rendering
  • node-canvas registerFont doesn't work on Windows. Switch to satori (same
  • engine as @vercel/og) which handles font embedding natively. Download
  • static Inter weights since satori can't parse variable font fvar tables.

Files Changed

Modified (1):
  • ~ scripts/generate-schedule-announcement.ts

Version 0.2.141

Add schedule PDF links to competition pages and generic schedule importer

March 27, 2026 at 3:20 PM GMT+0
6d6caff
โœจAdded
  • Add schedule PDF links to competition pages and generic schedule importer
  • Add Source and Schedule PDF links to competition header metadata line
  • Add PDF Schedule download link to schedule page header
  • Add generic schedule PDF import script handling multiple formats
  • (AC, ACDA, One Up, Spirit Sports) with fuzzy matching
  • Add Instagram announcement image generator matching scorecard style

Files Changed

Created (2):
  • + scripts/generate-schedule-announcement.ts
  • + scripts/import/import-schedule-generic.ts
Modified (5):
  • ~ scripts/generate-schedule-announcement.ts
  • ~ scripts/import/import-schedule-generic.ts
  • ~ src/app/competitions/[id]/page.tsx
  • ~ src/app/competitions/[id]/schedule/page.tsx
  • ~ src/components/competitions/competition-header.tsx

Version 0.2.140

Move analytics section above social copy templates on partner dashboard

March 27, 2026 at 2:51 PM GMT+0
cc805de
๐Ÿ”„Changed
  • Move analytics section above social copy templates on partner dashboard

Files Changed

Modified (1):
  • ~ src/components/partner/partner-dashboard.tsx

Version 0.2.139

Widen partner dashboard to max-w-5xl and add social copy templates

March 27, 2026 at 2:38 PM GMT+0
e8964de
๐Ÿ”„Changed
  • Widen partner dashboard to max-w-5xl and add social copy templates

Files Changed

Modified (1):
  • ~ src/app/admin/partners/[id]/dashboard/page.tsx

Version 0.2.138

Fix delete button being clipped by overflow-hidden on profile content cards

March 27, 2026 at 12:07 AM GMT+0
d9ea0b6
๐Ÿ›Fixed
  • Fix delete button being clipped by overflow-hidden on profile content cards

Files Changed

Modified (1):
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.137

Add value prop, 30-second pitch, and social copy templates to partner dashboard

March 26, 2026 at 11:15 PM GMT+0
7682f93
โœจAdded
  • Add value prop, 30-second pitch, and social copy templates to partner dashboard
  • Highlights what the audience gets (first month free / up to 20% off annual)
  • Adds a ready-to-use 30-second pitch partners can use in conversations
  • Includes 4 copy-paste social templates: social post, YouTube description,
  • newsletter CTA, and short link-in-bio CTA
  • Enhanced referral link card with clearer discount explanation

Files Changed

Modified (1):
  • ~ src/components/partner/partner-dashboard.tsx

Version 0.2.136

Fix mobile video decode errors by limiting resolution and deferring preload

March 26, 2026 at 11:06 PM GMT+0
dbd5802
๐Ÿ›Fixed
  • Fix mobile video decode errors by limiting resolution and deferring preload
  • Adds maxResolution=720p and preload=none to prevent multiple videos from
  • overwhelming mobile device decoders simultaneously.

Files Changed

Modified (1):
  • ~ src/components/profile/profile-video-player.tsx

Version 0.2.135

Add partner exclusive offers: free trial on monthly, discount on annual

March 26, 2026 at 10:48 PM GMT+0
c6eec9a
โœจAdded
  • Add partner exclusive offers: free trial on monthly, discount on annual
  • Monthly plans: auto-apply trial_period_days (default 30) via Stripe
  • Annual plans: auto-apply percentage discount coupon (default 10% โ‰ˆ 1 extra month free)
  • Subscribe page shows offer banner: "FullOut exclusive offer โ€” first 30 days free!"
  • New Partner fields: trialDays, annualDiscountPct (configurable per partner)
  • Edit partner dialog includes offer settings

Files Changed

Modified (9):
  • ~ prisma/schema.prisma
  • ~ src/app/admin/partners/[id]/page.tsx
  • ~ src/app/api/admin/partners/[id]/route.ts
  • ~ src/app/api/partner/dashboard/analytics/route.ts
  • ~ src/app/api/partner/validate/route.ts
  • ~ src/app/api/stripe/create-checkout/route.ts
  • ~ src/app/subscribe/subscribe-page-client.tsx
  • ~ src/components/admin/partners/edit-partner-dialog.tsx
  • ~ src/components/partner/partner-analytics.tsx

Version 0.2.134

Show partner referral banner on subscribe page when arriving via partner link

March 26, 2026 at 10:29 PM GMT+0
507915b
๐Ÿ”„Changed
  • Show partner referral banner on subscribe page when arriving via partner link
  • Displays "Referred by [Partner Name]" banner so visitors know the partner link worked.

Files Changed

Modified (1):
  • ~ src/app/subscribe/subscribe-page-client.tsx

Version 0.2.133

Add admin partner dashboard preview and edit settings dialog

March 26, 2026 at 10:27 PM GMT+0
d2618a2
โœจAdded
  • Add admin partner dashboard preview and edit settings dialog
  • Admin can view partner's dashboard at /admin/partners/[id]/dashboard
  • Edit Settings dialog on partner detail page (commission, status, payout, etc.)
  • Partner APIs support admin access via partnerId query param

Files Changed

Created (2):
  • + src/app/admin/partners/[id]/dashboard/page.tsx
  • + src/components/admin/partners/edit-partner-dialog.tsx
Modified (9):
  • ~ src/app/admin/partners/[id]/dashboard/page.tsx
  • ~ src/app/admin/partners/[id]/page.tsx
  • ~ src/app/api/partner/dashboard/analytics/route.ts
  • ~ src/app/api/partner/dashboard/campaigns/route.ts
  • ~ src/app/api/partner/dashboard/stats/route.ts
  • ~ src/components/admin/partners/edit-partner-dialog.tsx
  • ~ src/components/partner/partner-analytics.tsx
  • ~ src/components/partner/partner-campaigns.tsx
  • ~ src/components/partner/partner-dashboard.tsx

Version 0.2.132

Organize admin dashboard into labeled sections alphabetized by title

March 26, 2026 at 10:22 PM GMT+0
81a30b9
๐Ÿ”„Changed
  • Organize admin dashboard into labeled sections alphabetized by title
  • Sections: Business, Content, Competition Data, People & Organizations, System

Files Changed

Modified (1):
  • ~ src/app/admin/page.tsx

Version 0.2.131

Add partner referral system with analytics, campaigns, payouts, and OG tags

March 26, 2026 at 10:14 PM GMT+0
26a548b
โœจAdded
  • Add partner referral system with analytics, campaigns, payouts, and OG tags
  • Full partner/affiliate system for media partners with monetary compensation:
  • Partner dashboard with analytics charts (clicks, revenue, sources, date ranges)
  • Partner-facing campaign management with custom OG image uploads
  • Dynamic OG meta tags on subscribe page for partner/campaign links
  • Banner templates and HTML embed code for partner marketing

Files Changed

Created (20):
  • + src/app/admin/partners/[id]/page.tsx
  • + src/app/admin/partners/page.tsx
  • + src/app/api/admin/partners/[id]/campaigns/route.ts
  • + src/app/api/admin/partners/[id]/payouts/route.ts
  • + src/app/api/admin/partners/[id]/route.ts
  • + src/app/api/admin/partners/route.ts
  • + src/app/api/admin/partners/stats/route.ts
  • + src/app/api/partner/dashboard/analytics/route.ts
  • + src/app/api/partner/dashboard/campaigns/[id]/route.ts
  • + src/app/api/partner/dashboard/campaigns/route.ts
  • + src/app/api/partner/dashboard/campaigns/upload-og/route.ts
  • + src/app/api/partner/dashboard/payout-method/route.ts
  • + src/app/api/partner/dashboard/stats/route.ts
  • + src/app/api/partner/dashboard/stripe-connect/route.ts
  • + src/app/api/partner/track/route.ts
  • + src/app/api/partner/validate/route.ts
  • + src/components/admin/partner-actions.tsx
  • + src/components/admin/partner-form.tsx
  • + src/components/admin/partners/create-payout-dialog.tsx
  • + src/components/partner/partner-analytics.tsx
Modified (20):
  • ~ src/app/admin/page.tsx
  • ~ src/app/admin/partners/[id]/page.tsx
  • ~ src/app/admin/partners/page.tsx
  • ~ src/app/api/admin/partners/[id]/campaigns/route.ts
  • ~ src/app/api/admin/partners/[id]/payouts/route.ts
  • ~ src/app/api/admin/partners/[id]/route.ts
  • ~ src/app/api/admin/partners/route.ts
  • ~ src/app/api/admin/partners/stats/route.ts
  • ~ src/app/api/partner/dashboard/analytics/route.ts
  • ~ src/app/api/partner/dashboard/campaigns/[id]/route.ts
  • ~ src/app/api/partner/dashboard/campaigns/route.ts
  • ~ src/app/api/partner/dashboard/campaigns/upload-og/route.ts
  • ~ src/app/api/partner/dashboard/payout-method/route.ts
  • ~ src/app/api/partner/dashboard/stats/route.ts
  • ~ src/app/api/partner/dashboard/stripe-connect/route.ts
  • ~ src/app/api/partner/track/route.ts
  • ~ src/app/api/partner/validate/route.ts
  • ~ src/app/api/stripe/webhook/route.ts
  • ~ src/app/settings/page.tsx
  • ~ src/app/subscribe/page.tsx

Version 0.2.130

Add partner referral system, video description editing, and settings updates

March 26, 2026 at 9:33 PM GMT+0
6076a1f
โœจAdded
  • Add partner referral system, video description editing, and settings updates
  • Includes partner tracking endpoints, Stripe webhook handling for partner
  • commissions, video description support, and partner settings nav item.

Files Changed

Modified (10):
  • ~ prisma/schema.prisma
  • ~ src/app/api/person/videos/route.ts
  • ~ src/app/api/stripe/create-checkout/route.ts
  • ~ src/app/api/stripe/webhook/route.ts
  • ~ src/app/settings/page.tsx
  • ~ src/app/subscribe/subscribe-page-client.tsx
  • ~ src/components/profile/profile-video-manager.tsx
  • ~ src/components/settings/settings-layout.tsx
  • ~ src/components/settings/settings-nav.tsx
  • ~ src/middleware.ts

Version 0.2.129

Remove skills, badges, timeline, and experience from home feed to reduce spam

March 26, 2026 at 6:44 PM GMT+0
c36a433
๐Ÿ—‘๏ธRemoved
  • Remove skills, badges, timeline, and experience from home feed to reduce spam
  • Also adds debug logging to Resend email sending for password reset troubleshooting.

Files Changed

Modified (3):
  • ~ src/app/api/feed/route.ts
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.128

Add debug logging to Resend email sending for password reset troubleshooting

March 26, 2026 at 5:49 PM GMT+0
6535bfb
๐Ÿ›Fixed
  • Add debug logging to Resend email sending for password reset troubleshooting

Files Changed

Modified (2):
  • ~ src/app/api/auth/forgot-password/route.ts
  • ~ src/lib/resend.ts

Version 0.2.127

Fix broken profile pics on admin users page by using Avatar component

March 26, 2026 at 5:33 PM GMT+0
bcd166f
๐Ÿ›Fixed
  • Fix broken profile pics on admin users page by using Avatar component
  • Replaced raw <img> tag with shadcn Avatar component which gracefully
  • falls back to showing the user's initial when the image URL fails to load.

Files Changed

Modified (1):
  • ~ src/app/admin/users/page.tsx

Version 0.2.126

Fix mobile timeline: add proper vertical timeline with chronological skills

March 26, 2026 at 3:47 PM GMT+0
740d109
๐Ÿ›Fixed
  • Fix mobile timeline: add proper vertical timeline with chronological skills
  • Mobile view was just stacked cards with skills dumped as undated pills at
  • the bottom. Now renders a true vertical timeline with year markers,
  • experience cards connected by dots, and skills/badges placed inline at
  • their correct chronological position with dates shown.

Files Changed

Modified (1):
  • ~ src/components/people/person-timeline-viz.tsx

Version 0.2.125

Fix team selection UX in Add Experience dialog

March 26, 2026 at 3:27 PM GMT+0
c766748
๐Ÿ›Fixed
  • Fix team selection UX in Add Experience dialog
  • Hide dropdown after selecting a team (like gym selector does)
  • Show selected team name in search field with clear button
  • Skip unnecessary re-fetches when team is already selected

Files Changed

Modified (1):
  • ~ src/components/people/person-experience.tsx

Version 0.2.124

Fix gym and team search in Add Experience dialog

March 26, 2026 at 3:16 PM GMT+0
b9a08eb
๐Ÿ›Fixed
  • Fix gym and team search in Add Experience dialog
  • API returns results under `data.data` but component was reading
  • `data.gyms` and `data.teams`, causing searches to always return empty.

Files Changed

Modified (1):
  • ~ src/components/people/person-experience.tsx

Version 0.2.123

Add username column, profile pic, profile links, and username search to User Management

March 26, 2026 at 3:04 PM GMT+0
1ec2976
โœจAdded
  • Add username column, profile pic, profile links, and username search to User Management

Files Changed

Modified (1):
  • ~ src/app/admin/users/page.tsx

Version 0.2.122

Fix build: remove reference to non-existent partnerConversion model

March 26, 2026 at 2:48 PM GMT+0
730ead9
๐Ÿ›Fixed
  • Fix build: remove reference to non-existent partnerConversion model
  • The PartnerConversion model hasn't been added to the schema yet,
  • so this deleteMany call was causing a type error during build.

Files Changed

Modified (1):
  • ~ src/app/api/admin/users/[id]/route.ts

Version 0.2.121

Remove highlights from explore page search results

March 26, 2026 at 2:44 PM GMT+0
4132157
๐Ÿ—‘๏ธRemoved
  • Remove highlights from explore page search results

Files Changed

Modified (1):
  • ~ src/app/explore/page.tsx

Version 0.2.120

Add admin ability to delete user accounts from User Management

March 26, 2026 at 2:35 PM GMT+0
8b73902
โœจAdded
  • Add admin ability to delete user accounts from User Management
  • Adds DELETE endpoint with safety guards (can't delete self or other admins),
  • cascading cleanup for blocking relations, and a confirmation dialog in the UI.

Files Changed

Modified (3):
  • ~ src/app/admin/users/page.tsx
  • ~ src/app/api/admin/users/[id]/route.ts
  • ~ src/components/admin/user-edit-form.tsx

Version 0.2.119

Fix ESLint build error: remove reference to unconfigured rule

March 23, 2026 at 8:06 PM GMT+0
7858067
๐Ÿ›Fixed
  • Fix ESLint build error: remove reference to unconfigured rule
  • Remove eslint-disable comment for @typescript-eslint/no-explicit-any
  • (not configured in project) and replace `any` with proper types.

Files Changed

Modified (1):
  • ~ src/components/density/density-wins-scatter.tsx

Version 0.2.118

Add density map page with geocoded gym locations

March 23, 2026 at 7:03 PM GMT+0
2b371bb
โœจAdded
  • Add density map page with geocoded gym locations
  • New /analyze/density page with per-sq-mi heatmap visualization
  • Interactive MapLibre heatmap with athletes/gyms/teams layers
  • Clickable gym dots with dark-themed popups showing gym details
  • Metro area rankings table grouped by city, expandable to show gyms
  • Density vs competitive success scatter plot

Files Changed

Created (11):
  • + scripts/maintenance/fix-gym-city-from-coords.ts
  • + scripts/maintenance/fix-gym-locations-fast.ts
  • + scripts/maintenance/fix-gym-locations.ts
  • + src/app/[username]/analyze/density/page.tsx
  • + src/app/api/gyms/density/route.ts
  • + src/components/density/density-heatmap-wrapper.tsx
  • + src/components/density/density-heatmap.tsx
  • + src/components/density/density-page-client.tsx
  • + src/components/density/density-wins-scatter.tsx
  • + src/components/density/haversine.ts
  • + src/components/density/metro-rankings.tsx
Modified (14):
  • ~ scripts/maintenance/fix-gym-city-from-coords.ts
  • ~ scripts/maintenance/fix-gym-locations-fast.ts
  • ~ scripts/maintenance/fix-gym-locations.ts
  • ~ src/app/[username]/analyze/density/page.tsx
  • ~ src/app/api/gyms/density/route.ts
  • ~ src/app/globals.css
  • ~ src/components/dashboard/dashboard-client.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/density/density-heatmap-wrapper.tsx
  • ~ src/components/density/density-heatmap.tsx
  • ~ src/components/density/density-page-client.tsx
  • ~ src/components/density/density-wins-scatter.tsx
  • ~ src/components/density/haversine.ts
  • ~ src/components/density/metro-rankings.tsx

Version 0.2.117

Fix hydration mismatch in FollowButton SVG icons

March 23, 2026 at 6:04 PM GMT+0
3da00c5
๐Ÿ›Fixed
  • Fix hydration mismatch in FollowButton SVG icons
  • Lucide SVGs inside buttons caused server/client mismatch because
  • useSession returns different status during SSR vs client hydration.
  • Defer icon rendering until after mount to prevent the error.

Files Changed

Modified (1):
  • ~ src/components/follow-button.tsx

Version 0.2.116

Add post dialog, compose page, density map link, and misc improvements

March 23, 2026 at 2:31 AM GMT+0
6a6fed1
โœจAdded
  • Add post dialog, compose page, density map link, and misc improvements
  • Post dialog: sidebar "Post" button opens modal with PostForm (desktop)
  • Compose page: /compose route for mobile post creation
  • Post-info API: lazy-loads user tier/media permissions for post dialog
  • Density map: link added to analyze page header
  • Feed: remove PostContent card from feed page (moved to dialog)

Files Changed

Created (4):
  • + src/app/api/person/post-info/route.ts
  • + src/app/compose/compose-client.tsx
  • + src/app/compose/page.tsx
  • + src/components/dashboard/post-dialog.tsx
Modified (13):
  • ~ scripts/check-user-tier.ts
  • ~ src/app/[username]/analyze/page.tsx
  • ~ src/app/api/person/post-info/route.ts
  • ~ src/app/compose/compose-client.tsx
  • ~ src/app/compose/page.tsx
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/dashboard/post-content.tsx
  • ~ src/components/dashboard/post-dialog.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/people/person-profile-edit.tsx
  • ~ src/lib/import/gym-matcher.ts

Version 0.2.115

Fix following count: show all follows, not just people

March 23, 2026 at 2:25 AM GMT+0
7a9b7e4
๐Ÿ›Fixed
  • Fix following count: show all follows, not just people
  • Reverts the PERSON-only filter โ€” users expect the following count
  • to include teams, gyms, and competitions they follow too.

Files Changed

Modified (1):
  • ~ src/app/people/[username]/page.tsx

Version 0.2.114

Add cover photo API route and 3:1 banner aspect ratio

March 23, 2026 at 2:16 AM GMT+0
1cdd3a3
โœจAdded
  • Add cover photo API route and 3:1 banner aspect ratio
  • Required by the cover photo component committed in the previous
  • commit. Adds the upload/delete API and the LANDSCAPE_3_1 crop option.

Files Changed

Created (1):
  • + src/app/api/person/cover-photo/route.ts
Modified (2):
  • ~ src/app/api/person/cover-photo/route.ts
  • ~ src/types/aspect-ratios.ts

Version 0.2.113

Include cover photo component with canEdit/personId props

March 23, 2026 at 2:15 AM GMT+0
d9b68c0
๐Ÿ”„Changed
  • Include cover photo component with canEdit/personId props
  • The previous commit updated the page to pass these props but
  • didn't include the component changes, breaking the build.

Files Changed

Modified (1):
  • ~ src/components/profile/profile-cover-photo.tsx

Version 0.2.112

Fix follow system: correct following count and unique constraint

March 23, 2026 at 2:11 AM GMT+0
aacb31c
๐Ÿ›Fixed
  • Fix follow system: correct following count and unique constraint
  • Following count now only counts person-to-person follows (was
  • inflating count with teams, gyms, competitions, choreographers)
  • Fix unique constraint on Follow model: use userId instead of
  • profileId (profileId was always NULL, making constraint useless)
  • Backfilled auto-follows: all 153 existing users now follow @joe

Files Changed

Modified (2):
  • ~ prisma/schema.prisma
  • ~ src/app/people/[username]/page.tsx

Version 0.2.111

Fix live monitor stalling: auto-reclaim stuck scrape jobs

March 22, 2026 at 9:43 PM GMT+0
b41d284
๐Ÿ›Fixed
  • Fix live monitor stalling: auto-reclaim stuck scrape jobs
  • The live monitor was completely blocked because scrape jobs stuck in
  • SCRAPING status prevented new scrapes for all competitions. Root cause:
  • the poll loop (15 min max) exceeded Vercel's 5-min function timeout,
  • so jobs never got marked FAILED, and the 30-min dedup guard blocked
  • all subsequent cycles.

Files Changed

Modified (1):
  • ~ src/lib/live-monitor.ts

Version 0.2.110

Constrain home feed to 600px max width on desktop

March 22, 2026 at 2:51 AM GMT+0
8e3ca4b
๐Ÿ”„Changed
  • Constrain home feed to 600px max width on desktop
  • Match Twitter/X-style narrow feed layout on desktop while keeping
  • full width on mobile. Also fix username casing preservation on
  • profile updates (no longer lowercases on save).

Files Changed

Modified (1):
  • ~ src/app/dashboard/feed/page.tsx

Version 0.2.109

Fix username casing: preserve original case on profile update

March 22, 2026 at 2:39 AM GMT+0
a3a6344
๐Ÿ›Fixed
  • Fix username casing: preserve original case on profile update
  • The person update endpoint was lowercasing usernames via
  • normalizeUsername() on save. Now preserves original casing while
  • still doing case-insensitive uniqueness checks.

Files Changed

Modified (1):
  • ~ src/app/api/person/[id]/route.ts

Version 0.2.108

Fix cover photo: use 3:1 Twitter ratio and stop using profile pic

March 22, 2026 at 2:17 AM GMT+0
cd2aa33
๐Ÿ›Fixed
  • Fix cover photo: use 3:1 Twitter ratio and stop using profile pic
  • Cover photo now crops to 3:1 aspect ratio (matching Twitter/X) instead
  • of 4:5 portrait. Uses highlighted or first uploaded photo from gallery
  • instead of the profile picture.

Files Changed

Modified (2):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/profile/profile-cover-photo.tsx

Version 0.2.107

Add auto follow-back from @FullOut to new users on registration

March 22, 2026 at 2:16 AM GMT+0
d8458a0
โœจAdded
  • Add auto follow-back from @FullOut to new users on registration
  • When a new account is created, @FullOut now automatically follows
  • the new user back, creating a mutual follow relationship.

Files Changed

Modified (1):
  • ~ src/app/api/auth/register/route.ts

Version 0.2.106

Fix missing slug fields in division scorecard serialization

March 22, 2026 at 2:02 AM GMT+0
50d5a77
๐Ÿ›Fixed
  • Fix missing slug fields in division scorecard serialization
  • Team and gym objects passed to the scorecard component were missing
  • slug fields, causing getTeamUrl/getGymUrl to fall back to raw IDs
  • instead of readable slugs.

Files Changed

Modified (2):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/components/competitions/division-scorecard.tsx

Version 0.2.105

Add caption display to post permalink page

March 22, 2026 at 1:59 AM GMT+0
d1c6155
โœจAdded
  • Add caption display to post permalink page
  • Photo captions and video descriptions now render on the /post/[id]
  • page using the CaptionDisplay component with @mention support.

Files Changed

Modified (1):
  • ~ src/app/post/[id]/page.tsx

Version 0.2.104

Add color-coded category groups to scorecard headers

March 22, 2026 at 1:34 AM GMT+0
fe9911e
โœจAdded
  • Add color-coded category groups to scorecard headers
  • Division and team scorecard tables now show 3-row headers matching the
  • analyze page: color-coded group labels (Building/Tumbling/Performance),
  • full column names, and abbreviated sort headers. Body cells are tinted
  • to match their category group.

Files Changed

Modified (3):
  • ~ src/components/competitions/division-scorecard.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/lib/breakdown-keys.ts

Version 0.2.103

Add share scorecard feature for Elite+ users

March 22, 2026 at 1:33 AM GMT+0
0b128bb
โœจAdded
  • Add share scorecard feature for Elite+ users
  • Allow Elite and Pro tier users to generate and share division scorecard
  • PNG images to social media. Uses Web Share API on mobile (native share
  • sheet for Instagram, TikTok, etc.) with download fallback on desktop.

Files Changed

Created (2):
  • + src/app/api/competitions/[id]/scorecard/route.ts
  • + src/components/competitions/share-scorecard-button.tsx
Modified (5):
  • ~ src/app/api/competitions/[id]/scorecard/route.ts
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/components/competitions/share-scorecard-button.tsx
  • ~ src/lib/tiers-config.ts
  • ~ src/lib/tiers.ts

Version 0.2.102

Improve video upload error handling for Mux asset limits

March 22, 2026 at 12:21 AM GMT+0
d167ed5
๐Ÿ”„Changed
  • Improve video upload error handling for Mux asset limits
  • Surface actual Mux error messages instead of generic "Internal server
  • error" and detect asset limit errors with a user-friendly message.
  • Remove invalid timeout parameter from Mux upload create call.

Files Changed

Modified (1):
  • ~ src/app/api/person/videos/route.ts

Version 0.2.101

Add update mode option to import pipeline

March 21, 2026 at 7:24 PM GMT+0
8e63de2
โœจAdded
  • Add update mode option to import pipeline
  • Supports create-only (skip existing), fill-empty (only fill null fields),
  • and overwrite (default) modes for importScrapedEvent, enabling selective
  • rescrapes that fill gaps without clobbering existing data.

Files Changed

Modified (1):
  • ~ src/lib/import/index.ts

Version 0.2.100

Add gym history tracking and alias-based matching

March 21, 2026 at 7:24 PM GMT+0
20dbd2c
โœจAdded
  • Add gym history tracking and alias-based matching
  • Adds GymHistory and GymAlias schema models for tracking rebrands/mergers.
  • Gym and team pages display a history badge when history exists. Import
  • pipeline preloads aliases so old brand names resolve to the correct gym.

Files Changed

Created (1):
  • + src/components/gyms/gym-history-badge.tsx
Modified (5):
  • ~ prisma/schema.prisma
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/gyms/gym-history-badge.tsx
  • ~ src/lib/import/gym-matcher.ts

Version 0.2.99

Add score notifications for saved schedule teams

March 21, 2026 at 6:41 PM GMT+0
a6fa0c4
โœจAdded
  • Add score notifications for saved schedule teams
  • Users with schedule entry bells now receive score notifications when their
  • saved teams post scores, scoped to the specific competition.

Files Changed

Modified (1):
  • ~ src/lib/notifications/score-notifications.ts

Version 0.2.98

Fix home feed post: show photo preview in caption step and use upchunk for video

March 21, 2026 at 4:32 PM GMT+0
79e3d10
๐Ÿ›Fixed
  • Fix home feed post: show photo preview in caption step and use upchunk for video
  • The Post Content widget on the home feed was missing the photo preview
  • during the caption step โ€” now shows the cropped image before upload.
  • Also replaced raw XHR video upload with the same upchunk chunked uploader
  • used on the profile page (1MB chunks on iOS, retries, FileReader fallback).

Files Changed

Modified (1):
  • ~ src/components/dashboard/post-content.tsx

Version 0.2.97

Add "This Week" section to schedules and remove inconsistent discipline badge

March 21, 2026 at 4:22 PM GMT+0
a83a2e1
โœจAdded
  • Add "This Week" section to schedules and remove inconsistent discipline badge
  • Schedules page now has three sections: "This Week" (currently happening +
  • starting within 7 days), "Upcoming Events", and "Past Events". Multi-day
  • events that started before today but haven't ended are no longer shown
  • as "Past Events."
  • Also removed the discipline badge from competition cards since it's only

Files Changed

Modified (4):
  • ~ src/app/[username]/schedules/page.tsx
  • ~ src/app/schedules/page.tsx
  • ~ src/components/competitions/competitions-list-client.tsx
  • ~ src/components/schedules/schedules-list-client.tsx

Version 0.2.96

Remove deleted items from feed instantly without refresh

March 21, 2026 at 4:11 PM GMT+0
078f877
๐Ÿ—‘๏ธRemoved
  • Remove deleted items from feed instantly without refresh
  • Added onDeleted callback to MediaDeleteButton that removes the item
  • from the feed list's client state immediately after successful delete.
  • No more manual page refresh needed.

Files Changed

Modified (2):
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/profile/media-delete-button.tsx

Version 0.2.95

Add delete button for owned photos/videos in home feed

March 21, 2026 at 3:59 PM GMT+0
59e203f
โœจAdded
  • Add delete button for owned photos/videos in home feed
  • Users can now delete their own photos and videos directly from the home
  • feed without navigating to their profile page. The feed API now includes
  • personId and isOwner fields for media items, and the feed list renders
  • a delete button (trash icon) for owned content.

Files Changed

Modified (3):
  • ~ src/app/api/feed/route.ts
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.94

Fix video in feed navigating to post page instead of playing inline

March 21, 2026 at 2:57 PM GMT+0
a034766
๐Ÿ›Fixed
  • Fix video in feed navigating to post page instead of playing inline
  • The card onClick handler was navigating to /post/{id} when clicking
  • anywhere on the card, including the Mux video player. Now ignores
  • clicks on interactive elements (video, mux-player, buttons, links)
  • so videos play inline in the feed.

Files Changed

Modified (1):
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.93

Fix video upload: add Mux domains to Content-Security-Policy

March 21, 2026 at 2:44 PM GMT+0
60e660d
๐Ÿ›Fixed
  • Fix video upload: add Mux domains to Content-Security-Policy
  • The CSP connect-src was missing storage.googleapis.com and *.mux.com,
  • causing the browser to block upchunk's XHR PUT requests to Mux's upload
  • endpoint with status code 0. This was the root cause of all iPhone PWA
  • video upload failures.
  • Also added Mux domains to img-src, frame-src, and media-src for

Version 0.2.92

Show uploads instantly (optimistic UI) and fix iPhone PWA video uploads

March 21, 2026 at 2:22 PM GMT+0
f52654f
๐Ÿ”„Changed
  • Show uploads instantly (optimistic UI) and fix iPhone PWA video uploads
  • Photos and videos now appear in the feed immediately after upload instead
  • of requiring a manual page refresh. Uses optimistic state that deduplicates
  • against server data when router.refresh() completes.
  • For iPhone PWA video uploads: reduced chunk size to 1MB, increased retries
  • to 15, and enabled useLargeFileWorkaround (FileReader fallback instead of

Files Changed

Modified (1):
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.91

Fix @mention crash in captions and improve iPhone PWA video upload reliability

March 21, 2026 at 2:02 PM GMT+0
c30f5b8
๐Ÿ›Fixed
  • Fix @mention crash in captions and improve iPhone PWA video upload reliability
  • Caption @mention crashed because the search API returns `name` (combined) but
  • the component expected separate `firstName`/`lastName` fields โ€” accessing
  • `undefined[0]` for avatar initials threw a TypeError. Also hardened the post
  • page initials against null names.
  • Video uploads on iPhone PWA were failing with "server responded with 0" due to

Files Changed

Modified (3):
  • ~ src/app/post/[id]/page.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/ui/caption-input.tsx

Version 0.2.90

Fix video upload CORS for iPhone/iPad and add step diagnostics

March 20, 2026 at 11:59 PM GMT+0
fde68e4
๐Ÿ›Fixed
  • Fix video upload CORS for iPhone/iPad and add step diagnostics
  • Use cors_origin: "*" for Mux uploads โ€” the upload URL is single-use
  • and short-lived, so wildcard is safe. Fixes CORS mismatch when origin
  • header is missing (PWA mode) or differs (www vs non-www).
  • Add step tracking to video upload (file-check โ†’ create-upload โ†’
  • mux-upload) so error toasts show exactly which step failed.

Files Changed

Modified (2):
  • ~ src/app/api/person/videos/route.ts
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.89

Fix iPhone video upload failure and improve upload UX

March 20, 2026 at 10:37 PM GMT+0
65732be
๐Ÿ›Fixed
  • Fix iPhone video upload failure and improve upload UX
  • Add file readability check before upload to catch Safari stale File references
  • Add zero-size file check for iOS HEVC transcoding edge case
  • Show photo/video preview in caption step before posting
  • Change button from "Upload" to "Post" with Send icon
  • Generate video thumbnail preview (frame at 0.5s) when file is selected

Files Changed

Modified (1):
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.88

Fix PDF scorecard links blocked by popup blocker

March 20, 2026 at 7:12 PM GMT+0
c8a670c
๐Ÿ›Fixed
  • Fix PDF scorecard links blocked by popup blocker
  • window.open() after an async fetch() is blocked by popup blockers on
  • most browsers. Now opens the window synchronously before the fetch,
  • then updates its location with the signed URL once received.

Files Changed

Modified (2):
  • ~ src/components/competitions/division-scorecard.tsx
  • ~ src/components/teams/competition-performance-table.tsx

Version 0.2.87

Remove temporary debug step tracking from upload error toasts

March 20, 2026 at 5:41 PM GMT+0
989b66d
๐Ÿ›Fixed
  • Remove temporary debug step tracking from upload error toasts

Files Changed

Modified (1):
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.86

Replace XHR video upload with Mux chunked uploader for mobile Safari

March 20, 2026 at 5:32 PM GMT+0
c0839a6
๐Ÿ”„Changed
  • Replace XHR video upload with Mux chunked uploader for mobile Safari
  • Mobile Safari drops XHR PUT connections for large video files, causing
  • "Upload network error" on iPhone/iPad. Now uses @mux/upchunk which
  • splits files into 5MB chunks โ€” much more reliable on mobile connections.

Files Changed

Modified (2):
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-video-manager.tsx

Version 0.2.85

Add step-by-step debug info to upload error toasts for iPad diagnosis

March 20, 2026 at 5:01 PM GMT+0
f8af4f1
๐Ÿ›Fixed
  • Add step-by-step debug info to upload error toasts for iPad diagnosis
  • Temporary diagnostic: error toast now shows [step:X, type:Y, name:Z]
  • so we can identify exactly where iPad Safari throws.

Files Changed

Modified (1):
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.84

Convert HEIC to JPEG client-side before upload to fix iPad Safari failures

March 20, 2026 at 4:05 PM GMT+0
b65a4dc
๐Ÿ”„Changed
  • Convert HEIC to JPEG client-side before upload to fix iPad Safari failures
  • The actual cause of "string did not match expected pattern" on iPad is
  • Safari failing to serialize raw HEIC File objects in FormData for fetch().
  • Now all photo uploads convert to JPEG via canvas before sending, which:
  • Fixes iPad Safari HEIC upload failures
  • Reduces upload size (HEIC โ†’ compressed JPEG)

Files Changed

Modified (3):
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-picture-upload.tsx
  • ~ src/components/settings/avatar-upload.tsx

Version 0.2.83

Add HEIC support and extension fallback to all image upload endpoints

March 20, 2026 at 3:56 PM GMT+0
6630f27
โœจAdded
  • Add HEIC support and extension fallback to all image upload endpoints
  • iPad Safari sends empty file.type for HEIC/HEIF photos. All 6 image
  • upload endpoints now check file extension as fallback and accept HEIC/HEIF
  • (Sharp converts to JPEG on output).
  • Endpoints fixed:
  • /api/person/profile-picture

Files Changed

Modified (6):
  • ~ src/app/api/admin/profile-picture/route.ts
  • ~ src/app/api/choreographers/[id]/logo/route.ts
  • ~ src/app/api/coaches/[id]/photo/route.ts
  • ~ src/app/api/person/profile-picture/route.ts
  • ~ src/app/api/upload/profile/route.ts
  • ~ src/app/api/user/avatar/route.ts

Version 0.2.82

Fix server-side photo upload rejecting iPad files with empty MIME type

March 20, 2026 at 3:48 PM GMT+0
ef41cc8
๐Ÿ›Fixed
  • Fix server-side photo upload rejecting iPad files with empty MIME type
  • iPad Safari sometimes sends empty file.type for HEIC photos. The server
  • now also checks file extension (.heic, .heif, etc.) as fallback when
  • MIME type is missing.

Files Changed

Modified (1):
  • ~ src/app/api/person/photos/route.ts

Version 0.2.81

Fix iPad Safari upload failures ("string did not match expected pattern")

March 20, 2026 at 3:10 PM GMT+0
eb2d784
๐Ÿ›Fixed
  • Fix iPad Safari upload failures ("string did not match expected pattern")
  • Add file extension fallback for MIME type detection โ€” iPad Safari reports
  • empty file.type for HEIC photos and MOV videos
  • Add try/catch around URL.createObjectURL() calls which throw on Safari
  • Add img.onerror handler so HEIC files that can't preview still open crop dialog

Files Changed

Modified (2):
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-video-manager.tsx

Version 0.2.80

Optimize page loads: lazy team search, HEIC uploads, mobile crop dialog, hydration fixes

March 20, 2026 at 2:26 PM GMT+0
26c958f
๐Ÿ”„Changed
  • Optimize page loads: lazy team search, HEIC uploads, mobile crop dialog, hydration fixes
  • Profile experience: replace 52K preloaded teams with debounced API search
  • Person photos: accept HEIC/HEIF, validate empty files, improve error logging
  • Image crop dialog: mobile-responsive layout with proper viewport handling
  • Team page: remove fallback to gym-level uniformBrand (use season data only)
  • Gym form: remove gym-level uniform brand field, add season data rollover

Files Changed

Modified (11):
  • ~ scripts/maintenance/backfill-competition-locations.ts
  • ~ scripts/maintenance/backfill-gym-locations.ts
  • ~ src/app/api/person/photos/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/admin/gym-form.tsx
  • ~ src/components/people/person-experience.tsx
  • ~ src/components/settings/image-crop-dialog.tsx
  • ~ src/components/teams/competition-analysis/competition-analysis-wrapper.tsx
  • ~ src/components/teams/competition-analysis/head-to-head-table.tsx
  • ~ src/lib/auto-discover.ts

Version 0.2.79

Fix dance teams in feed 404 and video upload rejection for HEVC codecs

March 20, 2026 at 2:05 PM GMT+0
21a629d
๐Ÿ›Fixed
  • Fix dance teams in feed 404 and video upload rejection for HEVC codecs
  • Add activeDisciplineFilter to dashboard feed query so inactive
  • disciplines (Dance) no longer appear in the feed
  • Allow video uploads when browser can't decode the codec (HEVC/H.265);
  • Mux handles all formats server-side so client-side rejection was wrong

Files Changed

Modified (4):
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/components/dashboard/post-content.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-video-manager.tsx

Version 0.2.78

Replace Google Drive scorecard upload with direct browser download

March 20, 2026 at 4:41 AM GMT+0
11de730
๐Ÿ”„Changed
  • Replace Google Drive scorecard upload with direct browser download
  • Scorecards now download directly โ€” single division as PNG, full
  • competition as ZIP organized by level folders. Eliminates recurring
  • Google OAuth token expiration issues. Also added fallback from OAuth
  • to service account in google-drive.ts for any remaining Drive usage.

Files Changed

Created (1):
  • + src/app/api/admin/competitions/[id]/scorecards/download/route.ts
Modified (4):
  • ~ src/app/api/admin/competitions/[id]/scorecards/download/route.ts
  • ~ src/components/admin/competition-scorecards-button.tsx
  • ~ src/lib/competition-scorecards.ts
  • ~ src/lib/google-drive.ts

Version 0.2.77

Fix semifinals being treated as finals across the codebase

March 20, 2026 at 4:02 AM GMT+0
f15a908
๐Ÿ›Fixed
  • Fix semifinals being treated as finals across the codebase
  • .includes("final") also matches "semifinal", causing semifinal
  • placements/scores to be used instead of actual finals results.
  • Added shared isFinalRound() utility that excludes "semi" and
  • fixed all 15+ affected locations: gym stats, KPIs, competitions,
  • coach/choreographer pages, brand battle, NCA utils, and exports.

Files Changed

Modified (16):
  • ~ src/components/choreographers/choreographer-credits-section.tsx
  • ~ src/components/choreographers/choreographer-season-stats.tsx
  • ~ src/components/coaches/coach-credits-section.tsx
  • ~ src/components/coaches/coach-season-stats.tsx
  • ~ src/components/competitions/brand-battle-card.tsx
  • ~ src/components/competitions/es-bands-tab.tsx
  • ~ src/components/competitions/gym-wins-chart.tsx
  • ~ src/components/competitions/gyms-tab.tsx
  • ~ src/components/gyms/gym-season-competitions.tsx
  • ~ src/components/gyms/gym-season-kpis.tsx
  • ~ src/components/gyms/gym-season-stats.tsx
  • ~ src/lib/competition-analysis.ts
  • ~ src/lib/competition-google-sheets-export.ts
  • ~ src/lib/competition-scorecards.ts
  • ~ src/lib/nca-utils.ts
  • ~ src/lib/utils.ts

Version 0.2.76

Hide legacy "Prep" tier label from sidebar for free users

March 20, 2026 at 3:54 AM GMT+0
1d8ed2e
๐Ÿ”„Changed
  • Hide legacy "Prep" tier label from sidebar for free users
  • Free tier was being displayed as "Prep" (a deprecated tier name) under
  • the avatar in the sidebar. Only show tier labels for paid tiers and admins.

Files Changed

Modified (1):
  • ~ src/app/layout.tsx

Version 0.2.75

Add data quality infrastructure: quality score, All Star filter, PDF completeness loop

March 19, 2026 at 3:09 PM GMT+0
4902225
โœจAdded
  • Add data quality infrastructure: quality score, All Star filter, PDF completeness loop
  • Add quality-score.ts: weighted 0-100 score (event coverage, perf match, PDF integrity, validation)
  • Add dry-run-test.ts: read-only safety test for pipeline changes
  • Add pdf-completeness-loop.ts: iterative PDF backfill with batch pre-filtering
  • Add perfection-loop.ts: automated auditโ†’remediateโ†’backfill orchestrator for Railway
  • Add All Star filter to data-audit.ts and rescrape-orchestrator.ts (skip Game Day, Dance, etc.)

Files Changed

Created (4):
  • + scripts/maintenance/dry-run-test.ts
  • + scripts/maintenance/pdf-completeness-loop.ts
  • + scripts/maintenance/perfection-loop.ts
  • + scripts/maintenance/quality-score.ts
Modified (7):
  • ~ scripts/maintenance/dry-run-test.ts
  • ~ scripts/maintenance/pdf-completeness-loop.ts
  • ~ scripts/maintenance/perfection-loop.ts
  • ~ scripts/maintenance/quality-score.ts
  • ~ src/lib/data-audit.ts
  • ~ src/lib/rescrape-orchestrator.ts
  • ~ src/lib/validation/competition-validator.ts

Version 0.2.74

Add inline caption editing for photos and videos in feed

March 19, 2026 at 1:32 PM GMT+0
e99f724
โœจAdded
  • Add inline caption editing for photos and videos in feed
  • Pencil button on each feed item opens inline CaptionInput for editing.
  • Supports @-mention tagging, 280 char limit, optimistic UI updates.
  • New PATCH /api/person/content endpoint handles caption/description
  • updates with auth/ownership checks.

Files Changed

Created (1):
  • + src/app/api/person/content/route.ts
Modified (2):
  • ~ src/app/api/person/content/route.ts
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.73

Add followers/following list dialogs to profile page

March 19, 2026 at 5:21 AM GMT+0
551e05a
โœจAdded
  • Add followers/following list dialogs to profile page
  • Click the follower/following counts on any profile to see the full
  • list. Followers shows people with avatar + username. Following shows
  • people, teams, and gyms with type badges. Data fetched on-demand via
  • new /api/person/follow-list endpoint.

Files Changed

Created (2):
  • + src/app/api/person/follow-list/route.ts
  • + src/components/profile/follow-list-dialog.tsx
Modified (3):
  • ~ src/app/api/person/follow-list/route.ts
  • ~ src/components/profile/follow-list-dialog.tsx
  • ~ src/components/profile/profile-card-clean.tsx

Version 0.2.72

Unify feed to single column, add delete button to post page

March 19, 2026 at 5:13 AM GMT+0
4689969
๐Ÿ”„Changed
  • Unify feed to single column, add delete button to post page
  • Change feed grid from 2-column to single-column layout
  • Remove separate ProfileVideoManager section from Feed tab
  • Add MediaDeleteButton component for post page delete with redirect
  • Add delete button to /post/[id] page (owner + admin only)

Files Changed

Created (1):
  • + src/components/profile/media-delete-button.tsx
Modified (4):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/post/[id]/page.tsx
  • ~ src/components/profile/media-delete-button.tsx
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.71

Add profile tab navigation and highlights feature

March 19, 2026 at 4:26 AM GMT+0
bf9290a
โœจAdded
  • Add profile tab navigation and highlights feature
  • Replace vertically-stacked CollapsibleSections with URL-based tabs
  • (Feed | Experience | Skills | Timeline | Highlights). Add isHighlighted
  • boolean to PersonPhoto and ProfileVideo models with star/pin toggle
  • in the feed. Highlights tab shows pinned content grid plus social links.

Files Changed

Created (3):
  • + src/app/api/person/highlights/route.ts
  • + src/components/profile/profile-highlights-tab.tsx
  • + src/components/profile/profile-tabs.tsx
Modified (7):
  • ~ prisma/schema.prisma
  • ~ src/app/api/person/highlights/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-highlights-tab.tsx
  • ~ src/components/profile/profile-tabs.tsx
  • ~ src/types/person-photos.ts

Version 0.2.70

Fix home feed missing media, add content delete buttons, clarify cover photo

March 19, 2026 at 3:51 AM GMT+0
0eb5dad
๐Ÿ›Fixed
  • Fix home feed missing media, add content delete buttons, clarify cover photo
  • Add mediaPhotos + mediaVideos queries to SSR feed page (were missing,
  • causing only performance scores to show on initial load)
  • Add delete buttons (trash icon) on photos and videos in profile Content feed
  • Update edit profile modal label to clarify photo is used as cover photo
  • Delete calls existing API endpoints with confirmation dialog

Files Changed

Modified (3):
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/components/people/person-profile-edit.tsx
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.69

Simplify cover photo, unified upload, captions & @-mention tagging (Phase 7)

March 19, 2026 at 2:14 AM GMT+0
48053b6
๐Ÿ”„Changed
  • Simplify cover photo, unified upload, captions & @-mention tagging (Phase 7)
  • Replace photo carousel with single static cover photo (ProfileCoverPhoto)
  • Remove ProfilePhotoManager from profile page
  • Merge photo+video upload into single "Add Content" file picker
  • Add caption field (280 chars) to PersonPhoto schema
  • Add CaptionInput with @-mention autocomplete via /api/people/search

Files Changed

Created (3):
  • + src/components/profile/caption-display.tsx
  • + src/components/profile/profile-cover-photo.tsx
  • + src/components/ui/caption-input.tsx
Modified (12):
  • ~ prisma/schema.prisma
  • ~ src/app/api/feed/route.ts
  • ~ src/app/api/person/photos/route.ts
  • ~ src/app/api/person/videos/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/components/dashboard/post-content.tsx
  • ~ src/components/profile/caption-display.tsx
  • ~ src/components/profile/profile-content-feed.tsx
  • ~ src/components/profile/profile-cover-photo.tsx
  • ~ src/components/ui/caption-input.tsx
  • ~ src/types/person-photos.ts

Version 0.2.68

Add feed upload tabs, profile content section, and collapsible sections (Phase 6)

March 19, 2026 at 12:19 AM GMT+0
c32c14c
โœจAdded
  • Add feed upload tabs, profile content section, and collapsible sections (Phase 6)
  • Replace PostHighlight with tabbed PostContent (Link/Photo/Video) on feed page
  • FREE users see link-only input; Elite+ see all three tabs with upload gate
  • Add ProfileContentFeed component merging photos+videos sorted by date
  • Add CollapsibleSection wrapper; wrap Experience, Skills, Timeline, Highlights
  • Content section is default-expanded; others collapsed to reduce page length

Files Changed

Created (3):
  • + src/components/dashboard/post-content.tsx
  • + src/components/profile/collapsible-section.tsx
  • + src/components/profile/profile-content-feed.tsx
Modified (5):
  • ~ src/app/dashboard/feed/page.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/dashboard/post-content.tsx
  • ~ src/components/profile/collapsible-section.tsx
  • ~ src/components/profile/profile-content-feed.tsx

Version 0.2.67

Fix video manager admin bypass and tier config fallback

March 18, 2026 at 11:03 PM GMT+0
250e1d8
๐Ÿ›Fixed
  • Fix video manager admin bypass and tier config fallback
  • Admin users now see video manager regardless of profile owner's tier
  • Admin viewers get PRO tier limits instead of profile owner's FREE limits

Files Changed

Modified (1):
  • ~ src/app/people/[username]/page.tsx

Version 0.2.66

Add photo/video media to follower feed (Phase 5)

March 18, 2026 at 10:20 PM GMT+0
9431468
โœจAdded
  • Add photo/video media to follower feed (Phase 5)
  • Add media_photo and media_video feed item types to feed API
  • Fetch PersonPhoto + ProfileVideo from followed people in parallel with existing queries
  • Render photos with Image component and videos with MuxPlayer in feed cards
  • Add share buttons on feed media items, link to /post/[id] permalinks
  • Existing infinite scroll and cursor pagination handles new types seamlessly

Files Changed

Modified (2):
  • ~ src/app/api/feed/route.ts
  • ~ src/components/dashboard/feed-list.tsx

Version 0.2.65

Fix clean-data loop stage escalation and robust duplicate team merging

March 18, 2026 at 10:19 PM GMT+0
6fcb4f3
๐Ÿ›Fixed
  • Fix clean-data loop stage escalation and robust duplicate team merging
  • The clean-data loop was stuck at batch size 5 because both code paths
  • in the stage loop broke out instead of escalating. Also hardened the
  • duplicate-teams fix to handle unique constraint conflicts on performances,
  • already-deleted teams in the same batch, and cascading merge failures.

Files Changed

Created (4):
  • + scripts/maintenance/clean-data-loop.ts
  • + src/lib/data-quality/assertions.ts
  • + src/lib/data-quality/fixes.ts
  • + src/lib/data-quality/reporter.ts
Modified (4):
  • ~ scripts/maintenance/clean-data-loop.ts
  • ~ src/lib/data-quality/assertions.ts
  • ~ src/lib/data-quality/fixes.ts
  • ~ src/lib/data-quality/reporter.ts

Version 0.2.64

Add permalinks, upload gate, share/report buttons, admin media review (Phase 4)

March 18, 2026 at 10:14 PM GMT+0
2ea4fb9
โœจAdded
  • Add permalinks, upload gate, share/report buttons, admin media review (Phase 4)
  • /post/[id] permalink page with OG meta tags for rich social previews
  • Upload gate dialog: birthdate collection, parental consent for under-13, visibility info for under-18
  • Share buttons: copy link, native Web Share API, Twitter/X, Facebook
  • Report button: dialog with reason text, creates MediaReport record
  • Admin media reports page at /admin/media-reports with review/resolve actions

Files Changed

Created (7):
  • + src/app/admin/media-reports/actions.tsx
  • + src/app/admin/media-reports/page.tsx
  • + src/app/api/admin/media-reports/route.ts
  • + src/app/post/[id]/page.tsx
  • + src/components/profile/media-report-button.tsx
  • + src/components/profile/media-share-buttons.tsx
  • + src/components/profile/upload-gate-dialog.tsx
Modified (9):
  • ~ src/app/admin/media-reports/actions.tsx
  • ~ src/app/admin/media-reports/page.tsx
  • ~ src/app/api/admin/media-reports/route.ts
  • ~ src/app/api/person/[id]/route.ts
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/post/[id]/page.tsx
  • ~ src/components/profile/media-report-button.tsx
  • ~ src/components/profile/media-share-buttons.tsx
  • ~ src/components/profile/upload-gate-dialog.tsx

Version 0.2.63

Add video upload UI and profile gallery (Phase 3)

March 18, 2026 at 10:06 PM GMT+0
36abf7f
โœจAdded
  • Add video upload UI and profile gallery (Phase 3)
  • ProfileVideoManager: file picker with duration/size validation, XHR upload with progress bar, drag-to-reorder, delete
  • ProfileVideoPlayer: wraps @mux/mux-player-react with processing/error/ready states
  • Profile page: video manager for Elite+ editors, public video gallery for all viewers
  • Client-side validation enforces tier-based duration and file size limits before upload

Files Changed

Created (2):
  • + src/components/profile/profile-video-manager.tsx
  • + src/components/profile/profile-video-player.tsx
Modified (3):
  • ~ src/app/people/[username]/page.tsx
  • ~ src/components/profile/profile-video-manager.tsx
  • ~ src/components/profile/profile-video-player.tsx

Version 0.2.62

Add Mux video upload API and webhook handler (Phase 2)

March 18, 2026 at 9:56 PM GMT+0
c1c2ab6
โœจAdded
  • Add Mux video upload API and webhook handler (Phase 2)
  • Create Mux client singleton (src/lib/mux.ts)
  • POST /api/person/videos: creates Mux direct upload URL with tier/age/consent checks
  • GET/PUT/DELETE /api/person/videos: list, reorder, and delete videos (+ Mux asset cleanup)
  • POST /api/webhooks/mux: handles asset.ready, asset.errored, upload.asset_created events
  • Install @mux/mux-node v12, @mux/mux-player-react

Files Changed

Created (3):
  • + src/app/api/person/videos/route.ts
  • + src/app/api/webhooks/mux/route.ts
  • + src/lib/mux.ts
Modified (3):
  • ~ src/app/api/person/videos/route.ts
  • ~ src/app/api/webhooks/mux/route.ts
  • ~ src/lib/mux.ts

Version 0.2.61

Add direct media upload foundation (Phase 1)

March 18, 2026 at 9:41 PM GMT+0
79a28e2
โœจAdded
  • Add direct media upload foundation (Phase 1)
  • Add ProfileVideo model with Mux fields, MediaReport model for content safety
  • Add VideoStatus, MediaVisibility enums and parentalConsentAt on Person
  • Add tier config flags: hasMediaUpload, maxMonthlyUploads, maxVideoDurationSecs, maxVideoFileSizeMB
  • Make photo upload limits dynamic from tier config instead of hardcoded 5
  • Add media-safety.ts: age checks, visibility defaults for minors, parental consent, upload counting

Files Changed

Created (2):
  • + src/app/api/media/report/route.ts
  • + src/lib/media-safety.ts
Modified (6):
  • ~ prisma/schema.prisma
  • ~ src/app/api/media/report/route.ts
  • ~ src/app/api/person/photos/route.ts
  • ~ src/lib/media-safety.ts
  • ~ src/lib/tiers-config.ts
  • ~ src/lib/tiers.ts

Version 0.2.60

Fix Results module showing all rounds instead of only finals

March 18, 2026 at 5:30 PM GMT+0
fb39368
๐Ÿ›Fixed
  • Fix Results module showing all rounds instead of only finals
  • "Semi-Finals" was misclassified as "Finals" because getRoundLabel checked
  • for "final" before "semi", and "semi-finals".includes("final") is true.
  • Reorder checks so "semi" is matched first in both division page and tab.

Files Changed

Modified (2):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/components/competitions/divisions-tab.tsx

Version 0.2.59

Fix Results module showing all rounds instead of only finals

March 18, 2026 at 5:30 PM GMT+0
998ea8a
๐Ÿ›Fixed
  • Fix Results module showing all rounds instead of only finals
  • "Semi-Finals" was misclassified as "Finals" because getRoundLabel checked
  • for "final" before "semi", and "semi-finals".includes("final") is true.
  • Reorder checks so "semi" is matched first in both division page and tab.

Files Changed

Modified (2):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/components/competitions/divisions-tab.tsx

Version 0.2.58

Fix division results showing duplicate teams for non-standard round labels

March 16, 2026 at 7:15 PM GMT+0
ef4f7bf
๐Ÿ›Fixed
  • Fix division results showing duplicate teams for non-standard round labels
  • pickBestRound helper selects the best round (Finals > Semis > Day 2 > last entry)
  • instead of hardcoded "Finals" lookup that fell back to all performances.

Files Changed

Modified (1):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx

Version 0.2.57

Fix division results showing duplicate teams for non-standard round labels

March 16, 2026 at 7:15 PM GMT+0
359140a
๐Ÿ›Fixed
  • Fix division results showing duplicate teams for non-standard round labels
  • pickBestRound helper selects the best round (Finals > Semis > Day 2 > last entry)
  • instead of hardcoded "Finals" lookup that fell back to all performances.

Files Changed

Modified (1):
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx

Version 0.2.56

Fix round value case mismatch โ€” DB uses "Finals" not "FINALS"

March 15, 2026 at 2:12 AM GMT+0
9595090
๐Ÿ›Fixed
  • Fix round value case mismatch โ€” DB uses "Finals" not "FINALS"
  • The performance round values in the database are mixed-case ("Finals",
  • "Prelims") not uppercase ("FINALS", "FINAL"). Added "Finals" to all
  • round filters in nca-utils and series page queries.

Files Changed

Modified (2):
  • ~ src/app/competitions/series/[seriesSlug]/page.tsx
  • ~ src/lib/nca-utils.ts

Version 0.2.55

Fix scrape-job-processor build error and commit pending changes

March 15, 2026 at 2:04 AM GMT+0
3e99520
๐Ÿ›Fixed
  • Fix scrape-job-processor build error and commit pending changes

Files Changed

Modified (1):
  • ~ src/lib/scrape-job-processor.ts

Version 0.2.54

Fix null safety in scratch files to unblock build

March 15, 2026 at 1:56 AM GMT+0
8c1f67e
๐Ÿ›Fixed
  • Fix null safety in scratch files to unblock build

Version 0.2.53

Fix NCA badge to count all series wins + add series page season filter and analytics

March 15, 2026 at 1:47 AM GMT+0
3b6fdbe
๐Ÿ›Fixed
  • Fix NCA badge to count all series wins + add series page season filter and analytics
  • Replace in-memory NCA win counting with Prisma queries via CompetitionSeries slug,
  • fixing truncation from take:250 limit on team/gym/coach/choreographer pages
  • Add season filtering to series page via URL search params
  • Add "Wins by Division" table and "Gym Dominance Over Time" stacked area chart
  • Update scorecard backgrounds

Files Changed

Created (3):
  • + src/components/competitions/series-division-wins.tsx
  • + src/components/competitions/series-gym-trend-chart.tsx
  • + src/components/competitions/series-page-client.tsx
Modified (16):
  • ~ scripts/import/review-import-worker.ts
  • ~ src/app/api/live-scores/route.ts
  • ~ src/app/choreographers/[id]/page.tsx
  • ~ src/app/coaches/[id]/page.tsx
  • ~ src/app/competitions/series/[seriesSlug]/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/live/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/competitions/series-division-wins.tsx
  • ~ src/components/competitions/series-gym-trend-chart.tsx
  • ~ src/components/competitions/series-page-client.tsx
  • ~ src/components/live/live-score-card.tsx
  • ~ src/components/ui/nca-champion-badge.tsx
  • ~ src/lib/import/schedule-import.ts
  • ~ src/lib/nca-utils.ts
  • ~ src/lib/scrape-job-processor.ts

Version 0.2.52

Add Competition Series to Explore page search results

March 15, 2026 at 1:46 AM GMT+0
11dada9
โœจAdded
  • Add Competition Series to Explore page search results
  • Series now appear in explore results with grid/list views and a category
  • card on the explore landing page linking to /competitions/series.

Files Changed

Modified (2):
  • ~ src/app/explore/page.tsx
  • ~ src/components/explore/explore-results.tsx

Version 0.2.51

Add section headers to search dropdown and tab navigation to search page

March 15, 2026 at 1:23 AM GMT+0
a042f0e
โœจAdded
  • Add section headers to search dropdown and tab navigation to search page
  • Dropdown now groups results by type (Gyms, Teams, Competition Series, etc.)
  • with section headers and reduces per-type limit from 5 to 3 so all sections
  • are visible. Search page adds pill-shaped tab filters with result counts.

Files Changed

Modified (3):
  • ~ src/app/api/search/route.ts
  • ~ src/app/search/page.tsx
  • ~ src/components/home-search.tsx

Version 0.2.50

Fix notification click not navigating on iOS PWA

March 14, 2026 at 9:52 PM GMT+0
a21aa88
๐Ÿ›Fixed
  • Fix notification click not navigating on iOS PWA
  • client.navigate() is not supported on iOS Safari PWA. Now catches the
  • error and falls through to clients.openWindow() which works cross-platform.
  • Also uses full URL to ensure proper routing.

Version 0.2.49

Add Source PDF link to schedule page header

March 14, 2026 at 5:38 PM GMT+0
f0b7ac9
โœจAdded
  • Add Source PDF link to schedule page header
  • Shows a link to the original PDF when fileUrl is available on the CompetitionSchedule.

Files Changed

Modified (1):
  • ~ src/app/schedules/[slug]/page.tsx

Version 0.2.48

Move stage before competition name in notifications

March 14, 2026 at 5:33 PM GMT+0
41c8040
๐Ÿ”„Changed
  • Move stage before competition name in notifications
  • "Performs at 1:29 PM EDT in L4.2 Senior on Stage A at Cheer Power Grand Nationals"

Files Changed

Modified (2):
  • ~ src/lib/notifications/reminder-engine.ts
  • ~ src/lib/notifications/score-notifications.ts

Version 0.2.47

Add stage name to end of performance notifications

March 14, 2026 at 5:31 PM GMT+0
cbecb74
โœจAdded
  • Add stage name to end of performance notifications
  • Shows stage/panel info at the end like: "Performs at 1:33 PM EDT in L3 - U16 at Cheer Power Grand Nationals (Stage A)"

Files Changed

Modified (2):
  • ~ src/lib/notifications/reminder-engine.ts
  • ~ src/lib/notifications/score-notifications.ts

Version 0.2.46

Add @types/pdf-parse to fix build error

March 14, 2026 at 5:10 PM GMT+0
ccf9aaa
โœจAdded
  • Add @types/pdf-parse to fix build error

Version 0.2.45

Exclude root scratch files from TypeScript build

March 14, 2026 at 4:37 PM GMT+0
f359b9f
๐Ÿ”„Changed
  • Exclude root scratch files from TypeScript build

Version 0.2.44

Surface actual push subscription error messages to the user

March 14, 2026 at 4:27 PM GMT+0
536db2f
๐Ÿ”„Changed
  • Surface actual push subscription error messages to the user
  • subscribe() now returns { ok, error } with specific failure reasons:
  • Service worker not supported / failed to register
  • PushManager not available (wrong browser on iOS)
  • Permission denied
  • PushManager.subscribe() failure (with native error message)

Files Changed

Modified (3):
  • ~ src/components/notifications/push-prompt.tsx
  • ~ src/components/settings/notification-preferences.tsx
  • ~ src/hooks/use-push-subscription.ts

Version 0.2.43

Add push subscribe error feedback and better error logging

March 14, 2026 at 4:17 PM GMT+0
9ab65d4
โœจAdded
  • Add push subscribe error feedback and better error logging
  • Show toast on success/failure when enabling push
  • Display error message if push subscription fails
  • Log specific failure points (PushManager.subscribe, missing keys, API error)
  • Helps diagnose why push enable appears to do nothing on some devices

Files Changed

Modified (2):
  • ~ src/components/settings/notification-preferences.tsx
  • ~ src/hooks/use-push-subscription.ts

Version 0.2.42

Improve push permission denied message with platform-specific reset instructions

March 14, 2026 at 4:08 PM GMT+0
7e6def7
๐Ÿ”„Changed
  • Improve push permission denied message with platform-specific reset instructions

Files Changed

Modified (1):
  • ~ src/components/settings/notification-preferences.tsx

Version 0.2.41

Fix gym name contamination and improve generic team name validation

March 14, 2026 at 3:58 PM GMT+0
af01386
๐Ÿ›Fixed
  • Fix gym name contamination and improve generic team name validation
  • Cleaned 205 contaminated gyms: person names, division suffixes, dash artifacts
  • Deleted 13 orphan teams (0 performances)
  • Validator now skips schools/dance programs for GENERIC_TEAM_NAME check
  • (high schools, universities, etc. legitimately have team name == gym name)
  • Bulk scrape re-enabled when RESCRAPE_ENABLED=false

Files Changed

Created (1):
  • + scripts/maintenance/fix-remaining-person-gyms.ts
Modified (3):
  • ~ scripts/maintenance/cleanup-gym-names.ts
  • ~ scripts/maintenance/fix-remaining-person-gyms.ts
  • ~ src/lib/validation/competition-validator.ts

Version 0.2.40

Add explicit Enable Push button to notification settings

March 14, 2026 at 3:57 PM GMT+0
924acf7
โœจAdded
  • Add explicit Enable Push button to notification settings
  • Shows push subscription status per device with Enable/Disable button
  • Removes blanket iOS block from PushPrompt โ€” now checks PushManager API directly
  • Users can enable push from settings instead of only via the floating prompt

Files Changed

Modified (2):
  • ~ src/components/notifications/push-prompt.tsx
  • ~ src/components/settings/notification-preferences.tsx

Version 0.2.39

Fix iOS push detection: check actual PushManager support instead of blanket-blocking iOS

March 14, 2026 at 3:49 PM GMT+0
e0e9f8d
๐Ÿ›Fixed
  • Fix iOS push detection: check actual PushManager support instead of blanket-blocking iOS
  • iOS 16.4+ Safari PWAs support Web Push. The old check blocked all iOS devices.
  • Now only shows the banner when PushManager/Notification APIs are truly unavailable
  • (e.g. Chrome on iOS, older iOS versions, non-standalone mode).

Files Changed

Modified (2):
  • ~ src/components/settings/notification-preferences.tsx
  • ~ src/hooks/use-push-subscription.ts

Version 0.2.38

Fix silent push notification failures: validate subscriptions, fix counting, add logging

March 14, 2026 at 3:45 PM GMT+0
9b57187
๐Ÿ›Fixed
  • Fix silent push notification failures: validate subscriptions, fix counting, add logging
  • resolveChannelFlags now checks PushSubscription table before marking push=true
  • Users without a registered push subscription are excluded from push attempts
  • Fix push result counting to track per-user delivery (not per-promise)
  • Add logging when user has 0 push subscriptions and when subscriptions expire

Files Changed

Modified (3):
  • ~ src/lib/notifications/preferences.ts
  • ~ src/lib/notifications/score-notifications.ts
  • ~ src/lib/push.ts

Version 0.2.37

Fix SSR crash: wrap useIsIOSPWA in useEffect to avoid window/navigator on server

March 14, 2026 at 3:32 PM GMT+0
8201e29
๐Ÿ›Fixed
  • Fix SSR crash: wrap useIsIOSPWA in useEffect to avoid window/navigator on server

Files Changed

Modified (1):
  • ~ src/hooks/use-push-subscription.ts

Version 0.2.36

Refactor PWA notifications: iOS detection, reorganize alerts page, improve notification URLs

March 14, 2026 at 3:27 PM GMT+0
592e0a1
๐Ÿ”„Changed
  • Refactor PWA notifications: iOS detection, reorganize alerts page, improve notification URLs
  • Add userScheduleId relation to ScheduleEntryBell for bulk schedule bell management
  • Add useIsIOSPWA() hook to detect iOS PWA and suppress push prompts
  • Move bell/follow management from notifications page to alerts settings page
  • Split subscriptions into follows, saved schedules, and orphan bells sections
  • Score notifications now link to division page instead of team page

Files Changed

Modified (17):
  • ~ prisma/schema.prisma
  • ~ scripts/maintenance/backfill-scoresheet-pdfs.ts
  • ~ src/app/api/schedule-entry-bell/bulk/route.ts
  • ~ src/app/notifications/page.tsx
  • ~ src/app/settings/alerts/page.tsx
  • ~ src/components/notifications/manage-bells.tsx
  • ~ src/components/notifications/notification-list.tsx
  • ~ src/components/notifications/push-prompt.tsx
  • ~ src/components/pwa/install-prompt.tsx
  • ~ src/components/settings/notification-preferences.tsx
  • ~ src/components/settings/subscriptions-list.tsx
  • ~ src/hooks/use-push-subscription.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/notifications/__tests__/score-notifications.test.ts
  • ~ src/lib/notifications/reminder-engine.ts
  • ~ src/lib/notifications/score-notifications.ts
  • ~ src/lib/push.ts

Version 0.2.35

Fix PDF print: constrain column widths, allow text wrapping

March 14, 2026 at 1:44 PM GMT+0
3a0170b
๐Ÿ›Fixed
  • Fix PDF print: constrain column widths, allow text wrapping
  • Use table-layout: fixed with explicit column widths (Team 80px,
  • Competition 120px, Division 70px, Round 42px, scores 38px each)
  • Remove white-space: nowrap from data cells so competition names wrap
  • Reduce font sizes (6.5px headers, 7px body) and padding for density
  • Ensures all columns fit on a single landscape page when printing

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard-export.ts

Version 0.2.34

Fix saved schedules not appearing until manual reload

March 14, 2026 at 1:20 PM GMT+0
d13b469
๐Ÿ›Fixed
  • Fix saved schedules not appearing until manual reload
  • After saving a schedule, router.push() navigated to the schedules page
  • but used stale RSC cache. Add router.refresh() to force data refetch,
  • matching the pattern already used by delete/rename operations.

Files Changed

Modified (1):
  • ~ src/components/schedules/save-schedule-dialog.tsx

Version 0.2.33

Replace SMS notification settings with "Coming Soon" label

March 14, 2026 at 1:13 PM GMT+0
19623f3
๐Ÿ”„Changed
  • Replace SMS notification settings with "Coming Soon" label
  • SMS is not currently functional. Replace the toggle/upgrade/phone
  • verification UI with a simple "Coming soon" message in both the
  • notification preferences table and the settings card.

Files Changed

Modified (2):
  • ~ src/components/settings/notification-preferences.tsx
  • ~ src/components/settings/settings-layout.tsx

Version 0.2.32

Fix push notifications not sent: trigger push subscription on bell toggle

March 14, 2026 at 1:03 PM GMT+0
65ef8df
๐Ÿ›Fixed
  • Fix push notifications not sent: trigger push subscription on bell toggle
  • Users with belled follows had zero push subscriptions because the push
  • prompt only fired on initial follow and could be permanently dismissed.
  • Now when the bell is toggled ON, we auto-subscribe if permission is
  • already granted, or re-show the push prompt (clearing dismissed state).
  • Also auto-show prompt on page load for users with belled follows but

Files Changed

Modified (2):
  • ~ src/components/follow-button.tsx
  • ~ src/components/notifications/push-prompt.tsx

Version 0.2.31

Add color-coded column groups to PDF export matching website

March 14, 2026 at 2:59 AM GMT+0
0ecc01c
โœจAdded
  • Add color-coded column groups to PDF export matching website
  • Add grouped header row with colored backgrounds (Building=blue,
  • Tumbling=orange, Performance=violet) spanning their columns
  • Add left border dividers on first column of each group in data rows
  • Add light tinted backgrounds on column headers per group
  • Two-row thead: group labels on top, column names below

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard-export.ts

Version 0.2.30

Move filter sidebar toggle below folder toggle, remove from card header

March 14, 2026 at 2:56 AM GMT+0
4eb9a56
๐Ÿ”„Changed
  • Move filter sidebar toggle below folder toggle, remove from card header
  • Filter sidebar toggle is now a Filter icon button stacked below the
  • saved scorecards panel toggle. GymScorecard accepts filterSidebarOpen
  • and onFilterSidebarToggle props so the parent controls visibility.

Files Changed

Modified (2):
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/scorecards-client.tsx
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.29

Add toggle to hide/show the scorecard filter sidebar

March 14, 2026 at 2:45 AM GMT+0
6e4b7d3
โœจAdded
  • Add toggle to hide/show the scorecard filter sidebar
  • Sidebar toggle button (panel icon) in the scorecard header lets users
  • collapse the entire filter/controls sidebar so the performance table
  • can use the full width. Only visible on desktop (xl breakpoint).

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.28

Move grouping, sorting, and display controls into collapsible sidebar

March 14, 2026 at 1:37 AM GMT+0
2377d8d
๐Ÿ”„Changed
  • Move grouping, sorting, and display controls into collapsible sidebar
  • Move Group by, Sub-group by, Sub-sub-group, Level sort, Averages
  • toggle, and score column group pills from the inline card header
  • into the filter sidebar
  • Sidebar now has two collapsible sections: "Controls" and "Filters"
  • Both sections are collapsible with chevron toggles

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.27

Fix PDF export: wrap score column headers and use landscape layout

March 14, 2026 at 1:31 AM GMT+0
0ab8476
๐Ÿ›Fixed
  • Fix PDF export: wrap score column headers and use landscape layout
  • Score column headers with full labels (e.g. "Stunt Difficulty") were
  • using white-space: nowrap, making columns too wide to fit on one page.
  • Now headers wrap text with constrained max-width, use smaller font,
  • and the page defaults to landscape orientation for better fit.

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard-export.ts

Version 0.2.26

Show Scorecards link on all analyze modes, apply layout tweaks

March 14, 2026 at 1:21 AM GMT+0
14fe798
๐Ÿ”„Changed
  • Show Scorecards link on all analyze modes, apply layout tweaks
  • Scorecards nav link now falls back to first followed gym when not in
  • gym mode, so it's always visible on Dashboard/Team/Group pages too
  • Apply full-height layout for scorecards page (user styling changes)
  • Use text-foreground for scorecard breakdown column headers

Files Changed

Modified (3):
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/scorecards-client.tsx
  • ~ src/components/gym-analysis/gym-scorecard.tsx
  • ~ src/components/my-teams/my-teams-client.tsx

Version 0.2.25

Fix rescrape: disable bulk scrape when RESCRAPE_ENABLED to prevent month contention

March 13, 2026 at 11:58 PM GMT+0
1701763
๐Ÿ›Fixed
  • Fix rescrape: disable bulk scrape when RESCRAPE_ENABLED to prevent month contention
  • Bulk scrape and rescrape both competed for PENDING BulkScrapeMonth records.
  • Bulk scrape ran every 5 min and would mark months DISCOVERED without force-rescraping,
  • starving the rescrape timer which only ran every 10 min.

Files Changed

Modified (1):
  • ~ scripts/import/review-import-worker.ts

Version 0.2.24

Add PDF scoresheets feature to PRO tier on pricing page

March 13, 2026 at 11:55 PM GMT+0
8b28c66
โœจAdded
  • Add PDF scoresheets feature to PRO tier on pricing page
  • Shows in both the plan card bullet points and the feature comparison
  • table under Pro Intelligence.

Files Changed

Modified (2):
  • ~ src/app/pricing/page.tsx
  • ~ src/lib/pricing-plans.ts

Version 0.2.23

Fix Railway crash: validate Supabase URL before creating client

March 13, 2026 at 9:07 PM GMT+0
be36db9
๐Ÿ›Fixed
  • Fix Railway crash: validate Supabase URL before creating client
  • The Railway worker had placeholder Supabase env vars (e.g. "https://[project-ref].supabase.co")
  • which caused createClient to throw on module load. Now validates the URL is parseable before
  • attempting to create the client, falling back to a proxy that throws on actual use.

Files Changed

Modified (1):
  • ~ src/lib/supabase.ts

Version 0.2.22

Fix backfill script: correct Varsity API parsing and round stripping

March 13, 2026 at 8:49 PM GMT+0
62ab36a
๐Ÿ›Fixed
  • Fix backfill script: correct Varsity API parsing and round stripping
  • The API response nests items in container.content.items (initial) and
  • data.data.content.items (partial). Round names are appended without
  • a dash separator (e.g. "L5 Junior Finals" not "L5 Junior - Finals").

Files Changed

Modified (1):
  • ~ scripts/maintenance/backfill-scoresheet-pdfs.ts

Version 0.2.21

Fix broken search: invalid regex character range in REGEXP_REPLACE

March 13, 2026 at 8:24 PM GMT+0
687dfe4
๐Ÿ›Fixed
  • Fix broken search: invalid regex character range in REGEXP_REPLACE
  • The PostgreSQL regex pattern '[\s\-.'']' had an invalid character
  • range because the hyphen was interpreted as a range operator between
  • \s and the dot. Fix by moving hyphen to end of character class:
  • '[\s.''-]'. This was causing the entire search query to fail silently,
  • returning zero results for all searches.

Files Changed

Modified (2):
  • ~ src/app/api/search/route.ts
  • ~ src/app/search/page.tsx

Version 0.2.20

Add PDF scoresheet storage & PRO-tier access

March 13, 2026 at 8:06 PM GMT+0
10aca34
โœจAdded
  • Add PDF scoresheet storage & PRO-tier access
  • Store original Varsity TV score breakdown PDFs in Supabase before they
  • get removed each season. New ScoresheetPdf model keyed by
  • (competition, division, round). Import pipeline downloads PDFs
  • sequentially after division processing. PRO users get a clickable
  • FileText icon to view the original scoresheet via signed URL.

Files Changed

Created (3):
  • + scripts/maintenance/backfill-scoresheet-pdfs.ts
  • + src/app/api/scoresheets/[performanceId]/route.ts
  • + src/lib/import/pdf-upload.ts
Modified (13):
  • ~ prisma/schema.prisma
  • ~ scripts/maintenance/backfill-scoresheet-pdfs.ts
  • ~ src/app/api/scoresheets/[performanceId]/route.ts
  • ~ src/app/competitions/[id]/divisions/[divisionId]/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/components/competitions/division-scorecard.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/lib/import/index.ts
  • ~ src/lib/import/pdf-upload.ts
  • ~ src/lib/import/review-import-processor.ts
  • ~ src/lib/import/types.ts
  • ~ src/lib/tiers-config.ts
  • ~ src/lib/tiers.ts

Version 0.2.19

Fix scorecard column header text color and improve level parsing in import scripts

March 13, 2026 at 7:42 PM GMT+0
2f9cc43
๐Ÿ›Fixed
  • Fix scorecard column header text color and improve level parsing in import scripts
  • Use text-foreground instead of group textColor for breakdown column
  • full-name headers so they remain readable against tinted backgrounds
  • Switch level parsing from includes() chains to regex for accurate
  • decimal level extraction (L1.1, L4.2, etc.) across all import scripts
  • Skip generic "LEVEL X" Level Finals entries in NCA import

Files Changed

Modified (6):
  • ~ scripts/import/import-legacy-fuzzy.ts
  • ~ scripts/import/import-nca-2025.ts
  • ~ scripts/import/import-november-2025-fuzzy.ts
  • ~ scripts/import/import-october-2025-fuzzy.ts
  • ~ scripts/import/import-varsity-optimized.ts
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.18

Add Scorecards button to gym dashboard, move filters into scorecard panel

March 13, 2026 at 7:27 PM GMT+0
5bef286
โœจAdded
  • Add Scorecards button to gym dashboard, move filters into scorecard panel
  • Add Scorecards link button at top of standalone gym dashboard page
  • Move season, gym, and worlds filters from scorecards page header into
  • GymScorecard's existing filter sidebar via new headerFilters prop
  • Remove Pro plan badge from scorecards page

Files Changed

Modified (4):
  • ~ src/app/[username]/analyze/gym/[slug]/page.tsx
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/page.tsx
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/scorecards-client.tsx
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.17

Convert Whole Gym page from tabs to single scrollable page

March 13, 2026 at 7:18 PM GMT+0
fe5ccb7
๐Ÿ”„Changed
  • Convert Whole Gym page from tabs to single scrollable page
  • Remove tab navigation and render Overview, Trends, Deductions, and
  • Consistency sections as one continuous page. This gives a better
  • overview experience now that Scorecards has its own dedicated page.

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-dashboard.tsx

Version 0.2.16

Move Scorecards to top-level navigation, remove from Whole Gym tabs

March 13, 2026 at 7:17 PM GMT+0
d97415b
๐Ÿ”„Changed
  • Move Scorecards to top-level navigation, remove from Whole Gym tabs
  • Add "Scorecards" link in the top nav bar (Dashboard | Single Team | Team Group | Whole Gym | Scorecards)
  • Link navigates to the standalone scorecards page for the selected gym
  • Remove Scorecard tab from Whole Gym dashboard (now 4 tabs: Overview, Trends, Deductions, Consistency)
  • Clean up unused GymScorecard import and gymSlug/username props from GymDashboard

Files Changed

Modified (3):
  • ~ src/app/[username]/analyze/gym/[slug]/page.tsx
  • ~ src/components/gym-analysis/gym-dashboard.tsx
  • ~ src/components/my-teams/my-teams-client.tsx

Version 0.2.15

Pass gymSlug and username to GymDashboard in analyze page

March 13, 2026 at 7:02 PM GMT+0
17afcfc
๐Ÿ”„Changed
  • Pass gymSlug and username to GymDashboard in analyze page
  • The "Open Full Scorecards" link was only showing on the standalone gym page
  • because the analyze page's GymDashboard call was missing the gymSlug and
  • username props needed to build the link URL.

Files Changed

Modified (1):
  • ~ src/components/my-teams/my-teams-client.tsx

Version 0.2.14

Add rt_drivers and st_drivers aliases to score mapper for DOD fields

March 13, 2026 at 6:38 PM GMT+0
e2a3ffe
โœจAdded
  • Add rt_drivers and st_drivers aliases to score mapper for DOD fields
  • These keys appear in PDF scorecards from ASC, Spirit Celebration, and
  • other events where the PDF parser produces "rt_drivers"/"st_drivers"
  • instead of "rt_dod"/"st_dod" for tumbling degree-of-difficulty drivers.

Files Changed

Modified (1):
  • ~ src/lib/import/score-mapper.ts

Version 0.2.13

Add standalone scorecards page with saved scorecards & folders

March 13, 2026 at 6:17 PM GMT+0
270e170
โœจAdded
  • Add standalone scorecards page with saved scorecards & folders
  • Add ScorecardFolder and SavedScorecard database models with nested folder support
  • Add CRUD API routes for scorecards and folders (/api/scorecards, /api/scorecards/folders)
  • Add last-opened scorecard endpoint for auto-restore on page load
  • Create standalone scorecards page at /[username]/analyze/gym/[slug]/scorecards
  • Add ScorecardLibrary sidebar component with folder tree, save/load/rename/delete

Files Changed

Created (8):
  • + src/app/[username]/analyze/gym/[slug]/scorecards/page.tsx
  • + src/app/[username]/analyze/gym/[slug]/scorecards/scorecards-client.tsx
  • + src/app/api/scorecards/[id]/route.ts
  • + src/app/api/scorecards/folders/[id]/route.ts
  • + src/app/api/scorecards/folders/route.ts
  • + src/app/api/scorecards/last-opened/route.ts
  • + src/app/api/scorecards/route.ts
  • + src/components/gym-analysis/scorecard-library.tsx
Modified (12):
  • ~ prisma/schema.prisma
  • ~ src/app/[username]/analyze/gym/[slug]/page.tsx
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/page.tsx
  • ~ src/app/[username]/analyze/gym/[slug]/scorecards/scorecards-client.tsx
  • ~ src/app/api/scorecards/[id]/route.ts
  • ~ src/app/api/scorecards/folders/[id]/route.ts
  • ~ src/app/api/scorecards/folders/route.ts
  • ~ src/app/api/scorecards/last-opened/route.ts
  • ~ src/app/api/scorecards/route.ts
  • ~ src/components/gym-analysis/gym-dashboard.tsx
  • ~ src/components/gym-analysis/gym-scorecard.tsx
  • ~ src/components/gym-analysis/scorecard-library.tsx

Version 0.2.12

Fix gym scorecard header rendering and readability

March 13, 2026 at 5:53 PM GMT+0
ce94d9d
๐Ÿ›Fixed
  • Fix gym scorecard header rendering and readability
  • Split sticky colspan cells in group/full-name header rows to prevent
  • blacked-out rendering artifacts from sticky positioning on multi-span cells
  • Increase full-name header font size from 8px to 10px for readability
  • Widen max column width from 48px to 60px for longer category names

Files Changed

Modified (1):
  • ~ src/components/gym-analysis/gym-scorecard.tsx

Version 0.2.11

Improve scraper pipeline: gym name splitting, level parsing regex, program filter sweep, and normalized competition search

March 13, 2026 at 5:51 PM GMT+0
e9e52f8
๐Ÿ”„Changed
  • Improve scraper pipeline: gym name splitting, level parsing regex, program filter sweep, and normalized competition search
  • Scraper: split program_name into gym+team using known prefixes and dash separators
  • Scraper: program filter sweep to catch teams hidden behind pagination
  • Scraper: retry logic for filter sweep queries
  • Scraper: /api/validate endpoint for data validation
  • Import: cleanGymName() strips team suffix from gym names

Files Changed

Created (9):
  • + scripts/check-jobs.ts
  • + scripts/maintenance/cleanup-gym-names-r2.ts
  • + scripts/maintenance/cleanup-gym-names.ts
  • + scripts/maintenance/data-quality-report.ts
  • + scripts/maintenance/delete-orphan-teams.ts
  • + scripts/maintenance/find-orphan-dash-gyms.ts
  • + scripts/maintenance/find-singleton-orphans.ts
  • + scripts/maintenance/inspect-topgun.ts
  • + scripts/rescrape-gym.ts
Modified (18):
  • ~ scripts/check-jobs.ts
  • ~ scripts/import/import-may-2025-fuzzy.ts
  • ~ scripts/import/import-may-2025-optimized.ts
  • ~ scripts/import/import-nca-2025.ts
  • ~ scripts/import/import-varsity-events-fuzzy-complete.ts
  • ~ scripts/import/import-varsity-events-production.ts
  • ~ scripts/import/import-varsity-events.ts
  • ~ scripts/import/import-varsity-optimized.ts
  • ~ scripts/maintenance/cleanup-gym-names-r2.ts
  • ~ scripts/maintenance/cleanup-gym-names.ts
  • ~ scripts/maintenance/data-quality-report.ts
  • ~ scripts/maintenance/delete-orphan-teams.ts
  • ~ scripts/maintenance/find-orphan-dash-gyms.ts
  • ~ scripts/maintenance/find-singleton-orphans.ts
  • ~ scripts/maintenance/inspect-topgun.ts
  • ~ scripts/migrations/fix-division-levels.ts
  • ~ scripts/rescrape-gym.ts
  • ~ src/components/competitions/competitions-list-client.tsx

Version 0.2.10

Handle status poll timeouts gracefully in scrape job processor

March 13, 2026 at 5:42 PM GMT+0
686daaa
๐Ÿ”„Changed
  • Handle status poll timeouts gracefully in scrape job processor
  • Previously a single timeout on the /api/status endpoint would fail the
  • entire scrape job. Now tolerates up to 10 consecutive poll errors before
  • giving up, which handles the case where the scraper is busy processing
  • large events.

Files Changed

Modified (1):
  • ~ src/lib/scrape-job-processor.ts

Version 0.2.9

Add data quality overhaul: validation framework, rescrape orchestrator, and auto-changelog

March 13, 2026 at 5:32 PM GMT+0
da46cff
โœจAdded
  • Add data quality overhaul: validation framework, rescrape orchestrator, and auto-changelog
  • CompetitionValidation model + 7 automated post-import checks
  • Rescrape orchestrator for full 2020-present month-by-month re-scraping
  • Python scraper improvements: gym/team name splitting, program filter sweep, retry logic
  • Validation API endpoint for Python scraper
  • Auto-changelog hook for automatic version bumping on every commit

Files Changed

Created (2):
  • + scripts/auto-changelog.sh
  • + src/lib/rescrape-orchestrator.ts
Modified (7):
  • ~ prisma/schema.prisma
  • ~ python-scraper/main.py
  • ~ python-scraper/scraper/varsity_api_scraper.py
  • ~ scripts/auto-changelog.sh
  • ~ scripts/import/review-import-worker.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/rescrape-orchestrator.ts

Version 0.2.8

Scraper & import pipeline improvements, schedule review system

February 20, 2026 at 6:40 PM GMT+0
3950f3f
โœจAdded
  • Inline schedule entries preview in event review โ€” expand to see Division, Gym, Team, Time, Day, Session without leaving the page
  • Schedule review & editing admin pages with approve/reject workflow
  • Pending schedules list for quick admin triage
  • Enhanced Python scraper with improved pagination and data extraction
  • Schedule import pipeline now handles staged entries for preview before commit
๐Ÿ”„Changed
  • Import pipeline improvements for better gym and team matching accuracy
  • Schedule import logic expanded with smarter conflict resolution
  • Competition performances component updated with improved display
๐Ÿ›Fixed
  • Removed problematic Division unique constraint that caused import conflicts
  • Scraper dashboard and event selector UI refinements

Files Changed

Created (7):
  • + src/app/admin/schedules/[scheduleId]/review/page.tsx
  • + src/app/api/admin/schedules/[scheduleId]/approve/route.ts
  • + src/app/api/admin/schedules/[scheduleId]/reject/route.ts
  • + src/app/api/admin/schedules/[scheduleId]/route.ts
  • + src/app/api/admin/schedules/pending/route.ts
  • + src/components/admin/schedules/pending-schedules-list.tsx
  • + src/components/admin/schedules/schedule-review-page.tsx
Modified (12):
  • ~ prisma/schema.prisma
  • ~ python-scraper/scraper/varsity_api_scraper.py
  • ~ src/app/api/admin/scraper/jobs/[id]/review/[eventIndex]/route.ts
  • ~ src/app/api/admin/scraper/schedule-intake/route.ts
  • ~ src/components/admin/scraper/event-selector.tsx
  • ~ src/components/admin/scraper/review/event-detail.tsx
  • ~ src/components/admin/scraper/scraper-dashboard.tsx
  • ~ src/components/competitions/competition-performances.tsx
  • ~ src/lib/import/gym-matcher.ts
  • ~ src/lib/import/index.ts
  • ~ src/lib/import/schedule-import.ts
  • ~ src/lib/import/team-matcher.ts

Version 0.2.7

Admin feedback system, notifications, and map improvements

February 11, 2026 at 6:45 PM GMT+0
0e5b61e
โœจAdded
  • Admin feedback dashboard at /admin/feedback with stats cards (New, In Review, Resolved)
  • User feedback submission dialog accessible from navbar
  • Real-time notification system with unread count badge
  • Email notifications for feedback replies using Resend
  • Two-way messaging between users and admins on feedback items
  • Feedback categorization (General, Request Team/Gym, Correct Scores, Upload Logo)
  • Status tracking workflow (New โ†’ In Review โ†’ Resolved)
  • Sortable table columns on feedback list (Date, User, Type, Subject, Status)
  • Click column headers to toggle ascending/descending sort with visual indicators
  • Search and filter functionality for feedback management
  • Login count tracking in admin analytics dashboard
  • Follows column in admin analytics to track user engagement
  • Graceful map fallback UI for invalid/expired Mapbox tokens
  • Static map placeholder on homepage for local development
๐Ÿ”„Changed
  • Homepage map replaced with static placeholder to eliminate API errors in development
  • Map shows attractive gradient with icon and descriptive text
  • Production environment continues to use real interactive map with valid token
๐Ÿ›Fixed
  • React key prop warning by using Fragment with proper keys in feedback list
  • Mapbox 403 Forbidden errors on homepage from expired/invalid token
  • Geocoding API errors by detecting token failures and showing fallback UI
  • Console errors from map tile requests with domain-restricted tokens

Files Changed

Created (25):
  • + MESSAGING_SYSTEM_IMPLEMENTATION.md
  • + src/app/admin/feedback/page.tsx
  • + src/app/api/admin/feedback/route.ts
  • + src/app/api/admin/feedback/[id]/route.ts
  • + src/app/api/admin/feedback/[id]/message/route.ts
  • + src/app/api/admin/feedback/[id]/messages/route.ts
  • + src/app/api/feedback/route.ts
  • + src/app/api/notifications/route.ts
  • + src/app/api/notifications/[id]/read/route.ts
  • + src/app/api/notifications/unread-count/route.ts
  • + src/components/admin/feedback/feedback-list.tsx
  • + src/components/admin/feedback/message-thread.tsx
  • + src/components/admin/feedback/send-message-form.tsx
  • + src/components/feedback/feedback-button.tsx
  • + src/components/feedback/feedback-dialog.tsx
  • + src/components/navbar/notification-bell.tsx
  • + src/components/notifications/notification-item.tsx
  • + src/components/notifications/notification-list.tsx
  • + src/lib/emails/feedback-reply-email.ts
  • + src/lib/notifications.ts
  • + src/types/feedback.ts
  • + src/types/notification.ts
  • + ADMIN_ANALYTICS_LOGIN_TRACKING_FIX.md
  • + scripts/migrations/initialize-login-counts.ts
  • + scripts/verify-analytics-columns.ts
Modified (10):
  • ~ prisma/schema.prisma
  • ~ src/app/admin/page.tsx
  • ~ src/app/notifications/page.tsx
  • ~ src/components/navbar.tsx
  • ~ src/components/gyms/gyms-map.tsx
  • ~ src/components/home/gyms-map-section.tsx
  • ~ src/app/admin/analytics/page.tsx
  • ~ src/components/admin/analytics/users-table.tsx
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/lib/auth.ts

Version 0.2.6

Competition schedules feature with PDF import and mobile optimization

February 11, 2026 at 4:00 AM GMT+0
5bb93fa
โœจAdded
  • Public competition schedules browser at /schedules with advanced filtering
  • User schedule management at /[username]/schedules for saved custom schedules
  • Schedule PDF import system with timezone-aware parsing (Eastern Time)
  • Custom schedule creator - select specific teams/entries to build personalized schedules
  • Multi-level filtering: gym, team, level, age, size, session, date, and location
  • Schedule grouping and sub-grouping (by stage, team, gym, level, age, size)
  • Collapsible day groups and secondary groups for better mobile navigation
  • Manual timezone calculation for consistent Eastern Time display across all browsers
  • Schedules navigation link in sidebar and mobile drawer
  • Schedules CTA section on home page with dual CTAs for logged out users
  • Signup prompt banner on schedule pages for non-authenticated users
  • date-fns-tz package for reliable timezone handling
๐Ÿ”„Changed
  • Mobile schedule cards redesigned: 50% more compact layout
  • Reduced card padding from 24px to 12px for tighter mobile display
  • Location field moved inline with gym name to save vertical space
  • Smaller text sizes and tighter element spacing on mobile cards
  • Home page pillar section updated to support dual CTAs
  • Navigation sidebar now shows 'Schedules' link dynamically based on auth state
  • Mobile users can now see 2-3 schedule cards per screen instead of 1-1.5
๐Ÿ›Fixed
  • Timezone display inconsistency - all times now show in Eastern Time regardless of user's local timezone
  • Browser timezone APIs unreliability - replaced with manual UTC offset calculation
  • Mobile schedule grouping and sub-grouping not working (added tertiary group support)
  • Schedule cards too large on mobile - reduced height by 50%
  • Missing collapsible functionality on mobile grouped schedules

Files Changed

Created (22):
  • + src/app/[username]/schedules/page.tsx
  • + src/app/schedules/page.tsx
  • + src/app/schedules/[slug]/page.tsx
  • + src/app/api/schedules/route.ts
  • + src/app/api/schedules/[slug]/entries/route.ts
  • + src/app/api/schedules/[slug]/filter-options/route.ts
  • + src/app/api/schedules/[slug]/metadata/route.ts
  • + src/app/api/user-schedules/route.ts
  • + src/app/api/user-schedules/[id]/route.ts
  • + src/components/schedules/schedule-table.tsx
  • + src/components/schedules/schedule-card.tsx
  • + src/components/schedules/grouped-schedule-table.tsx
  • + src/components/schedules/grouped-schedule-cards.tsx
  • + src/components/schedules/schedule-viewer.tsx
  • + src/components/schedules/schedule-filters-sidebar.tsx
  • + src/components/schedules/schedule-filters-sheet.tsx
  • + src/components/schedules/save-schedule-dialog.tsx
  • + src/components/schedules/saved-schedules-list.tsx
  • + src/components/schedules/searchable-checkbox-list.tsx
  • + src/components/schedules/signup-prompt-banner.tsx
  • + src/components/ui/scroll-area.tsx
  • + scripts/import/import-schedule-pdf.ts
Modified (12):
  • ~ package.json
  • ~ package-lock.json
  • ~ src/components/dashboard/sidebar-nav.tsx
  • ~ src/components/navbar.tsx
  • ~ src/app/page.tsx
  • ~ src/components/home/pillar-section.tsx
  • ~ src/components/home/pillar-visuals.tsx
  • ~ src/components/schedules/schedule-table.tsx
  • ~ src/components/schedules/schedule-card.tsx
  • ~ src/components/schedules/grouped-schedule-table.tsx
  • ~ src/components/schedules/grouped-schedule-cards.tsx
  • ~ src/components/schedules/schedule-viewer.tsx

Version 0.2.5

Groups dashboard redesign and multi-day competition date fixes

February 10, 2026 at 2:30 AM GMT+0
de77096
โœจAdded
  • Root-level /groups redirect page for proper authenticated routing
  • Zoom functionality on comparison line chart with interactive Brush component
  • Column sorting with visual indicators (arrows) on all comparison table columns
  • Custom tooltip for line chart showing team colors, C.PS scores, competition names, and rounds
  • Year display on line chart X-axis dates (e.g., 'Jan 31, 2025')
  • performedAt field to Performance model for accurate multi-day competition dates
  • Database index on performedAt for efficient date-based queries
๐Ÿ”„Changed
  • Replaced bar and radar charts with continuous line chart showing C.PS progression over time
  • Comparison table now shows only C.PS in collapsed view (removed ES, PS, Total columns)
  • Column order updated to: RS โ†’ DED โ†’ C.PS โ†’ detailed score columns
  • Each score component displayed as single sortable column instead of combined Diff/Exec
  • Line chart maximized to fill full section width (500-600px height)
  • Y-axis domain adjusted to actual data range with 5% padding for better visualization
  • Sidebar sticky behavior with max-height constraint and internal scrolling
  • Rankings now based on C.PS (calculatedPerformanceScore) instead of Total score
  • Team page Athletes section moved to bottom, Division History section removed
  • Chart displays use performedAt for accurate dates on multi-day competitions
๐Ÿ›Fixed
  • Avatar component missing 'use client' directive causing page crashes and 404 errors
  • Multi-day competition dates showing duplicates (now displays unique performedAt per round)
  • Missing calculatedPerformanceScore in analysis panel scoreFields array for proper averaging
  • Missing performedAt field in groups page performance data transformation
  • Date formatting with UTC timezone to prevent timezone shifting issues
  • Groups page 404 error with proper authentication and redirect handling
  • Recent performances showing incorrect dates due to missing performedAt data
  • Line chart width constraint preventing full section display

Files Changed

Created (2):
  • + src/app/groups/page.tsx
  • + scripts/fix-aca-2025-dates.js
Modified (17):
  • ~ prisma/schema.prisma
  • ~ src/middleware.ts
  • ~ src/lib/auth.ts
  • ~ src/lib/utils.ts
  • ~ src/types/next-auth.d.ts
  • ~ src/types/charts.ts
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/app/[username]/groups/page.tsx
  • ~ src/components/ui/avatar.tsx
  • ~ src/components/app-shell.tsx
  • ~ src/components/my-teams/analysis-panel.tsx
  • ~ src/components/compare/comparison-charts.tsx
  • ~ src/components/compare/comparison-table.tsx
  • ~ src/components/teams/team-ps-chart.tsx
  • ~ src/components/teams/team-ps-chart-wrapper.tsx
  • ~ src/components/teams/score-trend-chart.tsx
  • ~ src/components/teams/competition-performance-table.tsx

Version 0.2.4

Account switcher, email verification, and UI enhancements

February 9, 2026 at 3:15 PM GMT+0
bba9135
โœจAdded
  • Twitter-style instant account switching without re-authentication
  • Account switcher dialog accessible from navbar user menu
  • Account storage system with session token management (max 5 accounts)
  • Email verification system with verification badges and banners
  • Email verification API endpoints (verify-email, resend-verification)
  • Account sync component for multi-device session management
  • Session token API endpoint for secure token retrieval
  • Verification banner on unverified accounts
  • Profile creation utility library for streamlined onboarding
  • Feature gates system for tier-based feature access
  • Season filter UI component for unified filtering
  • Max points calculation library for score normalization
๐Ÿ”„Changed
  • Login page enhanced with account switcher integration
  • Signup flow updated to support account switching
  • Onboarding profile page streamlined with new utilities
  • Dashboard layout updated with account sync component
  • Navbar user menu now includes account switcher option
  • Auth system extended to store session tokens in JWT
  • Registration endpoint enhanced with email verification
  • User model extended with email verification fields
๐Ÿ›Fixed
  • Competition performances component data loading and error handling
  • Explore results component search and filtering logic
  • Gym PS chart data fetching and display issues
  • Team PS chart rendering and data transformation
  • Competition performance table sorting and display
  • Admin analytics users table pagination and filtering
  • Performance API routes authorization and data validation

Files Changed

Created (14):
  • + src/app/api/auth/get-session-token/route.ts
  • + src/app/api/auth/switch-account/route.ts
  • + src/app/api/auth/verify-email/route.ts
  • + src/app/api/auth/resend-verification/route.ts
  • + src/app/verify-email/page.tsx
  • + src/components/account-sync.tsx
  • + src/components/verification-banner.tsx
  • + src/components/ui/season-filter.tsx
  • + src/lib/email-verification.ts
  • + src/lib/feature-gates.ts
  • + src/lib/max-points.ts
  • + src/lib/profile-creation.ts
  • + docs/EMAIL_VERIFICATION.md
  • + docs/EMAIL_TEMPLATE_CUSTOMIZATION.md
Modified (19):
  • ~ prisma/schema.prisma
  • ~ src/app/api/auth/register/route.ts
  • ~ src/app/api/performances/[id]/route.ts
  • ~ src/app/api/performances/route.ts
  • ~ src/app/dashboard/layout.tsx
  • ~ src/app/login/page.tsx
  • ~ src/app/onboarding/profile/page.tsx
  • ~ src/app/signup/page.tsx
  • ~ src/components/account-switcher/account-switcher-dialog.tsx
  • ~ src/components/admin/analytics/users-table.tsx
  • ~ src/components/competitions/competition-performances.tsx
  • ~ src/components/explore/explore-results.tsx
  • ~ src/components/gyms/gym-ps-chart.tsx
  • ~ src/components/navbar.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/components/teams/team-ps-chart.tsx
  • ~ src/lib/account-storage.ts
  • ~ src/lib/auth.ts
  • ~ src/types/next-auth.d.ts

Version 0.2.3

Prisma relation naming fixes and type safety improvements

February 9, 2026 at 1:30 AM GMT+0
6304b2c
๐Ÿ›Fixed
  • 180+ TypeScript compilation errors from Prisma Client relation naming conventions
  • All Prisma relation names capitalized in includes/selects (Team, Gym, Person, etc.)
  • Field IDs normalized to lowercase camelCase (teamId, personId, etc.)
  • Added required id and updatedAt fields to all create operations
  • Data transformation for components expecting lowercase property names
  • Complex Prisma relation names in self-referential models
โœจAdded
  • npm run type-check script for quick TypeScript validation
  • GitHub Actions CI workflow for automated type checking on PRs
  • Comprehensive PRISMA_CONVENTIONS.md documentation guide
  • Documentation of all Prisma naming patterns and transform strategies
  • Troubleshooting guide for common Prisma type errors
๐Ÿ”„Changed
  • Standardized all Prisma queries to use capitalized relation names
  • Implemented data transformation layer for client components
  • Enhanced build process to include Prisma generate automatically

Files Changed

Created (2):
  • + .github/workflows/type-check.yml
  • + docs/PRISMA_CONVENTIONS.md
Modified (26):
  • ~ package.json
  • ~ src/app/admin/gyms/page.tsx
  • ~ src/app/admin/performances/page.tsx
  • ~ src/app/admin/users/page.tsx
  • ~ src/app/api/admin/users/[id]/route.ts
  • ~ src/app/api/admin/users/route.ts
  • ~ src/app/api/competitions/[id]/route.ts
  • ~ src/app/api/competitions/route.ts
  • ~ src/app/api/gyms/[id]/route.ts
  • ~ src/app/api/gyms/route.ts
  • ~ src/app/api/teams/route.ts
  • ~ src/app/competitions/[id]/page.tsx
  • ~ src/app/competitions/page.tsx
  • ~ src/app/gyms/[id]/page.tsx
  • ~ src/app/gyms/page.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/people/page.tsx
  • ~ src/app/search/page.tsx
  • ~ src/app/teams/[id]/page.tsx
  • ~ src/app/teams/page.tsx
  • ~ src/app/settings/page.tsx
  • ~ src/app/onboarding/profile/page.tsx
  • ~ src/components/competitions/competitions-list-client.tsx
  • ~ src/components/gyms/gym-teams-section.tsx
  • ~ src/components/dashboard/feed-list.tsx
  • ~ src/lib/analytics/division-benchmarks.ts

Version 0.2.2

Blog system, username search, and profile enhancements

February 8, 2026 at 7:00 PM GMT+0
4d51bbd
โœจAdded
  • Complete blog system with MDX support and React component embedding
  • Admin interface for creating, editing, and managing blog posts
  • Public blog listing page with search, filtering by category/tag
  • Blog post pages with SEO optimization and Open Graph metadata
  • Username search functionality in main search and people search
  • Profile picture upload system separate from cover photos
  • Scalloped circle tier badge design with enhanced visual hierarchy
  • Blog link in footer navigation for easy access
๐Ÿ”„Changed
  • Profile page mobile layout and module ordering improved
  • Competition performance table simplified (removed redundant Total column)
  • Tier badge design updated to scalloped circle style
๐Ÿ›Fixed
  • Hydration error in VerificationBadgeIcon component
  • Profile page loading performance optimized
  • Admin permissions for profile picture management

Files Changed

Created (23):
  • + BLOG_SYSTEM.md
  • + content/blog/welcome-to-cheer-data-blog.mdx
  • + content/blog/understanding-performance-metrics.mdx
  • + content/blog/getting-started-guide.mdx
  • + src/app/blog/page.tsx
  • + src/app/blog/[slug]/page.tsx
  • + src/app/admin/blog/page.tsx
  • + src/app/admin/blog/new/page.tsx
  • + src/app/admin/blog/[slug]/edit/page.tsx
  • + src/app/api/admin/blog/save/route.ts
  • + src/app/api/admin/blog/[slug]/route.ts
  • + src/components/blog/blog-card.tsx
  • + src/components/blog/blog-filters.tsx
  • + src/components/blog/blog-post-layout.tsx
  • + src/components/blog/author-card.tsx
  • + src/components/admin/blog/blog-editor.tsx
  • + src/components/admin/blog/delete-post-button.tsx
  • + src/lib/blog.ts
  • + src/types/blog.ts
  • + mdx-components.tsx
  • + src/app/api/person/profile-picture/route.ts
  • + src/components/profile/profile-picture-upload.tsx
  • + src/lib/roles.ts
Modified (14):
  • ~ src/app/layout.tsx
  • ~ src/app/people/[username]/page.tsx
  • ~ src/app/api/search/route.ts
  • ~ src/app/api/people/search/route.ts
  • ~ src/components/navbar.tsx
  • ~ src/components/home-search.tsx
  • ~ src/components/teams/competition-performance-table.tsx
  • ~ src/components/ui/verification-badge-icon.tsx
  • ~ src/components/profile/tier-verification-badge.tsx
  • ~ src/components/profile/profile-photo-manager.tsx
  • ~ src/components/profile/profile-card-clean.tsx
  • ~ src/app/api/person/photos/route.ts
  • ~ next.config.js
  • ~ package.json

Version 0.2.1

Profile photo upgrades and explore polish

February 6, 2026 at 10:12 PM GMT+0
0afef81
โœจAdded
  • Profile photo management with cropping and aspect ratio controls
  • Tier badges on profile headers and tier-aware avatars
  • City display for gym/team explore cards when available
  • Athlete avatars and alphabetized athlete lists on team/gym pages
  • PersonPhoto model to support multi-photo profiles
๐Ÿ”„Changed
  • Profile header layout refinements for clearer identity and actions
  • People list uses photoUrl for more consistent profile imagery
๐Ÿ›Fixed
  • Competition performances payload serialization for detail pages
  • Profile admin form twitter handle typo
  • Tier gating and typing issues in profile photo flows

Version 0.2.0

Major Feature Expansion - Monetization, Exports, Glossary

February 5, 2026 at 6:00 AM GMT+0
8949a30
โœจAdded
  • 4-tier monetization system (Novice/Prep/Elite/Pro) with feature gating
  • PDF export for team comparisons and profile reports (Prep tier)
  • Division benchmarks analytics API and Prep-tier access
  • Public glossary with admin management and supplemental terms
  • Admin tools for profile photos, score maximums, and analytics
๐Ÿ”„Changed
  • Homepage redesign and navigation updates for clearer conversion flow
  • People/teams/gyms views with richer filters and profile visuals
๐Ÿ›Fixed
  • Production build issues across API routes and PDF rendering
  • TypeScript and ESLint errors in UI and export flows

Version 0.1.0

Initial Release - Analytics Dashboard

February 4, 2026 at 6:00 AM GMT+0
695a050
โœจAdded
  • Public changelog page at `/changelog` with version history
  • Version display in footer (v0.1.0) with link to changelog
  • Changelog data structure in CHANGELOG.json with full type safety
  • Comprehensive user analytics dashboard at `/admin/analytics`
  • Login tracking system with `lastSeenAt` field in User model
  • 10 key metrics including WAU, conversion rate, and retention
  • Daily signups bar chart showing last 30 days of user growth
  • Tier growth stacked area chart for free vs paid user trends
  • Throttled activity tracking (updates once per hour max)
  • 5-minute API response cache for analytics endpoint
  • Reusable metric card component for admin dashboards
  • Helper script for adding changelog entries (npm run changelog:helper)
๐Ÿ”„Changed
  • Updated JWT callback to include lastSeenAt tracking
  • Enhanced Prisma schema with user activity tracking
  • Added index on lastSeenAt field for query performance
๐Ÿ›Fixed
  • ESLint error with apostrophes in landing page copy
  • Profile picture display issues in settings
  • Score maximums API routes for static generation

Files Changed

Created (11):
  • + CHANGELOG.json
  • + CHANGELOG_GUIDE.md
  • + src/app/changelog/page.tsx
  • + src/types/changelog.ts
  • + scripts/add-changelog-entry.ts
  • + src/types/analytics.ts
  • + src/app/api/admin/analytics/users/route.ts
  • + src/app/admin/analytics/page.tsx
  • + src/components/admin/analytics/metric-card.tsx
  • + src/components/admin/analytics/daily-signups-chart.tsx
  • + src/components/admin/analytics/tier-growth-chart.tsx
Modified (10):
  • ~ prisma/schema.prisma
  • ~ src/lib/auth.ts
  • ~ src/types/next-auth.d.ts
  • ~ src/app/admin/page.tsx
  • ~ src/app/layout.tsx
  • ~ src/components/navbar.tsx
  • ~ package.json
  • ~ README.md
  • ~ docs/CLAUDE.md
  • ~ DOCUMENTATION_INDEX.md

About This Changelog

This changelog follows the format inspired by Keep a Changelog. All notable changes to FullOut are documented here.

Each release includes the version number, release date with timezone, git commit hash, and a detailed summary of all changes organized by type.