calebfoster-dashboard-api.mindboost.workers.dev/media/... in blog-posts.json, posts.json, and published journal article HTML. Replace with social.calebfoster.ai/media/....generate-weekly-content.js, regen-draft-images.js) to use token headers against social.calebfoster.ai/api/* instead of old Worker URL. Then decommission legacy Worker.Offer schema. This is the primary remaining AEO/GEO gap on the homepage./showcase/learning-carousel/.rgba(255,255,255,0.3–0.45) for secondary text on dark backgrounds, and partial-opacity white on pink — all failing WCAG 1.4.3. Affects: hero subtext, hero em, scroll hint, section-label eyebrows, marquee items, service card descriptions, "Find out more" links, services-header copy, about-left body, stat labels, FAQ answer body, service-panel numbers. Fix: set a hard alpha floor of 0.7 on dark, solid white on pink. One design-token pass clears ~15 Major findings. Needs visual review before shipping — intentional aesthetic, subtle change.aria-modal="true" but have no JS focus trap — Tab from the close button leaks into the background page. This breaks WCAG 2.4.3 (Focus Order) and 4.1.2. Fix: copy the existing mobile menu trapFocus pattern at L1788–1797 into both panel open/close handlers. ~45 mins JS work.<div role="button"> with inline onclick + onkeydown. Keyboard handling is functional but fragile. Replace with native <button> elements — removes the onkeydown workaround, inherits semantics, and satisfies WCAG 4.1.2 properly.aria-label ("Service details", "Common questions") instead of aria-labelledby pointing at the visible title. Screen readers announce the hardcoded label rather than the actual service name (Discovery / Project Support / Ongoing Refinement). Fix: add aria-labelledby="servicePanelTitle" and update the JS to set the title element's id per card..service-link elements all read "Find out more" — identical link text breaks WCAG 2.4.4 (Link Purpose). Screen reader users can't distinguish them. Fix: add aria-label per link, e.g. "Find out more about Discovery", "Find out more about Project Support", "Find out more about Ongoing Refinement".<img alt="Caleb Foster"> inside an aria-label="Caleb Foster — Home" anchor — name announced twice by screen readers. Fix: set alt="" on the img. (2) Hamburger has a redundant style="display:none" — already handled by shared.css and overridden at the breakpoint; remove the inline style. Apply to all four pages simultaneously (index, journal, showcase, Worker template).DB: 0f5ff29d), R2 bucket (scorm-lms-content), 3 env vars, custom domain lms.calebfoster.ai, CF Access policy. Do together with social dashboard migration.FLAGS), R2 binding (dashboard-media), custom domain social.calebfoster.ai, CF Access policy. Plan for minimal downtime — do on a weekend.scorm-lms/index.html calls backend API routes that don't exist. Build the full backend using Cloudflare Pages Functions + R2 (file storage) + D1 (SQLite database). Scope: upload SCORM zip → parse manifest → store files in R2 → register in D1 → enrol learner → generate launch token → serve course in iframe with SCORM 1.2 API shim → track completion back to D1 → reports page. One-time setup: create R2 bucket scorm-lms-content and D1 database scorm-lms-db, add bindings in Pages project settings. Also need to exclude /launch/* and /api/scorm/* routes from Cloudflare Access so learners can reach their courses without being behind the Access wall. Full brief at workspace/team/briefs/STU-BRIEF-scorm-lms-backend.md.https://dash.cloudflare.com/09e6c2b56bf25401cab6a51d8b76625b/domains/transferops.calebfoster.ai is a Direct Upload Pages project — every change to workspace/learning-components/ requires a manual wrangler pages deploy or the site stays stale. ~20 min fix: delete and recreate calebfoster-ai-ops as a Git-connected project linked to fosterc1/learning-components. Restore: custom domain ops.calebfoster.ai, CF Access policy. No bindings needed (static site). Do at the same time as social dashboard migration.mb CLI (create, dev, build, package, content-template, content-import, asset-import, export-strings, import-strings, serve --review, review-link); Card Carousel ported as first component with full contentSchema + RTL CSS; CSS custom property theme system; XLIFF localisation pipeline with language picker; preview shell separable from SCORM shell (foundation for Phase 2 review tool). Private repo: mindboost-studio/freedom. Docs site: freedom.mindboost.dev. Phase 1 gate: developer can clone, create a course, and ship a valid SCORM zip in 15 minutes. Full brief: workspace/team/briefs/STU-BRIEF-freedom-framework.md. Product guide: workspace/team/briefs/FREEDOM-PRODUCT-GUIDE.md. Pitch deck: ops.calebfoster.ai/freedom/. Skill: workspace/skills/freedom/SKILL.md. Phase 2: BaxterStorey Neurodiversity course + client review tool + issue tracker. Phase 3: commercialise — open-source core + premium component packs.workspace/tmp-7steps.pdf.workspace/team/briefs/OWEN-BRIEF-mindboost-design-system.md. Share URL: https://claude.ai/design/p/019e1d74-a8fd-7382-a934-50e776cf62c4?via=share. Minor note: border radius generated at 8–12px vs 16px in brief — revisit when publishing. Update figma-design skill with final file URL once published.