Repository navigation
Conversation
The auto-merged lockfile from the path-routing pilot failed `bun install --frozen-lockfile`. This is the same dependency set, written by the bun version that CI pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In path mode, /docs/overview sent visitors to "/" and /docs/changelog to "/changelog/...", which are steel-web paths. Both now go through docsPath, as does the interactive badge navigation. Root mode is unchanged because docsPath is the identity there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
steel-web is a Next.js app on port 3000 now, with steel.dev as the local fallback. The docs app owns /docs and /docs/:path*. This copy is for the local proxy; the default app's copy controls Vercel routing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds path-mode cases for the docs home URL, absolute old-host links and an unsupported prefix. Adds ABOUTME headers to the files that the path-routing pilot added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs-host-redirect/ is a static Vercel project (vercel.json only) for docs.steel.dev after the docs move to steel.dev/docs. It maps each old URL one to one: 660 entries for pages, .md pages, Open Graph images, public files, machine endpoints and the existing redirects, which go straight to their final destination. Unknown paths return 404. It serves its own robots.txt and an old-URL sitemap so crawlers find the redirects. scripts/generate-docs-host-redirects.ts writes the project from the Fumadocs source, public/ and next.config.mjs; `--check` fails when it is stale. Tests check coverage against the source and against every docs.steel.dev URL from the live sitemap and Search Console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`bun scripts/verify-docs-host-redirect.ts <base-url>` requests every source with a probe query and checks the status (308, or 307 where the old redirect was temporary), the Location path, fragment and query, the trailing-slash redirect, 404s for unknown paths, robots.txt and the old-URL sitemap. Run it on the project's vercel.app URL before the domain move and on https://docs.steel.dev after it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Prepares Steel Docs to move from
https://docs.steel.devtohttps://steel.dev/docswith Vercel Microfrontends, and adds the redirect project that will owndocs.steel.devafter the move.lib/docs-path.ts) with two build-time variables:NEXT_PUBLIC_DOCS_PATH_PREFIX(empty or/docs) andNEXT_PUBLIC_DOCS_ORIGIN(defaulthttps://docs.steel.dev). In path mode, every canonical,og:url,og:image, JSON-LD id, sitemap<loc>,llms.txt/llms-full.txtURL, API catalog link,Linkheader, internal redirect, rendered MDX link and media URL, and client navigation useshttps://steel.dev/docs/....withMicrofrontendsis applied only in path mode. No NextbasePath.docs.steel.devas today, so this PR is safe to merge before the cutover.docs-host-redirect/is a static Vercel project (onlyvercel.json,robots.txtand an old-URLsitemap.xml). It maps 660 old URLs one to one tosteel.dev/docswith 308s (307 where the docs redirect was temporary), keeps query strings, and returns 404 for unknown paths.scripts/generate-docs-host-redirects.tswrites it;--checkfails if it is stale.Cross-linked with the steel-web PR: https://github.com/steel-dev/steel-web/pull/18
Reused from the September pilot
The 5 pilot commits from
feat/docs-path(3e0f9da, d2ede44, 2d67604, ade730eb, 3f5247b4) are cherry-picked onto currentmain(322ad57, 8 commits newer). There was one conflict, inapp/(home)/_pages/page.en.tsx: main switched the logo import toSteelMarkand the pilot added adocsUrlimport, so the resolution keeps both. The pilot'sapp/favicon.ico→public/favicon.icomove carried main's new favicon bytes (same blob as main). The lockfile is regenerated with the pinned bun 1.4.2 because the auto-merged lockfile failed--frozen-lockfile.New in this PR:
fix:/docs/overviewand/docs/changelogredirected to steel-web paths (/and/changelog/...) in path mode. These now go throughdocsPath(the same fix as the uncommitted change in thedocs-pathworktree, which this PR leaves alone). The interactive badge navigation is also prefixed.microfrontends.jsonnow matches steel-web on Next.js (port 3000, fallbacksteel.dev, routes/docsand/docs/:path*).scripts/verify-docs-host-redirect.ts.The pilot's plan 004 preferred a standalone redirect-only Vercel service outside the Microfrontends group over host-conditioned middleware in the docs app. This PR follows that. Why in this repo: the map comes from this repo's source (Fumadocs pages,
public/,next.config.mjsredirects), so the coverage test can fail on the same PR that adds a page or a redirect. Whyvercel.jsononly: no runtime, no build, no code fork of the docs. 660 entries is under Vercel's 2,048 limit forredirects.Redirect inventory (660)
//overview/stealth/captcha-solving→https://steel.dev/docs/overview/stealth/captcha-solving.md, only pages withoutllm: false)/overview/steel-cli.md/og/overview/steel-clillms.txt, agent-skill archives, API catalog)/images/logo.png,/.well-known/agent-skills/index.json/llms.txtis also a public file)/llms-full.txt,/AGENTS.md,/DESIGN.md,/changelog,/api/searchnext.config.mjsand/overview, resolved to one hop/cookbook/playwright-ts→https://steel.dev/docs/cookbook/playwright#typescript;/api-referenceand/openapi.jsongo straight to their external targetsTwo content pages (
/overview/llms-full.txt,/overview/self-hosting/render) are hidden by old redirects, as on the live site, so they keep the redirect.Sources and checks:
tests/fixtures/docs-host-known-urls.txt: 167 paths from the live sitemap (150 URLs) and every Search Console page (16 months) that did not return 404. The test fails if one is not mapped.docs.steel.devon 2026-10-08: 619 × 200, 39 × 308, 2 × 307, 0 × 404. Every live redirect matches the map's final destination, except/changelog(mapped to/docs/changelog, which still redirects to the latest entry) and a%2Fencoding difference in the Render URL.robots.txtandsitemap.xmlon the old host are served by the redirect project. The sitemap lists the old page URLs so crawlers revisit them and see the redirects.es):idioma.jsonlistsesas a target, but noescontent exists.docs.steel.dev/esreturns 404, no page emits hreflang, and Search Console has noesURL. So there is nothing to map. The prefix seam applies to every path, so a laterestree is covered when the map is regenerated./llms.mdx/*(internal rewrite target),/_next/*,/api/feedback. Search Console also shows 54 URLs that already return 404 on docs.steel.dev (for example/overview/integrations/*,/overview/guides/connect-with-*,/integrations/*/quickstart). They stay 404. If redirects for them are added tonext.config.mjsbefore the cutover, a regenerate picks them up.SEO migration checklist
og:url,og:image, JSON-LD ids →https://steel.dev/docs/...in path mode (verified on 620 composed paths, see below)https://steel.dev/docs/sitemap.xmlwith onlysteel.dev/docsURLs; steel-web'srobots.txtnames it (steel-web PR)robots.txtstay ondocs.steel.devso crawlers see the redirectsllms.txt,llms-full.txt,AGENTS.md, API catalog, agent-skills index,Linkheaders → new URLsespages (see above)sc-domain:steel.devalready covers both hosts.Owner cutover steps
None of these were done. Order matters.
Before the cutover (no visible change)
docs.steel.devdoes not change. The redirect directory is inert until a project points at it.steelno longer exists;GET /v1/microfrontends/groupsreturns none): default appsteel-web, childdocs. Creating a group changes nothing until amicrofrontends.jsonreaches steel-web production. Check the request pricing that the pilot recorded.docsproject, remove the stalefeat/docs-pathPreview variables. For preview tests, set Preview variablesNEXT_PUBLIC_DOCS_PATH_PREFIX=/docsandNEXT_PUBLIC_DOCS_ORIGIN=https://steel.devon a docs branch whose name matches the steel-web branch (for example push this branch also asniko/docs-microfrontend), so branch routing pairs them.LLMS_BASE_URLis not needed; it derives from the two variables.npm run verify:docs -- <url> --redirect-map ../docs/docs-host-redirect/vercel.json --preview --compare-old-host(steel-web) andbun scripts/verify-docs-browser.ts <url>(here). Both must pass.bun run generate && bun run generate-docs-host-redirectson the finalmain, commit any change, and confirm--checkandbun testpass.docs-host-redirect, outside the Microfrontends group: Git reposteel-dev/docs, Root Directorydocs-host-redirect, framework Other. Deploy it and runbun scripts/verify-docs-host-redirect.ts https://<project>.vercel.app. Confirm especially/.well-known/*(Vercel documents/.well-knownas reserved forvercel.jsonredirects) and the fragment destinations (query before#).Cutover (same session, in this order)
7. Set Production variables on
docs:NEXT_PUBLIC_DOCS_PATH_PREFIX=/docs,NEXT_PUBLIC_DOCS_ORIGIN=https://steel.dev. Redeploy and promote.docs.steel.devkeeps working: a path-mode build still serves root paths and/docs/*, with canonicals already onsteel.dev/docs(checked locally).8. Merge the steel-web PR (after the interim redirect PR, see its body). Run
npm run verify:docs -- https://steel.dev --redirect-map ... --compare-old-host.9. Move the
docs.steel.devdomain from thedocsproject todocs-host-redirect. No DNS change is needed if both projects are innen-labs. Runbun scripts/verify-docs-host-redirect.ts https://docs.steel.dev. Do this only after step 8 passes; the other order creates a loop of 404s.10. Search Console: submit
https://steel.dev/docs/sitemap.xml; keephttps://docs.steel.dev/sitemap.xmlsubmitted; URL-inspect and request indexing for the top pages (/docs/overview/stealth/captcha-solving,/docs,/docs/overview/pricinglimits,/docs/overview/stealth/proxies,/docs/overview/self-hosting/docker).11. Analytics: the docs GTM tags now see
steel.devas the host. Check GA4/Clarity filters that usedocs.steel.dev.12. Keep
docs-host-redirectand its domain for at least a year.Monitoring
docs.steel.devclicks and impressions should fall assteel.dev/docsrises. Watch/overview/stealth/captcha-solving(≈3.3M impressions in 16 months),/overview/pricinglimits,/overview/stealth/proxies,/overview/self-hosting/docker,/llms-full.txt.docs.steel.devURLs move to "Page with redirect";steel.dev/docsURLs to "Indexed". Investigate any "Not found (404)" onsteel.dev/docs.docs-host-redirect: 404s show old URLs that the map misses. Add a redirect innext.config.mjsand regenerate.steel.dev/docs5xx, broken navigation, or a sustained drop in total docs clicks of more than 30% after 3 weeks.Rollback
/docsrouting) and the docs production deployment (back to root mode).docs.steel.devwas never changed.docs.steel.devback to thedocsproject first, then roll backdocsto a root-mode deployment, then steel-web. Browsers cache 308s, so visitors who already followed a redirect keep going tosteel.dev/docs. Keepsteel.dev/docsserving during any rollback.Verification done
bun install --frozen-lockfile(bun 1.4.2),bun run test(359 pass, 0 fail),bun run typecheck,bun run checkand the CI form with--error-on-warnings(263 files, clean),bun run validate-links(0 errors),git diff --check.bun run build: pass. Compared with livedocs.steel.dev(same base commit 322ad57) on all 150 sitemap pages: title, description, canonical,og:url,og:imageand links are equal. Differences are only GTM (the variable is not set locally) and the home page's recently-updated list, which depends on Git history depth.robots.txt,sitemap.xmlandllms.txtare byte-equal./docs, originhttps://steel.dev): pass. Composed locally with the steel-web branch throughmicrofrontends proxy2.4.0. The steel-web verifier passed on 620 mapped paths with--compare-old-host: every page 200 with canonical andog:urlonhttps://steel.dev/docs/..., no link out of/docs, no/docs/docs, Markdown and images correct, machine endpoints, negotiation (GET and HEAD), true 404s, feedback validation 400, robots, changelog redirect. Assets load from/vc-ap-e3e2a9/_next/....docs.steel.dev): root paths,/docs/*and prefixed assets return 200.vercel.jsonmap compiles with@vercel/routing-utils(692 routes) and matches the expected sources.verify-docs-browser.tsagainst it, a deployment ofdocs-host-redirect.Open risks
Cache-Control: private, no-storeon negotiated pages (pilot decision, because Next can overwriteVaryon prerendered HTML). This turns off CDN caching of docs HTML onsteel.dev/docs. Measure TTFB and cost on the preview./.well-known/*redirects on the redirect project (6 entries) may be refused by Vercel. If so, those agent-discovery URLs on the old host return 404.docs.steel.devin code samples and inline code (overview/browser-tools/overview.mdxuses it as a sample scrape target;overview/steel-cli.mdxshowshttps://docs.steel.dev/llms-full.txt). Links in rendered HTML and Markdown are rewritten; these code strings are not. A content follow-up can update them after the cutover.🤖 Generated with Claude Code