Sanity → Astro
Move content, assets, authors, URLs, SEO, design, forms, permissions, integrations, and publishing operations from Sanity into Astro with an explicit exception ledger and evidence-based cutover.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Sanity
- Content Lake, schema-as-code, and customizable Studio support sophisticated structured content
- Editors get a purpose-built publishing workflow instead of raw files
- GROQ, schema code, and custom editorial tooling demand engineering ownership
- Themes, extensions, and content models add maintenance and portability constraints
Astro
- Content-focused sites ship very little client JavaScript by default
- Managed deployments reduce infrastructure and release-management work
- Repository-based publishing and custom integrations require engineering ownership
- Runtime assumptions, platform services, and pricing models shape the architecture
Astro: Content-focused sites ship very little client JavaScript by default. This removes a major source-side concern: GROQ, schema code, and custom editorial tooling demand engineering ownership.
What you lose: Content Lake, schema-as-code, and customizable Studio support sophisticated structured content. What you inherit: Repository-based publishing and custom integrations require engineering ownership.
Know the shape of the move.
This timeline assumes
- Up to 10 sites, 10,000 content items, and 25,000 public routes
- The source remains publicly reachable until media and route verification passes.
- Dynamic features outside the documented scope require an approved replacement.
- The destination is built and reviewed on a private preview before DNS changes.
- The migration team records evidence for every blocking verification check.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Content, assets, authors, structure, public URLs, and metadata | partial | critical | Core content, assets, authors, structure, public urls, and metadata can move, but Sanity and Astro use different models, limits, identifiers, and import behavior. | Pilot every feature class, preserve source IDs, and reconcile accepted, transformed, rejected, and excluded items. |
| Themes, hosted applications, forms, memberships, integrations, and history | manual | critical | Sanity-specific runtime configuration and historical evidence do not become native Astro behavior through the core data transfer. | Inventory every active dependency, approve its destination disposition, and test the replacement before source writes stop. |
| Published posts and pages | partial | critical | Core titles and body content can move, but platform-specific blocks and metadata need review. | Compare every route and a stratified content sample. |
| Images and downloadable media | partial | critical | Exports can reference remote files instead of carrying verified local originals. | Copy originals, record hashes, and keep the source public until reconciliation. |
| Public URLs and redirects | manual | critical | Routing rules and slug behavior differ between the two platforms. | Create a source-to-destination URL registry and test every redirect. |
| Authors and permissions | partial | high | Bylines may move, but user accounts, roles, and credentials do not transfer safely. | Create destination users deliberately and assign least privilege. |
| Taxonomies and navigation | partial | high | Categories, tags, menus, and collection semantics rarely map one-to-one. | Approve a mapping and test archive, menu, and breadcrumb behavior. |
| SEO metadata and structured data | manual | critical | Titles, descriptions, canonicals, social cards, and schema require destination configuration. | Crawl both sites and block cutover on critical SEO differences. |
| Forms and submissions | manual | critical | Hosted form processing, spam controls, notifications, and submission history are platform-specific. | Export history and test each replacement from submission through durable receipt. |
| Analytics and historical reports | lost | medium | Historical platform reports do not become native destination history. | Export dated reports and annotate the analytics cutover. |
| Theme and visual presentation | lost | high | Source themes and design systems do not run on the destination platform. | Rebuild approved templates and compare screenshots at supported breakpoints. |
| Integrations and scheduled jobs | manual | critical | API keys, webhooks, embeds, and scheduled jobs remain connected to the source. | Inventory, replace, rotate, and test every production integration. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Sanity post or page | Astro content item or page | transform | Preserve source ID and public URL. |
| Title | Title | automatic | Verify entities and Unicode. |
| Slug or path | Slug or path | transform | Preserve the public URL or create one redirect. |
| Rich body | Destination rich content | transform | Repair unsupported blocks and embeds. |
| Author | Destination user or byline | manual | Provision users before assignment. |
| Category or tag | Destination taxonomy | transform | Approve hierarchy and primary classification. |
| Featured image and media | Destination media | transform | Copy originals and preserve alt text. |
| SEO fields | Destination SEO fields | manual | Verify titles, descriptions, canonical, social data, and schema. |
| Form | Destination form or external handler | manual | Rebuild validation, consent, spam control, storage, and alerts. |
Make the move recoverable.
Create the source-of-truth backup
Preserve Sanity data, configuration, and operating evidence before any destination write.
- Export all available Sanity content and settings.
- Crawl production for routes, metadata, schema, assets, forms, status codes, and integrations.
- Capture themes, design tokens, screenshots, DNS, domains, users, redirects, analytics, and submissions.
- Record counts and cryptographic hashes in an immutable manifest.
Proof to capture: A signed manifest reconciles every scoped record class, runtime dependency, export file, count, and hash.
Content and route registry
Preserve public content and URL intent.
- Inventory source values and exceptions.
- Define explicit destination mappings.
- Reject unmapped critical records.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Asset and metadata normalization
Make media, taxonomy, and SEO deterministic.
- Normalize encoding, dates, identifiers, and blanks.
- Run a representative pilot.
- Reconcile accepted, rejected, and transformed rows.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
A successful import hides missing runtime behavior
A page renders while forms, access, search, or integrations fail.
- Consequence
- Visitors lose content or business actions.
- Mitigation
- Test behavior, not screenshots alone.
Stop if: Any critical runtime path lacks durable evidence.
URLs or metadata change silently
The destination crawl has missing routes, redirect chains, or canonical differences.
- Consequence
- Traffic and search visibility regress.
- Mitigation
- Require a route and SEO diff before DNS changes.
Stop if: A critical route lacks one valid destination.
Remote media disappears after source shutdown
Destination markup still loads source-hosted assets.
- Consequence
- Images and downloads break later.
- Mitigation
- Copy and hash every required asset.
Stop if: A critical asset depends on the source domain.
Do the work in this order.
- Days 1–3 · inventory
Inventory and decisions
6–12 hours active2–3 days elapsedOwner review waiting- Inventory Sanity data, features, users, domains, and integrations.
- Approve scope, owners, mappings, and exclusions.
Depends on: Sanity and Astro administrator access
Stop / go checkpointExport?
Go when: Every critical item has an owner and disposition.
Stop when: Consent, billing, access, or system ownership is unclear.
- Days 3–5 · backup
Backup and reconcile
5–10 hours active1–3 days elapsedExport processing waiting- Create immutable exports and configuration evidence.
- Reconcile counts, totals, and hashes.
Depends on: Approved inventory
Stop / go checkpointTransform?
Go when: Source totals and export manifests agree.
Stop when: Any critical dataset or configuration is absent.
- Days 5–12 · pilot
Map and pilot
10–35 hours active3–8 days elapsedDestination processing and review waiting- Configure Astro and transform representative data.
- Run a pilot containing normal records and every critical edge case.
Depends on: Verified backup
Stop / go checkpointScale?
Go when: Pilot mappings, behavior, access, and evidence pass.
Stop when: Any critical check fails or produces unexplained variance.
- Days 10–20 · cutover
Final delta and switch
5–25 hours active1–5 days elapsedDNS, import, or sync propagation waiting- Freeze production writes in Sanity.
- Apply the final delta, switch ownership, and run blocking checks.
Depends on: Passed pilot and approved rollback
Stop / go checkpointOpen production?
Go when: Counts reconcile and one destination system owns production.
Stop when: A source writer remains active or a blocking check fails.
- Days 12–40 · observe
Observe and close
3–18 hours active3–10 days elapsedOperating-cycle evidence waiting- Monitor one complete operating cycle.
- Sign the verification report and close rollback only after stability.
Depends on: Verified cutover
Stop / go checkpointClose rollback?
Go when: No trigger occurs during the agreed observation period.
Stop when: Data, access, delivery, routing, or business results regress.
Cut over with a way back.
Cutover
Make Astro the only production system without losing the final Sanity delta.
- Freeze production writes and scheduled actions in Sanity.
- Export, transform, and reconcile the final delta.
- Apply the approved delta to Astro.
- Switch domains, forms, integrations, sending, or sync ownership as applicable.
- Run every blocking verification check and keep the source intact.
Proof to capture: Astro owns production, totals reconcile, and every blocking check has durable evidence.
Rollback
Return production ownership to Sanity without losing destination-era changes.
- Stop new writes and scheduled actions in Astro.
- Restore the prior Sanity routing, forms, integrations, sending, or sync ownership.
- Export the Astro post-cutover delta.
- Review and apply safe destination-era changes to Sanity.
- Run the same blocking checks against the restored source.
Proof to capture: Sanity again owns production with current data and no duplicate destination action.
- Unexplained critical count or value variance
- Missing or exposed critical data
- Duplicate production action
- Failed access, routing, delivery, or integration check
- A critical feature has no safe destination replacement
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | URL disposition | Crawl every source URL. | One 200 destination or one-hop permanent redirect. | Crawl diff. | |
V-02Blocking | Record and field reconciliation | Compare counts and stratified records. | Every scoped item and critical field maps. | Content manifest. | |
V-03Blocking | Binary independence | Compare URLs, hashes, sizes, and source-domain requests. | No required asset depends on the source. | Asset report. | |
V-04Blocking | Metadata and index control | Compare titles, descriptions, canonicals, robots, social data, and schema. | Approved parity with no accidental noindex. | SEO diff. | |
V-05Blocking | Submission lifecycle | Submit every form and upload path. | Validation, storage, consent, notification, and response pass. | Submission IDs. | |
V-06Blocking | Restricted content | Test anonymous and authorized roles. | No restricted content leaks. | Access matrix. | |
V-07 | Responsive templates | Compare key pages at approved breakpoints. | Content and interactions meet acceptance. | Screenshot set. | |
V-08Blocking | Single source of truth | Inspect publishing and integrations in both systems. | Astro alone owns production. | Operating inventory. |
Remove the scaffolding safely.
Safe after: One complete operating cycle, at least seven stable days, and owner sign-off on every blocking check.
- Create final Sanity exports and archive verification evidence.
- Revoke temporary credentials, API keys, webhooks, and elevated roles.
- Remove obsolete embeds, forms, jobs, integrations, and DNS records.
- Keep the source intact through the approved retention window.
- Cancel paid plans only after billing, legal, and recovery review.
- Schedule the next Astro backup, access, and migration-playbook review.
Built to be reviewed.
Tested 2026-07-19. Next scheduled review: 2026-10-19.
- Sanity: official migration documentationAccessed 2026-07-19
- Astro: official migration documentationAccessed 2026-07-19