Validate and initialize Framer
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
SEO_BLOG_CMS_LOCALE='<primary-bcp47-locale>' \
FRAMER_API_KEY='<framer-api-key>' \
FRAMER_PROJECT_URL='<framer-project-url>' \
FRAMER_COLLECTION='<framer-collection>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
npx --yes @wotaso/seo-blog-admin-cli@0.2.2 init-cms --cms framer --site-slug '<slug>' --site-origin '<origin>' --locale '<primary-bcp47-locale>'
init-cms performs the connector's read-only credential, permission, and destination-schema checks first. It writes seo-blog.config.json and the scheduled tenant workflow only after validation passes; review both files, add the named GitHub secrets and variables, then trigger the workflow once manually.
Scheduled runner health heartbeat
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
SEO_BLOG_CMS_LOCALE='<primary-bcp47-locale>' \
FRAMER_API_KEY='<framer-api-key>' \
FRAMER_PROJECT_URL='<framer-project-url>' \
FRAMER_COLLECTION='<framer-collection>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
SEO_BLOG_SCHEDULED='true' \
npx --yes @wotaso/seo-blog-admin-cli@0.2.2 health --config seo-blog.config.json --mode cms --site-slug '<slug>' --site-origin '<origin>'
Run this from the real scheduled runner after seo-blog.config.json contains the selected connector configuration and the listed secrets are loaded. CMS health re-runs the remote read-only validation; it still does not create an article. The dashboard expires readiness at the returned deadline, with a 36-hour fallback when no deadline is available.
Fields and data model
- Title must map to a string field and article body to formattedText
- Stable item ID or slug prevents accidental duplicates
- Formatted HTML and Markdown carry the matching Framer content type
Canonical and route
The Framer site and CMS detail template own the route, canonical tag, sitemap, schema, and rendering. The beta adapter writes content and starts deployment, then verifies the public page.
Known limits
- Requires Node.js 22+ and the optional Framer package.
- The beta currently supports only the declared primary locale; translated Framer posts fail before connecting.
- Server API behavior can change while the connector is beta.
- Unsupported or required unmapped field types block setup rather than risking a partial article.
Recovery
- Run init-cms again after correcting Collection access or the explicit field map.
- Map the article body to formattedText and every required field to a supported source.
- Never mark a failed deployment published manually; rerun with the stable post ID.