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/v1REST namespace (back-compat onwp-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 —
/approveruns WP vs Sanity count checks, pending-row check, Next.js render probe. Creates final-50% Stripe Checkout. - Auto-completion cron — daily 3am.
paid_fullquotes > 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=1short-circuits tenant lookup for enterprise data-residency deployments. - Docs site — Fumadocs-powered docs at
wptosanity-docs.vercel.app.
Fixed
- Dead JS in admin (
pollMigrationStatus,updateMigrationMetaBoxremoved).updateSlugside-effect constrained to plugin settings pages. - Public
/statusREST route locked to admin capability (was__return_true). - N+1 in export — batched
WP_Query. migration_queuetable removed (was created inactivate(), never used).- WP
migration_logreconciles with Worker D1 on/status/post/{id}. - Duplicate
transition_post_statushooks guarded withhas_action()at priority 99. - Slug transliteration — NFKD normalization + combining mark stripping + transliteration map (Workers lack
iconv). - Sanity quota / rate limit —
SanityErrorwithisQuotaOrRateLimitgetter. Webhook returns 503 with actionable message on 402/429. - Featured image fallback — no more
wp-media-{id}placeholder causing Sanity 409. Posts save withoutmainImagewhen 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.