Skip to content

Cut-over docs hosting from ReadTheDocs to Cloudflare Pages #6151

@lucasrodes

Description

@lucasrodes

Written by Claude Code — @lucasrodes at the wheel.

The CF Pages parallel mirror is live at https://docs-cf.owid.io/ via three Pages projects (owid-docs, owid-etl-docs, owid-grapher-py-docs) with the umbrella _worker.js proxying subproject paths. RtD remains the authoritative docs.owid.io/ deploy until we cut over. See owid/owid-docs/INFRASTRUCTURE.md for how the pieces fit.

This issue tracks the cut-over plan once we're happy with the CF mirror.

1. Evaluation period (now)

Spot-check these pages on docs-cf.owid.io and confirm parity with RtD. The dynamically generated content is the highest-risk surface — those pages depend on pre-build scripts (docs/ignore/pre-build/*.py) and post-build notebook conversion, which CF runs through the same Make targets as RtD but in a fresh CI env.

  • Umbrella/ (owid-docs landing, nav into subprojects)
  • ETL — dynamically generated (most likely to drift):
    • /projects/etl/architecture/metadata/reference/ (from bake_metadata_reference.py)
    • /projects/etl/api/catalog-api/ (from bake_catalog_api.py + lib/catalog README)
    • /projects/etl/api/search-api/, chart-api/, semantic-search-api/
    • /projects/etl/guides/analytics-events/ (TypeScript-sourced, fetched from owid-grapher at build time)
    • /projects/etl/guides/etl-cli/ (CLI help)
    • any page under /projects/etl/analyses/ (Jupyter notebooks → HTML)
  • ETL — static: /projects/etl/, /projects/etl/getting-started/, /projects/etl/contributing/
  • owid-grapher-py: /projects/owid-grapher-py/, /projects/owid-grapher-py/api-reference/grapher/
  • Cross-links between subprojects (the umbrella nav and any inline links)
  • Search — top-bar search on each subproject (built by Zensical, index regenerated each build)
  • Legacy URL redirects/en/latest/, /projects/etl/en/latest/..., /projects/owid-grapher-py/en/latest/... should 301 to the canonical paths (see _worker.js in owid-docs)
  • Sitemap + robots.txt at each project root
  • 404 behavior — visit a nonexistent path under each subproject

Useful comparison: open the same URL on RtD and CF side-by-side. Differences in TOC, headings, or generated content are the signal that something needs fixing before cut-over.

2. Cut-over steps

When sign-off is ready:

3. Cleanup (after cut-over is stable for ~1 week)

  • Remove .readthedocs.yaml (this repo) and .readthedocs.yml (owid-docs, owid-grapher-py).
  • Archive or delete the RtD projects (owid-etl, owid-docs, owid-grapher-py).
  • Remove the legacy GH Pages workflow owid-docs/.github/workflows/docs.yml.
  • Drop the legacy /en/latest/ 301 rule from _worker.js once external links have had time to update (or keep indefinitely — it's tiny and harmless).

Coordination

The DNS swap is the only step that requires the site team (Bastian / Mojmir). Everything else is self-contained in these three docs repos.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions