FullOut

Changelog

Track all updates, improvements, and fixes to FullOut

Latest

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.