06

Migration plan

Sequential phases, each gating the next. Total 260–320 hours across 10–12 calendar weeks at visual parity. A design refresh layered on top runs 400–520 hours; that is a separate decision and should not be bundled into security remediation.

  1. 001 week

    Security due diligence

    Trust documentation to Allison and the BAA question answered, which fixes the build tier. File the vendor document-access requests immediately — they are the long-lead item.

    ~8 hrs

  2. 012 weeks

    Foundation

    Astro scaffold in SmartData's GitHub organisation with branch protection and required reviews. Design tokens harvested from live CSS. Navigation, mega-menu and footer as components. Sanity project with schemas for all nine collections. Vercel project with SSO-gated previews. Cloudflare zone with the WAF baseline in place from day one.

    ~55 hrs

  3. 022 weeks

    Content migration

    Export script from the current CMS API into Sanity: nine collections, 268 records, asset re-hosting, rich text conversion and reference wiring. Then an editorial QA pass across the 213 resource records — where this phase actually spends its hours.

    ~50 hrs

  4. 033–4 weeks

    Templates and integrations

    Eleven static pages, nine collection templates, two filtered listing pages, Pagefind search, the events map with build-time geocoding, HubSpot form embeds and the newsletter API, and the six WebGL heroes ported.

    ~105 hrs

  5. 041 week

    Security hardening

    Nonce CSP with no 'unsafe-inline' and no 'unsafe-eval', verified route by route. Full header set. SRI hashes on remaining third-party scripts. Cloudflare WAF managed ruleset, rate limits and authenticated origin pull. Certificate policy through ACM. Header regression tests in CI so a future change cannot silently weaken the policy. Re-run the customer's scanner here — before launch, not after.

    ~30 hrs

  6. 051 week

    Launch

    280-entry redirect map with parity checking, full PreQA sweep, Lighthouse, cross-browser and accessibility passes. DNS cutover with HSTS continuity preserved. The current site stays published and paid through a hold period so rollback stays available.

    ~40 hrs

  7. 063 days

    Symposium site and handover

    Smart Horizons 2027 into the same repository and behind the same controls. Editor training, plus a written runbook covering publishing, rollback, and how to change a security header safely.

    ~26 hrs

Sequencing traps

  • HSTS is live today with includeSubDomains; preload. The new stack must serve HSTS from its first request or Chrome drops the preload entry — slow and painful to reverse. Verify before cutover, not after.
  • Stand up headers before changing anything about the current hosting. Confirm parity with curl -I first. Reverse that order and the site serves bare in between.
  • Re-pull the home WebGL embed from live HTML. The source copy is intentionally stale — the homepage was hand-tuned after publish.
  • Keep the current site live through the hold period. Decommissioning on launch day removes the rollback path.
  • Enable authenticated origin pull at cutover, not later. Until it is on, the WAF can be routed around, and that is exactly the finding the rebuild exists to close.