Skip to content

task: Audit historical architecture changes and add missing redirects (Page Not Found is the #4 most-viewed page in GA4) #2298

Closed

Description

@GigaHierz

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)
  • 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

  1. 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.

  2. 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.

  3. ~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

Non-goals / dependencies

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

  1. GigaHierz commented on Aug 31, 2026

    @GigaHierz
    ContributorAuthor

    Slice 1 (33 high-confidence redirects) is up in #2299.

  2. GigaHierz commented on Aug 31, 2026

    @GigaHierz
    ContributorAuthor

    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-fallback and retire? 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/bridges may 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)

    old URL proposed target basis
    /protocol /home/protocol audit-suggest
    /protocol/bridge/etherscan-native-asset /home/protocol section-fallback
    /protocol/bridge/etherscan-token /home/protocol section-fallback
    /protocol/bridge/optics /home/protocol section-fallback
    /protocol/bridge/optics-add-new-token /home/protocol section-fallback
    /protocol/bridge/optics-faq /home/protocol section-fallback
    /protocol/bridge/optics-gui /home/protocol section-fallback
    /protocol/bridge/optics-gui-kr /home/protocol section-fallback
    /protocol/bridge/optics-gui-zh-cn /home/protocol section-fallback
    /protocol/bridge/optics-migration-v2 /home/protocol section-fallback
    /protocol/bridging/bridging-native-assets /home/protocol section-fallback
    /protocol/bridging/bridging-to-celo /home/protocol section-fallback
    /protocol/bridging/bridging-tokens-with-etherscan /home/protocol section-fallback
    /protocol/bridging/migrating-to-optics-v2 /home/protocol section-fallback
    /protocol/bridging/optics-bridge-faq /home/protocol section-fallback
    /protocol/bridging/optics-gui /home/protocol section-fallback
    /protocol/bridging/optics-gui-kr /home/protocol section-fallback
    /protocol/bridging/optics-gui-zh_cn /home/protocol section-fallback
    /protocol/consensus /home/protocol section-fallback
    /protocol/governance/create-proposal /home/protocol section-fallback
    /protocol/identity /tooling/libraries-sdks/cli/identity audit-suggest
    /protocol/identity/encrypted-cloud-backup /home/protocol section-fallback
    /protocol/identity/metadata /home/protocol/metadata audit-suggest
    /protocol/identity/odis-domain /home/protocol section-fallback
    /protocol/identity/odis-domain-sequential-delay-domain /home/protocol section-fallback
    /protocol/identity/odis-use-case-key-hardening /home/protocol section-fallback
    /protocol/identity/odis-use-case-phone-number-privacy /home/protocol section-fallback
    /protocol/identity/privacy-research /home/protocol section-fallback
    /protocol/identity/randomness /home/protocol section-fallback
    /protocol/identity/smart-contract-accounts /home/protocol section-fallback
    /protocol/optics /home/protocol section-fallback
    /protocol/oracle /tooling/libraries-sdks/cli/oracle audit-suggest
    /protocol/oracle/chainlink /home/protocol section-fallback
    /protocol/oracles/band-protocol-how-to /home/protocol section-fallback
    /protocol/oracles/oracles-on-celo /home/protocol section-fallback
    /protocol/oracles/redstone-protocol-how-to /home/protocol section-fallback
    /protocol/plumo /home/protocol section-fallback
    /protocol/pos /home/protocol section-fallback
    /protocol/pos/becoming-a-validator /home/protocol section-fallback
    /protocol/precompiles /home/protocol section-fallback
    /protocol/stability/adding-stable-assets /home/protocol section-fallback
    /protocol/stability/doto /home/protocol section-fallback
    /protocol/stability/granda-mento /home/protocol section-fallback
    /protocol/stability/oracles /tooling/oracles audit-suggest
    /protocol/stability/stability-fees /home/protocol section-fallback
    /protocol/stability/tobin-tax /home/protocol section-fallback
    /protocol/token-bridges /home/protocol section-fallback
    /protocol/transaction /home/protocol section-fallback
    /protocol/transaction/full-node-incentives /home/protocol section-fallback

    /developer/* (28)

    old URL proposed target basis
    /developer/build-on-minipay/enabling-testnet / retire?
    /developer/build-on-minipay/prerequisites/android-studio-setup / retire?
    /developer/build-with-ai/examples / retire?
    /developer/build-with-ai/resources / retire?
    /developer/build-with-ai/tools / retire?
    /developer/celo-ethers-wrapper / retire?
    /developer/dappkit / retire?
    /developer/dappkit/setup /tooling/wallets/ledger/setup audit-suggest
    /developer/dev-environments/overview /tooling/overview audit-suggest
    /developer/examples/chainlink-ccip / retire?
    /developer/faucet / retire?
    /developer/react-celo / retire?
    /developer/socialconnect / retire?
    /developer/tools / retire?
    /developer/walkthrough/hello-celo / retire?
    /developer/walkthrough/hello-contract-remote-node / retire?
    /developer/walkthrough/hello-contracts / retire?
    /developer/walkthrough/no-code-erc20 / retire?
    /developer/walkthrough/no-code-erc721 / retire?
    /developer/walkthrough/using-js-keystores / retire?
    /developer/walkthrough/web-dapp / retire?
    /developer/walkthroughs/hello-contract-remote-node / retire?
    /developer/walkthroughs/hellocelo / retire?
    /developer/walkthroughs/hellocontracts / retire?
    /developer/walkthroughs/valora-wc-v1 / retire?
    /developer/web3modal / retire?
    /developer/web3modal/ethers /tooling/libraries-sdks/ethers audit-suggest
    /developer/web3modal/wagmi / retire?

    /cel2/* (23)

    old URL proposed target basis
    /cel2/add-cel2-testnet-to-metamask /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/bridging-celo-from-holesky-to-alfajores-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/bridging-celo-from-holesky-to-dango-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/bridging-celo-from-l1-to-l2-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/withdrawing-celo-from-alfajores-to-holesky-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/withdrawing-celo-from-dango-to-holesky-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/bridging/withdrawing-celo-from-l2-to-l1-using-viem /build-on-celo/cel2-architecture section-fallback
    /cel2/contract-addresses /build-on-celo/cel2-architecture section-fallback
    /cel2/decision-tree /build-on-celo/cel2-architecture section-fallback
    /cel2/deploy-contract /build-on-celo/cel2-architecture section-fallback
    /cel2/developers-builders /build-on-celo/cel2-architecture section-fallback
    /cel2/network-information /build-on-celo/cel2-architecture section-fallback
    /cel2/notices/native-ETH-bridging /home/bridged-tokens/native-ETH-bridging basename
    /cel2/notices/pectra-upgrade /build-on-celo/cel2-architecture section-fallback
    /cel2/notices/succinct-upgrade /build-on-celo/cel2-architecture section-fallback
    /cel2/operators/community-rpc-provider /build-on-celo/cel2-architecture section-fallback
    /cel2/operators/custom-node /build-on-celo/cel2-architecture section-fallback
    /cel2/operators/docker-node /build-on-celo/cel2-architecture section-fallback
    /cel2/operators/migrate-archive-node /build-on-celo/cel2-architecture section-fallback
    /cel2/operators/operator-guide /build-on-celo/cel2-architecture section-fallback
    /cel2/test /build-on-celo/cel2-architecture section-fallback
    /cel2/validators-in-the-l2 /build-on-celo/cel2-architecture section-fallback
    /cel2/whats-changed /build-on-celo/cel2-architecture section-fallback

    /community/* (16)

    old URL proposed target basis
    /community/StackShift/StackShift /contribute-to-celo section-fallback
    /community/celo-sage/celo-sage /contribute-to-celo section-fallback
    /community/celo-sage/complete-your-tutorial /contribute-to-celo section-fallback
    /community/celo-sage/contribution-guidelines /contribute-to-celo section-fallback
    /community/celo-sage/faq /operate/operators/faq audit-suggest
    /community/celo-sage/submit-application /contribute-to-celo section-fallback
    /community/celo-sage/tutorial-structure /contribute-to-celo section-fallback
    /community/code-of-conduct /contribute-to-celo section-fallback
    /community/contributing /contribute-to-celo section-fallback
    /community/fundraising /contribute-to-celo section-fallback
    /community/grant-playbook /contribute-to-celo section-fallback
    /community/guidelines /contribute-to-celo section-fallback
    /community/join-the-community /contribute-to-celo section-fallback
    /community/release-process/README /contribute-to-celo section-fallback
    /community/release-process/celo-oracles /contribute-to-celo section-fallback
    /community/translation-contributors /contribute-to-celo section-fallback

    /celo-codebase/* (14)

    old URL proposed target basis
    /celo-codebase/protocol/README /home/protocol section-fallback
    /celo-codebase/protocol/bridging/bridging-to-celo-zh_cn /home/protocol section-fallback
    /celo-codebase/protocol/consensus/README /home/protocol section-fallback
    /celo-codebase/protocol/governance /tooling/libraries-sdks/cli/governance audit-suggest
    /celo-codebase/protocol/identity/README /home/protocol section-fallback
    /celo-codebase/protocol/proof-of-stake/README /home/protocol section-fallback
    /celo-codebase/protocol/stability/README /home/protocol section-fallback
    /celo-codebase/protocol/stability/tobin-tax /home/protocol section-fallback
    /celo-codebase/protocol/transactions /home/protocol section-fallback
    /celo-codebase/protocol/transactions/README /home/protocol section-fallback
    /celo-codebase/protocol/transactions/full-node-incentives /home/protocol section-fallback
    /celo-codebase/protocol/transactions/tx-comment-encyption /home/protocol section-fallback
    /celo-codebase/style-guide/typescript /home/protocol section-fallback
    /celo-codebase/wallet/README /home/protocol section-fallback

    /general/* (13)

    old URL proposed target basis
    /general/celo_l1_index /home section-fallback
    /general/ecosystem/guides/create-proposal /home section-fallback
    /general/ecosystem/guides/fundraising /home section-fallback
    /general/ecosystem/guides/grant-playbook /home section-fallback
    /general/ecosystem/guides/guidelines /home section-fallback
    /general/gallery /home section-fallback
    /general/glossary /home section-fallback
    /general/using-celo/bridging /home section-fallback
    /general/using-celo/dexes /home section-fallback
    /general/using-celo/voting /home/protocol/staking/voting audit-suggest
    /general/using-celo/wallets /home/wallets audit-suggest
    /general/web2-to-web3 /home section-fallback
    /general/whitepapers /home section-fallback

    /build-on-celo/* (11)

    old URL proposed target basis
    /build-on-celo/build-with-ai/celina/api / retire?
    /build-on-celo/build-with-ai/celina/hosted-mcp / retire?
    /build-on-celo/build-with-ai/celina/mcp /build-on-celo/build-with-ai/mcp audit-suggest
    /build-on-celo/build-with-ai/celina/sdk / retire?
    /build-on-celo/build-with-ai/examples/build-with-nebula / retire?
    /build-on-celo/build-with-ai/mcp/composer-mcp / retire?
    /build-on-celo/build-with-ai/multi-agent-systems / retire?
    /build-on-celo/build-with-ai/tools / retire?
    /build-on-celo/build-with-bridge / retire?
    /build-on-celo/build-with-thirdweb/one-click quickstart / retire?
    /build-on-celo/build-with-zk-identity / retire?

    /getting-started/* (10)

    old URL proposed target basis
    /getting-started/faucet / retire?
    /getting-started/glossary / retire?
    /getting-started/new-page / retire?
    /getting-started/running-a-full-node-in-alfajores / retire?
    /getting-started/running-a-validator-in-baklava / retire?
    /getting-started/using-the-wallet / retire?
    /getting-started/wallets/using-metamask-with-celo/choosing-the-right-gas-price / retire?
    /getting-started/wallets/using-metamask-with-celo/metamask-setup / retire?
    /getting-started/wallets/using-metamask-with-celo/metamask-valora-import / retire?
    /getting-started/wallets/using-metamask-with-celo/programmatic-setup / retire?

    /tooling/* (10)

    old URL proposed target basis
    /tooling/libraries-sdks/cli/dkg / retire?
    /tooling/libraries-sdks/cli/exchange / retire?
    /tooling/libraries-sdks/cli/lockedgold / retire?
    /tooling/libraries-sdks/cli/utils / retire?
    /tooling/libraries-sdks/rainbowkit-celo / retire?
    /tooling/plumo / retire?
    /tooling/testnets/alfajores / retire?
    /tooling/testnets/baklava / retire?
    /tooling/testnets/eclair / retire?
    /tooling/testnets/mainnet / retire?

    /legacy/* (8)

    old URL proposed target basis
    /legacy/node/run-alfajores /home section-fallback
    /legacy/node/run-baklava /home section-fallback
    /legacy/protocol/consensus /home section-fallback
    /legacy/protocol/identity /tooling/libraries-sdks/cli/identity audit-suggest
    /legacy/protocol/pos /home section-fallback
    /legacy/protocol/stability /home section-fallback
    /legacy/protocol/transaction /home section-fallback
    /legacy/validator /tooling/libraries-sdks/cli/validator audit-suggest

    /bridge/* (7)

    old URL proposed target basis
    /bridge /home/bridged-tokens/bridges section-fallback
    /bridge/etherscan/native-assets /home/bridged-tokens/bridges section-fallback
    /bridge/etherscan/tokens /snippets/tokens audit-suggest
    /bridge/optics /home/bridged-tokens/bridges section-fallback
    /bridge/optics/faq /operate/operators/faq audit-suggest
    /bridge/optics/gui /home/bridged-tokens/bridges section-fallback
    /bridge/optics/migration-v2 /home/bridged-tokens/bridges section-fallback

    /holder/* (7)

    old URL proposed target basis
    /holder / retire?
    /holder/manage/exchange / retire?
    /holder/recover/from-celo-address / retire?
    /holder/recover/from-eth-address / retire?
    /holder/vote/governance /tooling/libraries-sdks/cli/governance audit-suggest
    /holder/vote/governance-parameters / retire?
    /holder/vote/validator /tooling/libraries-sdks/cli/validator audit-suggest

    /what-is-celo/* (3)

    old URL proposed target basis
    /what-is-celo/celo-website /home section-fallback
    /what-is-celo/using-celo/glossary /home section-fallback
    /what-is-celo/using-celo/native-bridging /home section-fallback

    /validator/* (2)

    old URL proposed target basis
    /validator /tooling/libraries-sdks/cli/validator audit-suggest
    /validator/validator-explorer /home section-fallback

    /home/* (2)

    old URL proposed target basis
    /home/manage/exchange / retire?
    /home/protocol/consensus / retire?

    /about-celo/* (1)

    old URL proposed target basis
    /about-celo / retire?

    /broken/* (1)

    old URL proposed target basis
    /broken / retire?

    /command-line-interface/* (1)

    old URL proposed target basis
    /command-line-interface/registry / retire?

    /FAQs/* (1)

    old URL proposed target basis
    /FAQs / retire?

    /GLOSSARY/* (1)

    old URL proposed target basis
    /GLOSSARY / retire?

    /celo-holder-guide/* (1)

    old URL proposed target basis
    /celo-holder-guide/overview /tooling/overview audit-suggest

    /glossary/* (1)

    old URL proposed target basis
    /glossary / retire?

    /important-information/* (1)

    old URL proposed target basis
    /important-information/mainnet-network-disclaimer / retire?

    /markdown-features/* (1)

    old URL proposed target basis
    /markdown-features / retire?

    /network/* (1)

    old URL proposed target basis
    /network/cannoli / retire?

    /oracle/* (1)

    old URL proposed target basis
    /oracle /tooling/libraries-sdks/cli/oracle audit-suggest

    /thank-you/* (1)

    old URL proposed target basis
    /thank-you / retire?

    /uniswap-addresses/* (1)

    old URL proposed target basis
    /uniswap-addresses / retire?

    /welcome/* (1)

    old URL proposed target basis
    /welcome / retire?

    /example/* (1)

    old URL proposed target basis
    /example / retire?

    /index_old/* (1)

    old URL proposed target basis
    /index_old / retire?
  3. added
    size:MA day-ish: several files or needs design thought
    on Sep 2, 2026
  4. GigaHierz commented on Sep 2, 2026

    @GigaHierz
    ContributorAuthor

    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 have

    Three /v2/about/* paths are the same pages that #2299 maps by hand:

    Old /v2/ path Hand-mapped twin in #2299
    docs/v2/about/our-history.md /general/history
    docs/v2/about/using-celo/gas-fees.md /general/using-celo/gas-fees
    docs/v2/about/ecosystem/daos.md /general/ecosystem/daos

    Under a bare wildcard a reader arriving from /v2/about/using-celo/gas-fees gets 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 files

    501 files lived under developer-resources/ historically, 141 of them under developer-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 outside docs.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 against main at the time it lands, not at the time the audit ran.

  5. palango commented on Oct 1, 2026

    @palango
    Contributor

    @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_path 404 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.

  6. GigaHierz commented on Oct 1, 2026

    @GigaHierz
    ContributorAuthor

    Closing: every repo-side item is done (#2299, #2328, #2329, #2353) and mint broken-links --check-redirects is 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

choreRefactor, deps, infra, docspriority:highMajor feature broken, workaround existssize:MA day-ish: several files or needs design thoughtstatus: triageNeeds triage

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions