crescendo

Certificate bundle — rehosting handoff

Do not rename or restructure this folder. Every file in it is referenced by absolute URL from somewhere outside this repo — most importantly from the LinkedIn posts the 18 pilot graduates made in May 2026.

What’s here

Contents Count
Certificate pages cp-2026-XXXXXX.html 20
Matching share images cp-2026-XXXXXX.png 20
Matching cp-2026-XXXXXX.pdf 20
lyric-logo.png, og-default.png 2
Total 62 files, 4.6 MB

Generator scripts live in ../pilot/certificates/scripts/ (generate_share_cards.py, generate_pdfs.py). The template is ../pilot/certificates/crescendo_certificate.html. The name roster is ../pilot/certificates/cohort_certificates.md, which is gitignored on purpose — it lists cohort members by name and is not for public hosting.

The thing that will break

These files, plus the generator and template in ../pilot/certificates/, contain 89 hardcoded https://lyriccrescendopilot.tech/... URLs:

Where Count What it is
cert/cp-2026-*.html 40 …/cert/cp-2026-XXXXXX.png — the og:image / twitter:image tags. These render the preview card in a LinkedIn post.
cert/cp-2026-*.html 40 …/cert/cp-2026-XXXXXX.html — canonical and share URL on each page
cert/cp-2026-*.html 2 …/cert/og-default.png
../pilot/certificates/scripts/generate_share_cards.py 3 Templated …/cert/{slug_id}.html and .pngthe generator itself mints the dead domain, so any future certificate is born broken
../pilot/certificates/crescendo_certificate.html 1 Self-referencing example link
../pilot/certificates/linkedin_certification.md, cohort_certificates.md 3 The bare domain in graduate-facing instructions

One further wrinkle: the template used to live at /crescendo_certificate.html at the domain root and now sits at pilot/certificates/. Any URL of the form …/crescendo_certificate.html?name=… needs its path updated too, not just its host.

Copying this folder to a new host without rewriting those URLs produces pages that still point at a dead domain: the certificates will load but their share cards and canonical links will 404.

Sequencing — this matters

lyriccrescendopilot.tech currently resolves to GitHub Pages (185.199.108–111.153) via the repo’s CNAME file. The moment either the CNAME is deleted or the DNS records are pulled, every certificate link in every graduate’s LinkedIn post 404s.

Do it in this order:

  1. Stand up the new host and confirm the certificates load there.
  2. Run the rewrite below against the new base URL.
  3. Only then remove DNS / delete CNAME.
  4. Ideally leave a redirect from the old domain to the new one for a few months. Graduates cannot edit the link in a LinkedIn post they published in May.

Rewrite command

# from the repo root, with NEWBASE set to the new host (no trailing slash)
NEWBASE="https://certificates.lyric.tech"
grep -rl 'https://lyriccrescendopilot.tech' cert/ pilot/certificates/ \
  | xargs sed -i '' "s|https://lyriccrescendopilot.tech|$NEWBASE|g"

# verify nothing was missed
grep -rn 'lyriccrescendopilot' cert/ pilot/certificates/ || echo "clean"

(sed -i '' is the macOS form. On Linux use sed -i.)