Altered Digital Migration

Changelog

Release history for the Altered Digital Migration plugin, Worker, and AI service.

2.1.1 (2026-09)

Wizard UX overhaul — fixes 20 audit findings across the onboarding flow.

Fixed

  • Dead-end back button — Step 6 (Connect)'s back button now correctly returns paid users to their quote and unpaid users to the payment panel (previously landed on an empty panel).
  • Session-expired dead ends — any REST call failing with not_authenticated/401 mid-wizard now shows a "Sign in again" banner with your progress intact; a global handler covers every step. Expired WordPress nonces get a "Reload now" banner. After re-login you resume at your actual step instead of Step 1.
  • Paid users re-offered payment — after paying the deposit, Step 4 now shows your stored quote read-only with a "Deposit paid" confirmation instead of a live "Pay deposit" button.
  • Resume banner dismissal persists across page reloads.

Added

  • Per-plugin quote selections persist across reloads and back-navigation.
  • Site analysis: cancel button, elapsed-time ticker, 5-minute timeout handling on quote generation.
  • Keyboard accessibility — wizard panels receive focus on step change, steps announce to screen readers, step indicator marks the current step, tabs support arrow keys.
  • Step indicator renumbers correctly when the Rebuild step is hidden (migration-only tier), and the welcome-back banner says "step N of M" accurately.
  • Inline error messaging replaces blocking alert() dialogs on checkout failures.
  • Migration progress polling auto-restarts after a completed migration and stops cleanly on terminal state.

Changed

  • Improved text contrast for muted wizard text; respects prefers-reduced-motion.
  • All migration log / progress table values are HTML-escaped.
  • Dead JS (unused tier selector, legacy quote call) and its CSS removed.

2.0.0 (2026-07)

Added

  • Multi-tenant Worker — one account, many sites. Per-tenant encrypted Sanity credentials in D1 (POST /v2/connect).
  • Rebranded plugin — "Altered Digital Migration" with AD_* class structure, altered-digital/v1 REST namespace (back-compat on wp-to-sanity/v1).
  • Onboarding wizard — 5-step Supabase login → site analysis → quote → Stripe checkout → Sanity connect.
  • Deterministic page builder parsers — Elementor, WPBakery, Divi (4.x shortcodes). Confidence scoring; blocks below 0.7 route to AI fallback.
  • AI service (apps/ai-service) — Vercel-hosted, capability-first model router (chat / classify / generate / json / vision / code / long_context / embeddings). Routes: /health, /signup, /analyze, /quote, /stripe/{checkout,webhook,capture}, /transform, /cleanup, /schema-generate, /approve, /auto-complete.
  • AI transform fallback — unknown or low-confidence builder blocks sent to AI service, returned as Portable Text. Graceful degradation to deterministic output on failure.
  • AI content cleanup — alt text (vision), meta descriptions (generate), slug transliteration. Bulk "Fix all" from dashboard.
  • AI schema generation — generates Sanity schema TypeScript from your WP content structure. Preview, copy, download.
  • Customer sign-off + QA — /approve runs WP vs Sanity count checks, pending-row check, Next.js render probe. Creates final-50% Stripe Checkout.
  • Auto-completion cron — daily 3am. paid_full quotes > 7 days → completed.
  • Claude Connect — hand off migrated Sanity project to Claude Desktop via the Sanity MCP server. Deep-link install, independent revocable token.
  • WP-CLI — wp altered-digital export|analyze|status. Bypasses REST timeouts for large sites.
  • WP multisite — network-activated plugin creates tables on all sites; network admin pushes product-wide settings.
  • Self-host mode — SELF_HOST=1 short-circuits tenant lookup for enterprise data-residency deployments.
  • Docs site — Fumadocs-powered docs at wptosanity-docs.vercel.app.

Fixed

  • Dead JS in admin (pollMigrationStatus, updateMigrationMetaBox removed). updateSlug side-effect constrained to plugin settings pages.
  • Public /status REST route locked to admin capability (was __return_true).
  • N+1 in export — batched WP_Query.
  • migration_queue table removed (was created in activate(), never used).
  • WP migration_log reconciles with Worker D1 on /status/post/{id}.
  • Duplicate transition_post_status hooks guarded with has_action() at priority 99.
  • Slug transliteration — NFKD normalization + combining mark stripping + transliteration map (Workers lack iconv).
  • Sanity quota / rate limit — SanityError with isQuotaOrRateLimit getter. Webhook returns 503 with actionable message on 402/429.
  • Featured image fallback — no more wp-media-{id} placeholder causing Sanity 409. Posts save without mainImage when asset upload fails.

1.0.0 (2026-06)

  • Initial release. Single-tenant self-service migration: WP webhook → Cloudflare Worker extract/transform/mutate → Sanity createOrReplace → Next.js revalidate.
  • Gutenberg → Portable Text parser (self-contained HTML tokenizer, no DOMParser).
  • Featured image upload to Sanity asset API.
  • ACF flexible content → Sanity page builder blocks.
  • WP CLI: wp wp-to-sanity export.

On this page