Repository navigation
task: Audit historical architecture changes and add missing redirects (Page Not Found is the #4 most-viewed page in GA4) #2298
Description
What needs to be done
Add redirects for old public URLs that still receive traffic but now 404, and establish redirect coverage for every past architecture change (Docusaurus→Mintlify, infra-partners/→operate/, Legacy/_deprecated removal, MiniPay collapse, Specs fold-in, etc.).
Evidence (GA4 — docs.celo.org property, Aug 3–30): the "Page Not Found" page is the #4 most-viewed page — 74 views (4.4% of all pageviews), 33 active users (6.4%). GA4's page-title view can't reveal which paths failed, so coverage was reconstructed from git history instead.
Audit (full git log --all, origin/main @ 2ed9dba):
- 2,273 historical public URLs reconstructed across both eras (confirmed Docusaurus
routeBasePath: "/"→ there is no/docs/URL prefix). - 237 covered by a live page; 770 covered by an existing redirect.
- 1,266 currently 404 with no redirect, broken down:
- 449 — generated GitBook/typedoc API dumps under
/developer-resources/**/reference/** - 415 — old Docusaurus
/blog/** - 107 — old
/v2/**GitBook tree - 295 — individual content pages (~80 with a confident target, ~215 needing an editorial target)
- 449 — generated GitBook/typedoc API dumps under
- Live spot-check confirmed real 404s (e.g.
/about-celo/gas-fees,/protocol/identity/odis,/developer/dev-environments/hardhat); live controls returned 200.
Scope / slices
-
33 high-confidence redirects — every destination verified to be a live page on
main; led by/about-celo/:slug* → /home/:slug*(covers 26 pages). A PR is open for this slice. -
3 bulk catch-all wildcards — target decision needed (OPEN):
/developer-resources/:slug*→ ? (retires 449 dead API-dump URLs)/blog/:slug*→ ? (415 removed blog posts)/v2/:slug*→ ? (107 old GitBook pages)
Suggested defaults:
blog+v2→/(content retired);developer-resources→/tooling/libraries-sdks/contractkit. OPEN (implementer/PM to confirm): pick targets, or intentionally 410/leave. -
~215 individual pages with no confident target — need editorial decisions (redirect vs intentionally retire). Largest clusters:
/protocol/**,/celo-codebase/protocol/**,/cel2/**(Optics/Dango-era),/bridge/optics/**,/developer-resources/walkthroughs/**,/community/celo-sage/**.
Definition of done
- High-confidence redirects merged (slice 1 PR): docs(redirects): add 51 verified redirects for pre-migration URLs still 404ing #2299, merged 2026-09-03
- Bulk-bucket wildcard targets decided and added, or explicitly declined: docs(redirects): cover the remaining 404ing historical URLs #2328:
/blog/:slug*→/build-on-celoadded;/v2/*and/developer-resources/**/reference/**declined (never public at those paths) - ~215 no-confident-target paths triaged (redirect or intentionally retire): docs(redirects): cover the remaining 404ing historical URLs #2328: 180 specific redirects + 5 subtree wildcards; template/test pages intentionally left 404
-
mint broken-linkspasses and a re-run of the git-history audit shows 0 uncovered high-value paths: docs(redirects): cover the remaining 404ing historical URLs #2328's resolver: all 749 audit URLs end on an in-nav page in one hop (run on the PR head);mint broken-links --check-redirectsgreen onmain@f8f4ccc5(2026-10-01), and enforced in CI since ci(docs): validate docs.json and redirect destinations #2329 - (Ops) Confirm the "Page Not Found" pageview share drops in GA4 after deploy
- (Follow-up) Wire Google Search Console / add the
page_pathdimension to the GA4 404 view to catch future path gaps directly
Non-goals / dependencies
- Not building a CI redirect-validation check — tracked separately in feat: CI redirects check #1846.
- No blocking dependency; the restructure epic Epic: Docs restructure — 7 tabs → Learn / Build / Operate / Contribute #2266 introduced most of the recent path changes.
How we'd know it's fixed
- GA4 "Page Not Found" pageview share falls from ~4.4%.
- Re-running the git-history audit reports 0 missing high-value redirects.
Priority: high · Size: L (split into the 3 slices above).
Related: #1846 (CI redirects check), #2266 (restructure epic), #2253 (orphaned-pages audit).
Activity
GigaHierz commentedon Aug 31, 2026
Slice 1 (33 high-confidence redirects) is up in #2299.
docs(redirects): add catch-all wildcards for the retired blog, v2 and…
GigaHierz commentedon Aug 31, 2026
Slice 3 — proposed redirect mapping for team review
Slices 1 (33 verified redirects) and 2 (the
/blog/*,/v2/*,/developer-resources/*bulk wildcards) are in #2299. This is the remaining 219 individual paths from the history audit that had no confident target, with a proposed target for each.Please review the targets, especially the
section-fallbackandretire?rows:audit-suggest/prefix-rewrite/basename→ a specific live page matched. High confidence.section-fallback→ the specific old page is gone/consolidated, so it points at the right section landing (e.g./protocol/*→/home/protocol). Coarse but better than a 404 — refine if a better page exists.retire?→ no target found; sent to/. Many are Docusaurus artifacts (/welcome,/markdown-features,/thank-you) or retired Optics-bridge pages — confirm/or decide to intentionally 410.Open question: the
/protocol/bridge/optics*and/protocol/bridging/*rows currently map to/home/protocol;/home/bridged-tokens/bridgesmay be a better fit.Once targets are confirmed I'll open the slice-3 PR.
219 paths.
audit-suggest/prefix-rewrite/basename= specific target (high confidence).section-fallback= coarse landing (review).retire?= no target found, sent to home (review or intentionally 410)./protocol/* (49)
/protocol/home/protocol/protocol/bridge/etherscan-native-asset/home/protocol/protocol/bridge/etherscan-token/home/protocol/protocol/bridge/optics/home/protocol/protocol/bridge/optics-add-new-token/home/protocol/protocol/bridge/optics-faq/home/protocol/protocol/bridge/optics-gui/home/protocol/protocol/bridge/optics-gui-kr/home/protocol/protocol/bridge/optics-gui-zh-cn/home/protocol/protocol/bridge/optics-migration-v2/home/protocol/protocol/bridging/bridging-native-assets/home/protocol/protocol/bridging/bridging-to-celo/home/protocol/protocol/bridging/bridging-tokens-with-etherscan/home/protocol/protocol/bridging/migrating-to-optics-v2/home/protocol/protocol/bridging/optics-bridge-faq/home/protocol/protocol/bridging/optics-gui/home/protocol/protocol/bridging/optics-gui-kr/home/protocol/protocol/bridging/optics-gui-zh_cn/home/protocol/protocol/consensus/home/protocol/protocol/governance/create-proposal/home/protocol/protocol/identity/tooling/libraries-sdks/cli/identity/protocol/identity/encrypted-cloud-backup/home/protocol/protocol/identity/metadata/home/protocol/metadata/protocol/identity/odis-domain/home/protocol/protocol/identity/odis-domain-sequential-delay-domain/home/protocol/protocol/identity/odis-use-case-key-hardening/home/protocol/protocol/identity/odis-use-case-phone-number-privacy/home/protocol/protocol/identity/privacy-research/home/protocol/protocol/identity/randomness/home/protocol/protocol/identity/smart-contract-accounts/home/protocol/protocol/optics/home/protocol/protocol/oracle/tooling/libraries-sdks/cli/oracle/protocol/oracle/chainlink/home/protocol/protocol/oracles/band-protocol-how-to/home/protocol/protocol/oracles/oracles-on-celo/home/protocol/protocol/oracles/redstone-protocol-how-to/home/protocol/protocol/plumo/home/protocol/protocol/pos/home/protocol/protocol/pos/becoming-a-validator/home/protocol/protocol/precompiles/home/protocol/protocol/stability/adding-stable-assets/home/protocol/protocol/stability/doto/home/protocol/protocol/stability/granda-mento/home/protocol/protocol/stability/oracles/tooling/oracles/protocol/stability/stability-fees/home/protocol/protocol/stability/tobin-tax/home/protocol/protocol/token-bridges/home/protocol/protocol/transaction/home/protocol/protocol/transaction/full-node-incentives/home/protocol/developer/* (28)
/developer/build-on-minipay/enabling-testnet//developer/build-on-minipay/prerequisites/android-studio-setup//developer/build-with-ai/examples//developer/build-with-ai/resources//developer/build-with-ai/tools//developer/celo-ethers-wrapper//developer/dappkit//developer/dappkit/setup/tooling/wallets/ledger/setup/developer/dev-environments/overview/tooling/overview/developer/examples/chainlink-ccip//developer/faucet//developer/react-celo//developer/socialconnect//developer/tools//developer/walkthrough/hello-celo//developer/walkthrough/hello-contract-remote-node//developer/walkthrough/hello-contracts//developer/walkthrough/no-code-erc20//developer/walkthrough/no-code-erc721//developer/walkthrough/using-js-keystores//developer/walkthrough/web-dapp//developer/walkthroughs/hello-contract-remote-node//developer/walkthroughs/hellocelo//developer/walkthroughs/hellocontracts//developer/walkthroughs/valora-wc-v1//developer/web3modal//developer/web3modal/ethers/tooling/libraries-sdks/ethers/developer/web3modal/wagmi//cel2/* (23)
/cel2/add-cel2-testnet-to-metamask/build-on-celo/cel2-architecture/cel2/bridging/bridging-celo-from-holesky-to-alfajores-using-viem/build-on-celo/cel2-architecture/cel2/bridging/bridging-celo-from-holesky-to-dango-using-viem/build-on-celo/cel2-architecture/cel2/bridging/bridging-celo-from-l1-to-l2-using-viem/build-on-celo/cel2-architecture/cel2/bridging/withdrawing-celo-from-alfajores-to-holesky-using-viem/build-on-celo/cel2-architecture/cel2/bridging/withdrawing-celo-from-dango-to-holesky-using-viem/build-on-celo/cel2-architecture/cel2/bridging/withdrawing-celo-from-l2-to-l1-using-viem/build-on-celo/cel2-architecture/cel2/contract-addresses/build-on-celo/cel2-architecture/cel2/decision-tree/build-on-celo/cel2-architecture/cel2/deploy-contract/build-on-celo/cel2-architecture/cel2/developers-builders/build-on-celo/cel2-architecture/cel2/network-information/build-on-celo/cel2-architecture/cel2/notices/native-ETH-bridging/home/bridged-tokens/native-ETH-bridging/cel2/notices/pectra-upgrade/build-on-celo/cel2-architecture/cel2/notices/succinct-upgrade/build-on-celo/cel2-architecture/cel2/operators/community-rpc-provider/build-on-celo/cel2-architecture/cel2/operators/custom-node/build-on-celo/cel2-architecture/cel2/operators/docker-node/build-on-celo/cel2-architecture/cel2/operators/migrate-archive-node/build-on-celo/cel2-architecture/cel2/operators/operator-guide/build-on-celo/cel2-architecture/cel2/test/build-on-celo/cel2-architecture/cel2/validators-in-the-l2/build-on-celo/cel2-architecture/cel2/whats-changed/build-on-celo/cel2-architecture/community/* (16)
/community/StackShift/StackShift/contribute-to-celo/community/celo-sage/celo-sage/contribute-to-celo/community/celo-sage/complete-your-tutorial/contribute-to-celo/community/celo-sage/contribution-guidelines/contribute-to-celo/community/celo-sage/faq/operate/operators/faq/community/celo-sage/submit-application/contribute-to-celo/community/celo-sage/tutorial-structure/contribute-to-celo/community/code-of-conduct/contribute-to-celo/community/contributing/contribute-to-celo/community/fundraising/contribute-to-celo/community/grant-playbook/contribute-to-celo/community/guidelines/contribute-to-celo/community/join-the-community/contribute-to-celo/community/release-process/README/contribute-to-celo/community/release-process/celo-oracles/contribute-to-celo/community/translation-contributors/contribute-to-celo/celo-codebase/* (14)
/celo-codebase/protocol/README/home/protocol/celo-codebase/protocol/bridging/bridging-to-celo-zh_cn/home/protocol/celo-codebase/protocol/consensus/README/home/protocol/celo-codebase/protocol/governance/tooling/libraries-sdks/cli/governance/celo-codebase/protocol/identity/README/home/protocol/celo-codebase/protocol/proof-of-stake/README/home/protocol/celo-codebase/protocol/stability/README/home/protocol/celo-codebase/protocol/stability/tobin-tax/home/protocol/celo-codebase/protocol/transactions/home/protocol/celo-codebase/protocol/transactions/README/home/protocol/celo-codebase/protocol/transactions/full-node-incentives/home/protocol/celo-codebase/protocol/transactions/tx-comment-encyption/home/protocol/celo-codebase/style-guide/typescript/home/protocol/celo-codebase/wallet/README/home/protocol/general/* (13)
/general/celo_l1_index/home/general/ecosystem/guides/create-proposal/home/general/ecosystem/guides/fundraising/home/general/ecosystem/guides/grant-playbook/home/general/ecosystem/guides/guidelines/home/general/gallery/home/general/glossary/home/general/using-celo/bridging/home/general/using-celo/dexes/home/general/using-celo/voting/home/protocol/staking/voting/general/using-celo/wallets/home/wallets/general/web2-to-web3/home/general/whitepapers/home/build-on-celo/* (11)
/build-on-celo/build-with-ai/celina/api//build-on-celo/build-with-ai/celina/hosted-mcp//build-on-celo/build-with-ai/celina/mcp/build-on-celo/build-with-ai/mcp/build-on-celo/build-with-ai/celina/sdk//build-on-celo/build-with-ai/examples/build-with-nebula//build-on-celo/build-with-ai/mcp/composer-mcp//build-on-celo/build-with-ai/multi-agent-systems//build-on-celo/build-with-ai/tools//build-on-celo/build-with-bridge//build-on-celo/build-with-thirdweb/one-click quickstart//build-on-celo/build-with-zk-identity//getting-started/* (10)
/getting-started/faucet//getting-started/glossary//getting-started/new-page//getting-started/running-a-full-node-in-alfajores//getting-started/running-a-validator-in-baklava//getting-started/using-the-wallet//getting-started/wallets/using-metamask-with-celo/choosing-the-right-gas-price//getting-started/wallets/using-metamask-with-celo/metamask-setup//getting-started/wallets/using-metamask-with-celo/metamask-valora-import//getting-started/wallets/using-metamask-with-celo/programmatic-setup//tooling/* (10)
/tooling/libraries-sdks/cli/dkg//tooling/libraries-sdks/cli/exchange//tooling/libraries-sdks/cli/lockedgold//tooling/libraries-sdks/cli/utils//tooling/libraries-sdks/rainbowkit-celo//tooling/plumo//tooling/testnets/alfajores//tooling/testnets/baklava//tooling/testnets/eclair//tooling/testnets/mainnet//legacy/* (8)
/legacy/node/run-alfajores/home/legacy/node/run-baklava/home/legacy/protocol/consensus/home/legacy/protocol/identity/tooling/libraries-sdks/cli/identity/legacy/protocol/pos/home/legacy/protocol/stability/home/legacy/protocol/transaction/home/legacy/validator/tooling/libraries-sdks/cli/validator/bridge/* (7)
/bridge/home/bridged-tokens/bridges/bridge/etherscan/native-assets/home/bridged-tokens/bridges/bridge/etherscan/tokens/snippets/tokens/bridge/optics/home/bridged-tokens/bridges/bridge/optics/faq/operate/operators/faq/bridge/optics/gui/home/bridged-tokens/bridges/bridge/optics/migration-v2/home/bridged-tokens/bridges/holder/* (7)
/holder//holder/manage/exchange//holder/recover/from-celo-address//holder/recover/from-eth-address//holder/vote/governance/tooling/libraries-sdks/cli/governance/holder/vote/governance-parameters//holder/vote/validator/tooling/libraries-sdks/cli/validator/what-is-celo/* (3)
/what-is-celo/celo-website/home/what-is-celo/using-celo/glossary/home/what-is-celo/using-celo/native-bridging/home/validator/* (2)
/validator/tooling/libraries-sdks/cli/validator/validator/validator-explorer/home/home/* (2)
/home/manage/exchange//home/protocol/consensus//about-celo/* (1)
/about-celo//broken/* (1)
/broken//command-line-interface/* (1)
/command-line-interface/registry//FAQs/* (1)
/FAQs//GLOSSARY/* (1)
/GLOSSARY//celo-holder-guide/* (1)
/celo-holder-guide/overview/tooling/overview/glossary/* (1)
/glossary//important-information/* (1)
/important-information/mainnet-network-disclaimer//markdown-features/* (1)
/markdown-features//network/* (1)
/network/cannoli//oracle/* (1)
/oracle/tooling/libraries-sdks/cli/oracle/thank-you/* (1)
/thank-you//uniswap-addresses/* (1)
/uniswap-addresses//welcome/* (1)
/welcome//example/* (1)
/example//index_old/* (1)
/index_old/GigaHierz commentedon Sep 2, 2026
Handing over the three bulk buckets from #2299. An earlier revision of that branch added them as catch-all wildcards; the commit was dropped so #2299 matches its stated scope, and the review of it produced two concrete findings that should shape whatever lands here.
/v2/:slug* → /discards mappings we already haveThree
/v2/about/*paths are the same pages that #2299 maps by hand:/v2/pathdocs/v2/about/our-history.md/general/historydocs/v2/about/using-celo/gas-fees.md/general/using-celo/gas-feesdocs/v2/about/ecosystem/daos.md/general/ecosystem/daosUnder a bare wildcard a reader arriving from
/v2/about/using-celo/gas-feesgets the homepage while the/general/twin gets the gas-fees page. Either add the handful of/v2/about/*entries above the wildcard, or hold the wildcard until this bucket is triaged./developer-resources/:slug* → <landing>swallows 501 files501 files lived under
developer-resources/historically, 141 of them underdeveloper-resources/contractkit/. One catch-all sends all 501 to a single landing page, which is a long way from "the nearest page that answers the same question" (AGENTS.md §2). One entry above the catch-all covers the largest bucket:{ "source": "/developer-resources/contractkit/:slug*", "destination": "/tooling/libraries-sdks/contractkit" }Ordering is load-bearing
Mintlify takes the first match. Specific entries must sit above any wildcard that would swallow them — appending them at the end of the array, where bulk additions naturally go, silently does nothing. #2299 hit this with
/about-celo/:slug*and had to insert three entries above it.The audit's source list was not live-checked
I checked all 51 sources #2299 adds against production: 48 return 404, 3 already return 200 (
/community/release-process,/developer-resources/contractkit,/developer-resources/forno). So roughly 6% of sources derived from git history are already handled by something outsidedocs.json.Explicit entries still beat whatever is handling them, so this is not a correctness problem — but the same method produced the ~215 untriaged paths and the three bulk buckets, and at this scale a wildcard placed over already-working URLs could replace a good resolution with a worse one. Worth adding a live-status pass to the method before triaging the rest.
Also worth avoiding here
Two chains that #2299's review caught, both created by pages that moved after the audit ran:
/tooling/testnets/celo-sepolia/disclaimer(now a source, from #2293) and/contribute-to-celo/daos(now a source, from #2301). Any bulk addition here should re-resolve destinations againstmainat the time it lands, not at the time the audit ran.palango commentedon Oct 1, 2026
@GigaHierz the first four items are done (#2299, #2328, #2329), and I've ticked them in the description. Two are left: checking that the GA4 "Page Not Found" share has dropped since the 2026-09-24 deploy, and the Search Console /
page_path404 tracking. Could you check both and close this issue if they're covered? If the tracking is better handled separately, a follow-up issue for it is fine too.GigaHierz commentedon Oct 1, 2026
Closing: every repo-side item is done (#2299, #2328, #2329, #2353) and
mint broken-links --check-redirectsis enforced in CI. The two remaining measurement items, re-measuring the 404 share and tracking 404 paths, move to a follow-up issue because the GA4 baseline only covers a few days.