Redirecting the old Community Framework URLs

Redirecting the old Community Framework URLs

The Framework and its catalogue now live on eeg101.eu, but the old sites are separate deployments on their own subdomains, so their redirects must be applied in their own repositories. Everything needed is below; neither change has been pushed, because both are outside this repository.

Apply these after the new pages are live, and keep the redirects in place indefinitely — these URLs are in the published literature, in emails, and on slides.

Do the signatory step first. Until the SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY secrets are added to this repository, the nightly sync reads the signatory list from sign-cf.eeg101.eu/signatories/. Redirect that page before adding the secrets and the list on this site silently stops updating — it will not fail, it will just freeze at whatever it last read. So either add the two secrets first (see docs/community-framework-operations.md), or leave the signatories.md entry out of the redirect map below until you have. The sync job’s log says which source each run used.


1. catalog-cf.eeg101.eu → /library/

eeg101-costaction/catalog-cf is a Next.js app on Vercel, so redirects belong in next.config.mjs. Replace the file with:

/** @type {import('next').NextConfig} */
const nextConfig = {
  /* config options here */
  reactCompiler: true,

  // The catalogue moved into the main EEG101 site. These URLs are cited in
  // papers and emails, so the redirects are permanent and stay indefinitely.
  async redirects() {
    const CATALOGUE = "https://www.eeg101.eu/library/#framework";
    return [
      { source: "/", destination: CATALOGUE, permanent: true },
      { source: "/resources", destination: CATALOGUE, permanent: true },
      // A deep link to one resource has no equivalent single page, so it lands
      // on the catalogue, where the resource is searchable by name.
      { source: "/resources/:id", destination: CATALOGUE, permanent: true },
      { source: "/about", destination: "https://www.eeg101.eu/framework/", permanent: true },
      // Anything else that is not the API.
      { source: "/:path((?!api/).*)", destination: CATALOGUE, permanent: true },
    ];
  },
};

export default nextConfig;

permanent: true issues a 308, which search engines treat as a permanent move and which preserves the request method.

Leave /api/* alone until you are sure nothing consumes it.


2. sign-cf.eeg101.eu → /framework/

eeg101-costaction/sign-cf is MkDocs published to GitHub Pages, which serves static files only and so cannot issue a real HTTP redirect. Use the mkdocs-redirects plugin, which writes a meta-refresh stub plus a canonical link for each old page — enough for both browsers and search engines.

Step 1. Add the dependency in pyproject.toml:

dependencies = [
    "mkdocs>=1.6.1",
    "mkdocs-autorefs>=1.4.2",
    "mkdocs-include-markdown-plugin>=7.1.5",
    "mkdocs-material>=9.6.5",
    "mkdocs-redirects>=1.2.2",
    "supabase>=2.17.0",
    ...
]

Step 2. Add the plugin in mkdocs.yml:

plugins:
  - include-markdown
  - autorefs
  - redirects:
      redirect_maps:
        index.md: https://www.eeg101.eu/framework/
        signatories.md: https://www.eeg101.eu/framework/signatories/
        glossary.md: https://www.eeg101.eu/framework/glossary/
        references.md: https://www.eeg101.eu/framework/references/
        contributors.md: https://www.eeg101.eu/framework/contributors/
        # The five section files are listed under `not_in_nav` in mkdocs.yml,
        # but MkDocs still builds each as a standalone page, so /introduction/,
        # /validity/, /democratization/, /responsibility/ and /conclusion/ are
        # all live today (verified: HTTP 200) as duplicates of the home page.
        # They need redirects too, each to its anchor on the one-page document.
        introduction.md: https://www.eeg101.eu/framework/
        validity.md: https://www.eeg101.eu/framework/#cf-validity
        democratization.md: https://www.eeg101.eu/framework/#cf-democratization
        responsibility.md: https://www.eeg101.eu/framework/#cf-responsibility
        conclusion.md: https://www.eeg101.eu/framework/#cf-conclusion

Step 3. Keep the nightly build_docs.yml workflow running for now. It is harmless, and it keeps the old signatory page accurate for as long as the old site is reachable.

Do not delete the repository

sign-cf remains the source of truth for the Framework text. The main site generates its pages from it (scripts/build_framework.py). It also holds the database schema and the Google Sheets export. Retire the site if you like, but keep the repository.


These were changed in this repository and need nothing further:

Page Was Now
join.md step 2 sign-cf.eeg101.eu/ /framework/
join.md step 2 deep link sign-cf.eeg101.eu/#sign-the-pledge /framework/#cf-sign
join.md closing call to action sign-cf.eeg101.eu/#sign-the-pledge /framework/#cf-sign
join.md work-package glossary /working-groups/ /framework/
_data/resources.yml Framework card sign-cf.eeg101.eu /framework/

One deliberate exception: /framework/signatories/ links to the old signatory list only while this site’s own list is empty, so visitors are never shown a blank page. It disappears as soon as the Supabase secrets are added and the nightly sync runs.


4. Checking the redirects afterwards

for u in https://catalog-cf.eeg101.eu/ \
         https://catalog-cf.eeg101.eu/resources \
         https://sign-cf.eeg101.eu/ \
         https://sign-cf.eeg101.eu/glossary/; do
  printf '%-46s ' "$u"
  curl -s -o /dev/null -w '%{http_code} -> %{redirect_url}\n' "$u"
done

The Next.js URLs should answer 308 with a Location header. The MkDocs URLs answer 200 with a meta-refresh in the body, which is expected for GitHub Pages.