Skip to content

docs(redirects): cover the remaining 404ing historical URLs - #2328

Merged
GigaHierz merged 3 commits into
mainfrom
palango/2298-redirect-audit
Sep 24, 2026
Merged

GigaHierz merged 3 commits into
mainfrom
palango/2298-redirect-audit

Conversation

@palango

@palango palango commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

About 600 old public URLs from the Docusaurus and GitBook eras still returned 404 after #2299, and a handful of existing redirects either never fired or sent readers to the wrong page. This adds 180 redirects and 6 subtree wildcards for the remaining URLs from the #2298 audit, re-points 28 existing entries, and decodes 15 %20 sources that Mintlify never matched. Destinations follow the rule #2279 and #2299 used: each one is a page in the navigation and not itself a redirect source. That also rules out /, which production redirects again to /home/celo.

What changed

  • 186 new entries: 180 specific ones for the slice-3 paths and the published /developer-resources and /developer-guide URLs, then 6 wildcards at the end of the array: /blog/:slug* (and a bare /blog) to /build-on-celo, plus /protocol/bridge/, /protocol/bridging/, /bridge/, /community/celo-sage/ and /build-on-celo/build-with-ai/celina/. None of the wildcard prefixes has a live page under it.
  • 28 existing entries re-pointed. The mainnet pages were sent to Celo Sepolia (from docs(redirects): add 51 verified redirects for pre-migration URLs still 404ing #2299). /developer/rainbowkit-celo/:slug* pointed into pages that don't exist. Nine entries pointed at /. The rest send the same old page to the target the new entries use, so the old URL families agree with each other.
  • 15 sources decoded. Mintlify matches the decoded request path, so a source written one-click%20quickstart never fired. The 13 blog entries and 2 thirdweb entries now use literal spaces (and |). Checked with mint dev, with a revert as control.

Left as 404

  • /v2/*, 107 URLs. Every file comes from c64cd3f, which only exists on sophia-edits and never reached main. These pages were never public.
  • /developer-resources/**/reference/**, 445 typedoc dumps. The top-level developer-resources/ tree lived for two days in March 2021 as a GitBook import. GitBook served those pages under /developer-guide/..., which existing entries already cover.
  • The template and test pages /broken, /markdown-features, /thank-you, /example, /getting-started/new-page, /cel2/test, which never held content.

Verification

  • A resolver ran 749 audit URLs through the array, and each ends on an in-nav page in one hop. Against main the same script reports 647 failures.
  • Every added and re-pointed source, and 10 deep paths per wildcard, requested from mint dev: all redirect to the intended page. The declined URLs still 404.
  • All 762 existing sources re-requested from mint dev: the only behaviour changes are the intended ones above.
  • Each old page, read from git history, was compared with its new target. The second commit applies the better targets that pass found and brings older entries for the same pages in line.
  • mint dev sends /home to /home/celo and /tooling/oracles to /tooling/oracles/run. Production serves the index page at both, so those destinations are correct.
$ mint broken-links
success no broken links found
$ bash scripts/check-orphans.sh
No orphan pages found.

Known leftovers

  • /command-line-interface/commands/exchange%5B/TD%5D has the same encoding problem but decodes to [/TD], which may be special in the route matcher. Left alone.
  • /developer-resources/contractkit/usage and /developer-guide/contractkit/usage go to contractkit/setup although contractkit/usage is a live page.
  • A few older entries still point at external sites (celo.org/code-of-conduct, celo.org/papers, the faucet).

Refs #2298. Still open there: confirm the GA4 "Page Not Found" share drops after deploy, and wire Search Console or a page_path dimension to catch future gaps.

Added redirects (186)
Source Destination
/protocol/bridging/bridging-to-celo /home/bridged-tokens/bridges
/protocol/governance/create-proposal /home/protocol/governance/create-governance-proposal
/protocol/optics /tooling/bridges/bridges
/protocol/oracle/chainlink /tooling/oracles/chainlink-oracles
/protocol/oracles/band-protocol-how-to /tooling/oracles/band-protocol
/protocol/oracles/oracles-on-celo /tooling/oracles
/protocol/oracles/redstone-protocol-how-to /tooling/oracles/redstone
/protocol/plumo /home/celo-l1
/protocol/pos/becoming-a-validator /contribute-to-celo/community-rpc-nodes/registering-as-rpc-node
/protocol/precompiles /operate/specification/l2-migration#precompile-deprecation-and-epoch-management
/protocol/stability/adding-stable-assets /build-on-celo/build-with-local-stablecoin
/protocol/stability/doto /build-on-celo/build-with-local-stablecoin
/protocol/stability/granda-mento /home/celo-l1
/protocol/stability/oracles /tooling/oracles/run
/protocol/stability/stability-fees /home/celo-l1
/protocol/stability/tobin-tax /home/celo-l1
/protocol/token-bridges /home/bridged-tokens/bridges
/protocol/transaction /home/protocol/transactions/overview
/protocol/transaction/full-node-incentives /home/celo-l1
/developer/build-on-minipay/enabling-testnet /build-on-celo/build-on-minipay/overview
/developer/build-on-minipay/prerequisites/android-studio-setup /build-on-celo/build-on-minipay/overview
/developer/build-with-ai/examples /build-on-celo/build-with-ai/usecases
/developer/build-with-ai/resources /build-on-celo/build-with-ai/overview
/developer/build-with-ai/tools /build-on-celo/build-with-ai/overview
/developer/celo-ethers-wrapper /tooling/libraries-sdks/ethers
/developer/dappkit /tooling/libraries-sdks/reown
/developer/dappkit/setup /tooling/libraries-sdks/reown
/developer/dev-environments/overview /tooling/dev-environments
/developer/examples/chainlink-ccip /tooling/bridges/cross-chain-messaging
/developer/faucet /build-on-celo/network-overview
/developer/react-celo /tooling/libraries-sdks/contractkit/migrating-to-viem
/developer/socialconnect /build-on-celo/build-on-socialconnect
/developer/tools /tooling/overview
/developer/walkthrough/hello-celo /build-on-celo
/developer/walkthrough/hello-contract-remote-node /tooling/dev-environments
/developer/walkthrough/hello-contracts /tooling/dev-environments
/developer/walkthrough/no-code-erc20 /tooling/dev-environments/remix
/developer/walkthrough/no-code-erc721 /tooling/dev-environments/remix
/developer/walkthrough/using-js-keystores /tooling/libraries-sdks/celo-sdks
/developer/walkthrough/web-dapp /build-on-celo/quickstart
/developer/walkthroughs/hello-contract-remote-node /tooling/dev-environments
/developer/walkthroughs/hellocelo /build-on-celo
/developer/walkthroughs/hellocontracts /tooling/dev-environments
/developer/walkthroughs/valora-wc-v1 /tooling/libraries-sdks/reown
/developer/web3modal /tooling/libraries-sdks/reown
/developer/web3modal/ethers /tooling/libraries-sdks/reown
/developer/web3modal/wagmi /tooling/libraries-sdks/reown
/cel2/add-cel2-testnet-to-metamask /tooling/wallets/metamask/add-celo-testnet-to-metamask
/cel2/bridging/bridging-celo-from-holesky-to-alfajores-using-viem /home/bridged-tokens/bridging-celo-from-ethereum
/cel2/bridging/bridging-celo-from-holesky-to-dango-using-viem /home/bridged-tokens/bridging-celo-from-ethereum
/cel2/bridging/bridging-celo-from-l1-to-l2-using-viem /home/bridged-tokens/bridging-celo-from-ethereum
/cel2/bridging/withdrawing-celo-from-alfajores-to-holesky-using-viem /home/bridged-tokens/withdrawing-celo-to-ethereum
/cel2/bridging/withdrawing-celo-from-dango-to-holesky-using-viem /home/bridged-tokens/withdrawing-celo-to-ethereum
/cel2/bridging/withdrawing-celo-from-l2-to-l1-using-viem /home/bridged-tokens/withdrawing-celo-to-ethereum
/cel2/contract-addresses /tooling/contracts/l1-contracts
/cel2/decision-tree /operate/notices/archive/l2-migration
/cel2/deploy-contract /tooling/dev-environments
/cel2/developers-builders /build-on-celo
/cel2/network-information /build-on-celo/network-overview
/cel2/notices/native-ETH-bridging /home/bridged-tokens/native-ETH-bridging
/cel2/notices/pectra-upgrade /operate/notices/overview
/cel2/notices/succinct-upgrade /operate/notices/archive/jello-upgrade
/cel2/operators/community-rpc-provider /contribute-to-celo/community-rpc-nodes/community-rpc-node
/cel2/operators/custom-node /operate/operators/run-node#build-from-source
/cel2/operators/docker-node /operate/operators/run-node
/cel2/operators/migrate-archive-node /operate/operators/archive-node
/cel2/operators/operator-guide /operate/operators/overview
/cel2/validators-in-the-l2 /contribute-to-celo/community-rpc-nodes/how-it-works
/cel2/whats-changed /operate/specification/l2-migration
/community/StackShift/StackShift /contribute-to-celo/builders
/community/code-of-conduct /contribute-to-celo/contributors/overview
/community/contributing /contribute-to-celo
/community/fundraising /build-on-celo/fund-your-project
/community/grant-playbook /build-on-celo/fund-your-project
/community/guidelines /contribute-to-celo/contributors/overview
/community/join-the-community /contribute-to-celo
/community/release-process/README /contribute-to-celo/release-process
/community/release-process/celo-oracles /contribute-to-celo/release-process
/community/translation-contributors /contribute-to-celo/contributors/overview
/celo-codebase/protocol/README /home/protocol
/celo-codebase/protocol/bridging/bridging-to-celo-zh_cn /tooling/bridges/bridges
/celo-codebase/protocol/consensus/README /home/celo-l1
/celo-codebase/protocol/governance /home/protocol/governance/overview
/celo-codebase/protocol/identity/README /build-on-celo/build-on-socialconnect
/celo-codebase/protocol/proof-of-stake/README /home/protocol/staking
/celo-codebase/protocol/stability/README /build-on-celo/build-with-local-stablecoin
/celo-codebase/protocol/stability/tobin-tax /home/celo-l1
/celo-codebase/protocol/transactions/README /home/protocol/transactions/overview
/celo-codebase/protocol/transactions/full-node-incentives /home/celo-l1
/celo-codebase/protocol/transactions/tx-comment-encyption /home/protocol/transactions/tx-comment-encryption
/celo-codebase/style-guide/typescript /contribute-to-celo/contributors/code-contributors
/celo-codebase/wallet/README /tooling/wallets
/general/celo_l1_index /home/celo-l1
/general/ecosystem/guides/create-proposal /home/protocol/governance/create-governance-proposal
/general/ecosystem/guides/fundraising /build-on-celo/fund-your-project
/general/ecosystem/guides/grant-playbook /build-on-celo/fund-your-project
/general/ecosystem/guides/guidelines /contribute-to-celo/contributors/overview
/general/gallery /tooling/overview
/general/glossary /home
/general/using-celo/bridging /home/bridged-tokens/bridges
/general/using-celo/dexes /home/exchanges
/general/using-celo/voting /home/protocol/governance/voting-in-governance-using-mondo
/general/using-celo/wallets /home/wallets
/general/web2-to-web3 /build-on-celo
/general/whitepapers /home/history#white-papers
/build-on-celo/build-with-ai/examples/build-with-nebula /build-on-celo/build-with-ai/overview
/build-on-celo/build-with-ai/mcp/composer-mcp /build-on-celo/build-with-ai/mcp/index
/build-on-celo/build-with-ai/multi-agent-systems /build-on-celo/build-with-ai/overview
/build-on-celo/build-with-ai/tools /build-on-celo/build-with-ai/overview
/build-on-celo/build-with-bridge /home/ramps
/build-on-celo/build-with-zk-identity /build-on-celo/build-with-self
/getting-started/faucet /build-on-celo/network-overview
/getting-started/glossary /home
/getting-started/running-a-full-node-in-alfajores /operate/operators/run-node
/getting-started/running-a-validator-in-baklava /contribute-to-celo/community-rpc-nodes/community-rpc-node
/getting-started/using-the-wallet /tooling/wallets
/getting-started/wallets/using-metamask-with-celo/choosing-the-right-gas-price /tooling/wallets/metamask/use
/getting-started/wallets/using-metamask-with-celo/metamask-setup /tooling/wallets/metamask/use
/getting-started/wallets/using-metamask-with-celo/metamask-valora-import /tooling/wallets/metamask/import
/getting-started/wallets/using-metamask-with-celo/programmatic-setup /tooling/wallets/metamask/setup
/tooling/libraries-sdks/cli/dkg /tooling/libraries-sdks/cli
/tooling/libraries-sdks/cli/exchange /tooling/libraries-sdks/cli
/tooling/libraries-sdks/cli/lockedgold /tooling/libraries-sdks/cli/lockedcelo
/tooling/libraries-sdks/cli/utils /tooling/libraries-sdks/cli/network
/tooling/libraries-sdks/rainbowkit-celo /tooling/libraries-sdks/celo-sdks
/legacy/node/run-alfajores /operate/operators/run-node
/legacy/node/run-baklava /operate/operators/run-node
/bridge /home/bridged-tokens/bridges
/holder /home/wallets
/holder/manage/exchange /home/manage/asset
/holder/recover/from-celo-address /tooling/wallets/metamask/use
/holder/recover/from-eth-address /tooling/wallets/metamask/use
/holder/vote/governance /home/protocol/governance/voting-in-governance
/holder/vote/governance-parameters /home/protocol/governance/governable-parameters
/holder/vote/validator /home/protocol/staking/voting
/what-is-celo/celo-website /home/celo
/what-is-celo/using-celo/glossary /home
/what-is-celo/using-celo/native-bridging /home/bridged-tokens/bridges
/validator /contribute-to-celo/community-rpc-nodes/community-rpc-node
/validator/validator-explorer /home/protocol/staking/voting#validator-explorers
/home/manage/exchange /home/manage/asset
/home/protocol/consensus /home/protocol/security-council
/command-line-interface/registry /tooling/libraries-sdks/cli/network
/FAQs /home
/GLOSSARY /home
/celo-holder-guide/overview /home/wallets
/glossary /home
/important-information/mainnet-network-disclaimer /build-on-celo/network-overview
/uniswap-addresses /tooling/contracts/uniswap-contracts
/welcome /home
/index_old /home
/developer-guide/dappkit /tooling/libraries-sdks/reown
/developer-guide/dappkit/setup /tooling/libraries-sdks/reown
/developer-guide/dappkit/usage /tooling/libraries-sdks/reown
/developer-guide/integrations /operate/operators/overview
/developer-guide/start/hello-contract-remote-node /tooling/dev-environments
/developer-guide/start/hello-mobile /build-on-celo/quickstart
/developer-guide/start/hellocelo /build-on-celo
/developer-guide/start/hellocontracts /tooling/dev-environments
/developer-guide/start/randomness /operate/specification/l2-migration#deactivated-random-contract
/developer-guide/start/using-js-keystores /tooling/libraries-sdks/celo-sdks
/developer-resources/contractkit/README /tooling/libraries-sdks/contractkit
/developer-resources/dappkit /tooling/libraries-sdks/reown
/developer-resources/dappkit/README /tooling/libraries-sdks/reown
/developer-resources/dappkit/setup /tooling/libraries-sdks/reown
/developer-resources/forno/README /tooling/nodes/forno
/developer-resources/introduction /tooling/overview
/developer-resources/reference /tooling/overview
/developer-resources/start /tooling/overview
/developer-resources/style-guide/typescript /contribute-to-celo/contributors/code-contributors
/developer-resources/walkthroughs /build-on-celo
/developer-resources/walkthroughs/README /build-on-celo
/developer-resources/walkthroughs/hello-contract-remote-node /tooling/dev-environments
/developer-resources/walkthroughs/hello-mobile-dapp /build-on-celo/quickstart
/developer-resources/walkthroughs/hellocelo /build-on-celo
/developer-resources/walkthroughs/hellocontracts /tooling/dev-environments
/developer-resources/walkthroughs/hellodapp /build-on-celo/quickstart
/developer-resources/walkthroughs/hellodeploy /tooling/dev-environments
/developer-resources/walkthroughs/wallet-test /tooling/wallets
/blog /build-on-celo
/protocol/bridge/:slug* /tooling/bridges/bridges
/protocol/bridging/:slug* /tooling/bridges/bridges
/bridge/:slug* /tooling/bridges/bridges
/community/celo-sage/:slug* /contribute-to-celo/contributors/documentation-contributors
/build-on-celo/build-with-ai/celina/:slug* /build-on-celo/build-with-ai/mcp/celina
/blog/:slug* /build-on-celo
Re-pointed redirects (28)
Source Was Now
/blog/2022/01/08/valora-wc-v1 / /tooling/libraries-sdks/reown
/celo-codebase/protocol/consensus /home/protocol/security-council /home/celo-l1
/celo-codebase/protocol/consensus/index /home/protocol/security-council /home/celo-l1
/celo-codebase/protocol/consensus/ultralight-sync /home/protocol/security-council /home/celo-l1
/celo-holder-guide/celo-recovery /home/manage/self-custody /tooling/wallets/metamask/use
/celo-holder-guide/eth-recovery /home/manage/self-custody /tooling/wallets/metamask/use
/celo-owner-guide/celo-recovery /home/manage/self-custody /tooling/wallets/metamask/use
/celo-owner-guide/eth-recovery /home/manage/self-custody /tooling/wallets/metamask/use
/celo.org / /home
/cli/commands/registry /tooling/libraries-sdks/cli/commands /tooling/libraries-sdks/cli/network
/blog/tags/celo.org / /build-on-celo
/blog/tags/docs.celo.org / /build-on-celo
/blog/tutorials/devrel@celo.org / /build-on-celo
/blog/tutorials/docs.celo.org / /build-on-celo
/developer-resources/walkthroughs/no-code-erc20 /build-on-celo /tooling/dev-environments/remix
/developer-resources/walkthroughs/no-code-erc721 /build-on-celo /tooling/dev-environments/remix
/developer-resources/walkthroughs/valora-wc-v1 /build-on-celo /tooling/libraries-sdks/reown
/docs.celo.org / /home
/faqs / /home
/faqs#what-is-celos-supply / /home
/protocol/consensus/index /home/protocol/security-council /home/celo-l1
/developer/rainbowkit-celo/:slug* /tooling/libraries-sdks/rainbowkit-celo/:slug* /tooling/libraries-sdks/celo-sdks
/tooling/plumo/index /home/index /home/celo-l1
/developer-resources/dappkit/usage /tooling/libraries-sdks/contractkit/setup /tooling/libraries-sdks/reown
/developer/dappkit/usage /tooling/libraries-sdks/contractkit/setup /tooling/libraries-sdks/reown
/tooling/testnets/mainnet/disclaimer /tooling/testnets/celo-sepolia/index /build-on-celo/network-overview
/tooling/testnets/mainnet /tooling/testnets/celo-sepolia/index /build-on-celo/network-overview
/protocol/identity/odis-use-case-phone-number-privacy /tooling/libraries-sdks/contractkit/odis /build-on-celo/build-on-socialconnect

Adds 180 redirects and 6 subtree wildcards (including /blog/:slug*) for
old public URLs from the #2298 audit, fixes 15 existing destinations
(mainnet sent to Celo Sepolia, a rainbowkit wildcard into 404s, entries
pointing at "/"), and decodes 15 %20 sources that never matched.

Refs #2298
Point DAppKit at Reown, old celocli utils/registry at cli/network, key
recovery and MetaMask setup at metamask/use, Mento oracles at
oracles/run, and align existing sibling entries (walkthroughs, consensus,
recovery) with the same targets.

Refs #2298

@GigaHierz GigaHierz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving. I reproduced the central claim rather than taking the PR body's word for it:

# this branch
$ npx mintlify@4.2.910 broken-links --check-redirects
success no broken links found
$ npx mintlify@4.2.910 validate
success build validation passed
$ bash scripts/check-orphans.sh
No orphan pages found.

# origin/main docs.json, same CLI
$ npx mintlify@4.2.910 broken-links --check-redirects
found 9 broken links in 1 files
  /blog/2022/01/08/valora-wc-v1 → /
  /celo.org → /
  /blog/tags/celo.org → /
  /blog/tags/docs.celo.org → /
  /blog/tutorials/devrel@celo.org → /
  /blog/tutorials/docs.celo.org → /
  /docs.celo.org → /
  /faqs → /
  /faqs#what-is-celos-supply → /

Exactly the nine predicted, and the branch clears them. I also checked the array's invariants directly: 974 entries, 0 duplicate sources, 0 destinations that are themselves a redirect source, 0 destinations pointing at /. So the one-hop rule holds structurally, not just on the sampled URLs.

The reasoning for dropping the alphabetical-sort ask from #1846 is right — that requirement was written against the Docusaurus _redirects file, and in Mintlify an exact source beats a wildcard regardless of position. Sorting would buy nothing and make every future insertion a large diff.

The "left as 404" calls all look correct to me: pages that were never public shouldn't get redirects.

Merging this, then picking up #2329 once it retargets.

@palango
palango enabled auto-merge (squash) September 24, 2026 22:29
@GigaHierz
GigaHierz merged commit 594edb5 into main Sep 24, 2026
5 checks passed
@GigaHierz
GigaHierz deleted the palango/2298-redirect-audit branch September 24, 2026 22:29
@GigaHierz
GigaHierz restored the palango/2298-redirect-audit branch September 24, 2026 22:30
@GigaHierz
GigaHierz deleted the palango/2298-redirect-audit branch September 24, 2026 22:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants