College-football scores, weekly ACC and Top 25 views, and optional Web Push alerts.
The migration in this branch targets Cloudflare Workers, using the free provider address https://saturday-signal.scythe-wildflower.workers.dev. A purchased domain is not required. GitHub is the source of truth for issues, reviews, tests, tags, and releases.
The previous Sites publication remains at https://saturday-signal.mtorbert.chatgpt.site until the Cloudflare release is verified. This branch does not deploy or disable either site by itself.
Use Node.js 22.13 or newer. CI uses Node 22.
npm ci
npm run dev
export SOURCE_COMMIT=$(git rev-parse HEAD)
npm run typecheck
npm test
npm run test:runtime
npm run deploy:check
npm run deploy:alerts -- --dry-run
npm run typecheck first confirms that the committed worker-configuration.d.ts still matches wrangler.jsonc, then runs the plain TypeScript check. That file is generated by the pinned Wrangler (npx --no-install wrangler types) and provides the Workers runtime declarations, including the cloudflare:workers module, plus the website’s actual bindings; regenerate and commit it after changing wrangler.jsonc. The website declares only ASSETS; the optional D1 starter example types its own binding locally. npm test builds the app and runs the regression suite. npm run test:runtime then starts the compiled Worker locally and checks routing, assets, and build identity without requesting live scores. Deployment dry runs validate the actual compiled website and the alert Worker without publishing or accessing the production database. The default development server is at http://localhost:5173.
wrangler.jsonc owns website configuration. The Cloudflare Vite plugin emits the deployable Worker, static assets, and a generated Wrangler configuration in dist/server/wrangler.json; deployment commands explicitly require that compiled configuration. Always rebuild after changing environment or source. The website has no database binding. Alerts retain their existing separate Worker and D1 database.
The existing repository-wide ESLint backlog is tracked in issue #1. The new CI checks run the build, tests, and deployment validation; they do not claim that the unrelated lint backlog is fixed.
See the release guide for GitHub environment setup, preview validation, production releases, verification, and rollback. GitHub Actions run tests on PRs. Production deployment is triggered by publishing a stable GitHub release, not by merging a PR.
The application reports its version and exact built source commit at /api/health. The release workflow checks both after deployment, checks static assets and the score API, and checks alert readiness from the old and new production addresses.
The existing alert service remains https://saturday-signal-alerts.scythe-wildflower.workers.dev. Its versioned configuration reuses the current database and cron. Existing VAPID secrets and notification history must be preserved. See alert-service details.
The old and new production addresses are explicitly allowed during migration. Arbitrary Workers subdomains and preview addresses are not allowed. The preview website therefore validates scores and page behavior without enrolling devices in the production alert service.
Browser settings and push subscriptions belong to the site address. Users moving to the Cloudflare address need to reopen or install that app and enable notifications there; existing subscriptions cannot be silently transferred. Disable alerts in the old installation before enabling the new one to avoid receiving notifications from both installations. Actual phone delivery must be verified on a device after the cutover.