Repository navigation
Integrate TimeKeeper at /exam-countdown with guarded migration - #73
Merged
Merged
Conversation
kewonit
marked this pull request as ready for review
October 9, 2026 18:49
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.
TimeKeeper now runs inside Deetnuts' existing Next.js application at
/exam-countdown, preserving the confirmed productionVersion-3source (8cb737981c61f06e7b0baca248f7e237c763abd4): 58 exams, 13 categories, custom countdowns, themes, session selection, fullscreen, sharing, Picture-in-Picture and the study map.Public pages are static and cacheable with final production canonicals, structured data and a sitemap in Deetnuts' index. Fonts, styles, themes and PWA caches are scoped to the feature. The existing Supabase backend is retained through dedicated public runtime configuration and one feature CSP; Deetnuts consent and analytics are reused. Navigation includes the feature and a return link.
The old-origin helper transfers saved countdowns, theme and avatar seed through private, hashed, single-use PocketBase tickets expiring after 15 minutes. Original browser data remains intact and JSON recovery is available. The additive collection and backend hooks prevent public collection access, replay and concurrent redemption. PocketBase 0.40.5 resolves the image's blocking Go security findings.
The compatibility service is maintained here and defaults to serving the preserved old deployment. It provides direct redirects for 74 pages and seven historical aliases, query/fragment preservation, accurate 404/410 responses, a timed non-cacheable teaching canary and retained helpers/assets. Only the two import-helper paths are currently bound; existing old page URLs remain unchanged. The runbook, measured capacity runner, evidence guards and pinned compatible rollback protect the phased move.
Validation:
a871ae8dd5eeb6bf5d97692fe16344a85bdc2e26passed all 74 routes, 38 assets and existing production checks publicly, including canonical/content/CSP/indexability/sitemap/cache checks.The native integration is live on the existing Droplet using the normal Deetnuts blue/green workflow. No new Droplet or live-host capacity load was created. Full source history, hosting records, pinned source fallback and encrypted offline recovery are preserved. A scoped Cloudflare cache exception keeps service-worker updates fresh.
The clean 24-hour observation began
2026-10-09T18:30:53Zafter recovery verification. The 30-minute teaching trial, actual HTTP/HTTPS one-hop verification, permanent redirects and Search Console move remain gated. Retire/disconnect/archive Timekeeper only after at least 30 measured stable days; retain old DNS/TLS/redirects/imports indefinitely. Repository merge does not open these traffic gates. The user approved an hourly follow-up to finish these measured rollout stages, changing to daily monitoring after permanent cutover.See the migration runbook and captured preflight records.