One architecture, three CMSes
A content-port layer: sections and components consume normalized types only, while a per-CMS adapter provides fetching, revalidation and preview. Setup picks the backend — Sanity, Payload or Strapi. Zero vendor lock-in; zero SaaS fees when you go self-hosted.