Repository navigation
feat(site): checkmydata.ai is a static site on Cloudflare; hosting costs nothing - #443
Merged
Merged
Conversation
…sts nothing The site's own Heroku dyno was the last running cost. `npm run build:site` (SITE_EXPORT=1) builds a static export served by the Cloudflare Worker `checkmydata-site` (free plan); the Worker runs only for /api/* and serves the waitlist, rate-limited by a Cloudflare binding. Security headers and the retired-route redirects moved to public/_headers and public/_redirects, which a static export needs. Both Heroku apps now run 0 dynos. Deployed and cut over already: route checkmydata.ai/* -> checkmydata-site (the apex record is proxied, so no DNS change and no downtime); a test sign-up sent from production reached contact@checkmydata.ai. Fixes a regression from #442: the waitlist redirects lived in next.config.ts for every build, so a self-hosted /login redirected to a waitlist. A plain `npm run build` is the standalone product again, with its headers and no redirects; /dashboard/<id> keeps its URL through a rewrite to the one page the export prerenders. - deploy.yml: manual, Cloudflare; narrow tokens (account Worker scripts; one zone's Worker routes); verifies the live domain answers as only the Worker can. - CI builds the export too, so a page that cannot be exported fails a PR. - Tests: worker handler (18), static-config consistency, deploy pipeline guards rewritten for Cloudflare; scenario citations repointed to DashboardView.tsx. Brand-Case: site hosting moved to zero cost with no downtime Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
npm run build:site(SITE_EXPORT=1) → static export, served by Cloudflare Workercheckmydata-site(free plan). Worker runs only for/api/*: the waitlist (Resend →contact@checkmydata.ai), rate-limited by a Cloudflare binding.public/_headers,public/_redirects.deploy.yml: manual, Cloudflare, narrow tokens; verifies the live domain answers as only the Worker can.npm run buildis the standalone product again (headers, no redirects);/dashboard/<id>keeps its URL via a rewrite.Already live
Deployed from this branch and cut over: route
checkmydata.ai/*→checkmydata-site(apex is proxied — no DNS change, no downtime). Both Heroku apps at 0 dynos. A test sign-up sent from production reachedcontact@checkmydata.ai.Checks run
npx tsc --noEmit,npx eslint . --max-warnings=0— cleannpx vitest run— 888/888npm run build:site— 17 pages exported (4.1 MB)test_deploy_pipeline_can_fail.py,test_ci_covers_every_pull_request.py,test_ux_scenarios.py,test_the_ux_base_checks_all_three_documents.py— 37/37; ruff clean/200,/login→ 307/#waitlist,/api/deploy-probe→ Worker JSON 404, empty waitlist POST → 422, CSP/HSTS/X-Frame-Options present🤖 Generated with Claude Code