mindboost. Backlog
1 Critical
14 High Priority
22 Medium
12 Low
43 Operational
4 Projects
2 Creative
9 Completed

No items match the current filters. Clear filters

Operational 5 tasks
Social proof — add client logo band above CTA
A client logo band (4–6 logos with permission) sitting directly above the CTA section would add third-party credibility at the key conversion moment. Structure: static HTML strip, logos as inline SVG or optimised PNG, meaningful alt text naming each client. No JS needed. Confirm which clients have given approval before shipping.
Owen calebfoster.ai Content
High
Migrate fosterc1 repos to mindboost-studio for automatic enforcement
Org-wide rulesets exist and work on mindboost-studio (confirmed 2026-07-16), but every currently-active repo — mindboost-ops, calebfoster.ai, social-dashboard, scorm-lms, lesson-shell — still lives under the personal fosterc1 account, where GitHub gates branch/tag protection behind a paid Team account. Until each repo moves, the branch ladder is enforced manually only: client-side .githooks (pre-commit version bump, pre-push main-guard) activated per-clone via sh setup.sh, plus process discipline — confirmed bypassable this session when a scratchpad clone skipped setup.sh and pushed straight to main unblocked. Residual (optional, Low): once a repo migrates, also add PR description templates (QA tested · a11y checked · preview URL · Caleb acceptance).
Stu mindboost Infra
Medium
HowTo schema on showcase pages — verify auto-derivation (gated on showcase build)
Showcase pages (e.g. /showcase/learning-carousel/) describe how to use a learning component — a natural fit for HowTo JSON-LD. Blocked on the showcase pages existing (still placeholders today). When built: if they render through the journal/article pipeline, HowTo is auto-derived from ≥3 numbered-step H2s (no manual schema) — so the task is to confirm the render path emits it, and only hand-author HowTo if the showcase uses a different path.
Stu calebfoster.ai SEO
Medium
Build lesson shell live demo in showcase
The /showcase/ index lists a "Lesson Shell" entry but it links to a placeholder. Build out a live demo page — similar to the Card Carousel showcase — showing the lesson shell component in action with usage notes and a code snippet. This is the Freedom Framework's core output and deserves a flagship showcase treatment before the Freedom phase 1 ships.
Stu calebfoster.ai Content
Medium
Credentials rotation schedule — 18 November 2026
Several credentials are now 6+ months old: Cloudflare Access service token (created May 2026), GitHub PAT used by cron scripts, Worker environment secrets. Calendar blocked for 18 November 2026. Document the rotation procedure for each credential in the Architecture page — what to rotate, where it's used, how to update it without downtime.
Caleb mindboost Infra
Medium
Projects 9 projects
Freedom Framework — Phase 1 Infrastructure
Build the Freedom SCORM learning framework — mindboost.'s replacement for Adapt Authoring Tool. Phase 1 (Stu, 3–4 weeks): core framework with section-slot layout + component bus + SCORM shell; mb CLI; Card Carousel ported as first component; CSS custom property theme system; XLIFF localisation pipeline. Private repo: mindboost-studio/freedom. 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.
Stu freedom Dev
High
Showcase: build out placeholder pages
5 showcase entries exist in the sitemap and showcase index but lead to empty/coming-soon pages. Search engines see these as soft-404s or thin content. Build out the pages (preferred) or remove from sitemap and index. Card Carousel is already live at /showcase/learning-carousel/ — identify and build the other 4 placeholders.
Owen calebfoster.ai SEO Content
Medium
lms.Build SCORM LMS backend (v1)
The existing frontend shell at 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 → reports page. Full brief at workspace/team/briefs/STU-BRIEF-scorm-lms-backend.md.
Stu lms Infra Brief ready
Medium
Rebuild mindboostlearning.com — applying calebfoster.ai lessons
Rebuild mindboostlearning.com in the existing mindboost-studio/mindboostlearning.com holding repo, applying the calebfoster.ai stack + lessons. Deploy via CI/wrangler (the org standard — ownership-independent; the lesson from the 2026-06-27 migration), not the Pages git-integration we're migrating away from. As a greenfield build it can start directly on Workers Static Assets (Cloudflare's recommended forward platform). Migrate off the current paid hosting to cut cost — target before December 2026. Prereq: a proper build/architecture blueprint (the existing lessons.md is an ops-rules log, not a build guide).
Stu mindboost Infra
High
Migrate calebfoster.ai → mindboost-studio + Cloudflare CI deploy
Transfer fosterc1/calebfoster.ai → the mindboost-studio org, switch its deploy to CI/wrangler (off the Pages git-integration), and hand off to Claw to re-point the journal worker (which commits article HTML into this repo) + update Claw's skill/cron repo references. Tracked: lesson-shell#394.
Stu calebfoster.ai Infra
Medium
Migrate social-dashboard → mindboost-studio + Cloudflare CI deploy
Updated 2026-07-14 (post-Genspark migration): "hand off to Claw" is no longer possible — Genspark Claw was uninstalled from the Mac mini and the ~16 crons are no longer OpenClaw jobs, they're already GitHub Actions workflows in this repo (the count still holds at ~16). Transfer fosterc1/social-dashboardmindboost-studio, switch deploy to CI/wrangler (preserving its Pages Functions + R2/KV bindings), and directly update the ~16 workflow files' repo references (they already use secrets.GITHUB_TOKEN, so an org transfer should be a path/owner rename, not a re-point of the automation model). The most complex of the site moves. Tracked: lesson-shell#394.
Stu social Infra
Medium
Migrate Freedom (lesson-shell → freedom) → mindboost-studio — the framework split
Transfer + rename fosterc1/lesson-shellmindboost-studio/freedom as part of the engine/content split (D11/D42), reconnect freedom.calebfoster.ai via CI/wrangler, and hand off to Claw to update the freedom skill repo references. Foundational — blocks the course-distribution pipeline. Tracked: lesson-shell#395.
Stu freedom Infra
High
LMS (scorm-lms) → mindboost-studio — finish off
Mostly done (2026-06-27): scorm-lms is already transferred to mindboost-studio + deploying to lms.calebfoster.ai via its GitHub Action. Residual: Disconnect the vestigial Pages git-integration (clears the "repository cannot be accessed" warning), and hand off to Claw to update the ops-and-lms skill repo references.
Stu lms Infra
Low
Migrate ops dashboard (mindboost-ops) → mindboost-studio + Cloudflare CI deploy
Transfer fosterc1/mindboost-opsmindboost-studio, switch deploy to CI/wrangler (preserving the uptime-status Pages Function + UPTIME_KV binding). Note: health-check.yml commits health-check.json directly to main daily (keep that working) and the separate uptime-monitor Worker deploys independently. Hand off to Claw to update the caleb-ops/studio-ops skill repo references. (This is the repo the backlog itself lives in.) Tracked: lesson-shell#394.
Stu ops mindboost Infra
Medium
Creative 3 tasks
7 Steps — redesign as a flagship calebfoster.ai page
The thinking in Caleb's 7-step framework is platinum. The execution isn't. This is a calebfoster.ai personal brand piece — not a mindboost. agency doc. Brief Owen to redesign it for the site: dark premium aesthetic, Caleb's voice, Apple-level execution. One emotional truth per step, the "dream" motif as the spine, no tip bullets. Source PDF at workspace/tmp-7steps.pdf.
Owen calebfoster.ai Content
Medium
Enter the Learning Technologies Awards 2026 — lead with BaxterStorey ‘Belonging More’
Outstanding opportunity to shine: lead the submission with the BaxterStorey ‘Belonging More’ EDI programme and the measurable behaviour change it drove. Entries open now; 25 categories (~£180–190+VAT/entry); shortlist 4 Sep 2026; gala 11 Nov 2026, London. Nestlé GLP-1 is a secondary candidate. (Captured note: Operational/Growth/Industry Awards/Learning Technology Awards 2026.)
Caleb mindboost Content
High
Enter The Learning Awards 2026 (LPI) — BaxterStorey ‘Belonging More’
Second awards entry, run by the LPI (mindboost is LPI-accredited & in their network): showcase the BaxterStorey ‘Belonging More’ EDI programme + the measurable change it drove; Nestlé GLP-1 secondary. Submission = 250-word summary + 1,000-word entry + 2 supporting docs. Deadline 25 Sep 2026, 23:59 UK. Pair with the Learning Technologies Awards entry. (Captured note: Operational/Growth/Industry Awards/LPI Award 2026.)
Caleb mindboost Content
High
Completed 75 tasks
Org-wide branch/tag protection via GitHub Rulesets (mindboost-studio)
Completed 2026-07-16. Confirmed the mindboost-studio org account (unlike the personal fosterc1 account, which GitHub gates behind a paid Team tier for private-repo protection) can and does enforce rulesets automatically — org-wide MFA + Advanced Security, no force-push/deletion on protected branches and v* tags, live on repos hosted there (#134, closed). Split out of the old "PR description templates (branch/tag protection now enforced)" item — that item's claim didn't hold for any of the three actually-active repos, all still on fosterc1; see the new open item "Migrate fosterc1 repos to mindboost-studio for automatic enforcement" for what's still outstanding. CODEOWNERS / required review stays parked — a solo owner can't self-approve a PR, so Caleb's review-before-merge remains the gate until there's a 2nd contributor.
Stu mindboost Infra
Medium
Core Web Vitals — LCP optimisation (closed — root cause is untouchable)
Closed 2026-07-16 — nothing more to do here. Investigated 2026-07-14 with a real PageSpeed Insights run (mobile, Slow 4G): LCP 4.0s (red), every other metric green (TBT 0ms, CLS 0.03, Speed Index 2.7s). Root cause confirmed via the LCP breakdown + render-blocking-requests panels: the LCP element is the Cookiebot consent-dialog text, and ~3s of the 4.0s is render-blocking from Cookiebot's uc.js (1,500ms) + GSAP/ScrollTrigger loaded via blocking <script src> (1,500ms). Both are structurally untouchable: Cookiebot is legally-required synchronous-by-design (consent-before-tracking), and GSAP/ScrollTrigger's obvious fix — adding defer — is a confirmed landmine (breaks the intro loader; Caleb's hit this before, see memory calebfoster-ai-gsap-defer-landmine) because the loader's inline script runs synchronously right after those tags with no DOMContentLoaded gate. The only real fix would be restructuring the loader's script dependency entirely (not a bare attribute change), which is a bigger job than "LCP optimisation" — closing this as investigated-and-accepted rather than leaving it open against work that isn't going to happen. Font async-load fix from the earlier pass is done and stands on its own merit.
Stu calebfoster.ai SEO
Medium
calebfoster.ai — finish the design-system align (retire dark shell + token migration)
Completed 2026-07-16. Both deferred DS-conformance items shipped: retired every remaining dark surface (loader, scrolled nav, footer, marquees, Services + cards, the pinned Work/Showreel section, homepage About teaser, About page credentials) and introduced canonical --mb-* tokens in shared.css as the single source of truth — the ~23 hard-coded pinks/ad-hoc colours are gone. Iterated live against a Cloudflare preview across several review rounds with Caleb; the footer ended up on --slate with inverted white text (his call), not plain white. Found and fixed a real bug along the way — the services auto-cycle-highlight JS was tweening card colours via inline gsap.to({background:'#2a2a2a'}), invisible to a pure CSS review. Applied consistently across all 5 templated surfaces: the 4 main pages (calebfoster.ai PR #20) plus the 13 individually-templated journal articles + their Worker generator source (social-dashboard PRs #6/#7, so the next Re-publish All doesn't regenerate the old dark styling). Also cleaned up 31 orphaned branches across calebfoster.ai/social-dashboard/mindboost-ops as part of the same pass.
Stu calebfoster.ai Dev
Medium
Formal SEO / GEO / AEO audit — 8/10 across all three
Completed 2026-07-14. Full-corpus scan of all 21 real pages (source checked directly, not sampled). Scores: SEO 8/10, GEO 8/10, AEO 8/10 — strong technical foundation (zero heading-hygiene failures across 21/21 pages, 100% alt-text coverage, comprehensive Person/Organization entity graph reused everywhere, FAQ+Speakable schema on all 13 articles, verified question-phrased H2s, self-healing llms.txt) held back by the already-known LCP problem, the 5 dead showcase placeholders, and 2 small nits — both nits fixed same-day: sitemap.xml's legal-page URLs now match their canonical trailing-slash form (social-dashboard@77c4ee8, calebfoster.ai@2e3530f), and /showcase/learning-carousel/ — confirmed by Caleb as a pre-Freedom leftover that should never have shipped — deleted. LocalBusiness/GeoCoordinates schema confirmed intentional (real registered office). Full report: report published as a Claude Artifact (score breakdown + full findings table).
Stu calebfoster.ai SEO
Medium
Agent accessibility — #servicePanel had an empty accessible name pre-open
Resolved 2026-07-14. Found via PageSpeed Insights' new "Agentic Browsing" category (2/3, checks AI-agent browsability): #servicePanel's aria-labelledby pointed at #servicePanelTitle, an empty <div> until JS populates it on open — Lighthouse audits the closed-state DOM and correctly flagged an empty accessible name. Restored a static aria-label="Service details" alongside the existing aria-labelledby as a fallback for the pre-open state; aria-labelledby still wins once populated (calebfoster.ai@d25baed). #faqPanel doesn't have this problem — its title text is static.
Stu calebfoster.ai A11y
Medium
Delete dead orphan terms.html/privacy.html/cookies.html
Resolved 2026-07-14. Caleb confirmed: delete. Removed all 3 (calebfoster.ai@9a128b9) — the real live pages (terms/index.html etc.) are unaffected.
Caleb calebfoster.ai Infra
Medium
Decide: restore or retire /showcase/studio-team/
Resolved 2026-07-14. Caleb confirmed: keep it retired. The redirect in _redirects stays; deleted showcase/studio-team/index.html since it can never be served (calebfoster.ai@9a128b9). The OG/Twitter tags added to it earlier are now moot — the page no longer exists.
Caleb calebfoster.ai SEO
Medium
a11y — Migrate service cards from <div role="button"> to native <button>
Resolved 2026-07-14. Checked the actual CSS first — no nested interactive elements inside the cards, no selectors keyed to role="button" elsewhere, so the migration was safe. Converted all 3 to native <button>, dropped the now-redundant role="button"/tabindex="0"/onkeydown Enter-or-Space workaround, added a standard button CSS reset (appearance:none; border:none; width:100%; text-align:left; font:inherit). Verified no outline:none override exists, so the default focus ring stays visible (calebfoster.ai@38a26b6).
Stu calebfoster.ai A11y
Low
Core Web Vitals — render-blocking Google Fonts fix
Resolved 2026-07-14 (see the Operational item for what's still open). Converted the synchronous render-blocking Google Fonts <link rel="stylesheet"> to the standard non-blocking preload+swap pattern, sitewide: homepage, about, showcase index, journal index, all 13 journal articles, the 3 legal pages, and the Worker's article-generation template (so future articles get it too — social-dashboard@b599e40, calebfoster.ai@38a26b6).
Stu calebfoster.ai SEO
Medium
GEO — Fix stale journal Blog JSON-LD (blogPost array never rebuilt)
Resolved 2026-07-14. Found while auditing the site: getUpdatedJournalIndex() only ever prepended a new entry to the Blog JSON-LD's blogPost array when publishing a single article, and handleRepublishAll called it without that path at all — so the visible journal cards stayed fresh but the schema silently accumulated stale/renamed/deleted article URLs forever (one was a confirmed 404). Fixed the generator to always rebuild the array from the canonical published-posts list, same as the visible cards (social-dashboard@bbfd7a5). Ran Re-publish All (with Caleb's go-ahead) — live schema now has exactly 13 correct entries, zero stale. Also deleted 2 more orphan journal HTML files left over from before the fix (calebfoster.ai@5381d13).
Stu social SEO
Critical
GEO — Publish llms.txt (and llms-full.txt)
Resolved 2026-07-14. Added llms.txt at the site root (Site + Journal + Optional sections, per the llmstxt.org convention). Wired generation into the Worker's handleRepublishAll and single-article publish paths alongside sitemap.xml — regenerates from the canonical published-posts list every time instead of ever going stale (social-dashboard@094c197).
Stu calebfoster.ai GEO
Medium
SEO — Trim /about meta description to ≤160 chars
Resolved 2026-07-14. Trimmed from 176 to 151 characters while keeping the value proposition (calebfoster.ai@5232983).
Stu calebfoster.ai SEO
Low
SEO — showcase/studio-team: add Open Graph + Twitter Card tags
Resolved 2026-07-14, with a caveat. Added full OG + Twitter Card tags reusing the site's standard og-image.png (calebfoster.ai@5232983). Caveat found in the process: the page is currently 301-redirected away by _redirects, so these tags have no live effect until that's resolved — see the new Operational item above.
Stu calebfoster.ai SEO
Low
a11y — aria-expanded on panel toggle controls — already correct
Verified 2026-07-14 — no change needed. Checked the actual JS: openServicePanel/closeServicePanel and openFaqPanel/closeFaqPanel already set aria-expanded dynamically on open/close, and the mobile-nav hamburger does too. Item was stale.
Stu calebfoster.ai A11y
High
a11y — Translucent text alpha floor: fix ~15 contrast failures
Resolved 2026-07-14. Hero subtext, hero em, stat labels, and FAQ answer body were already at 0.75–0.92 alpha — already fine. Raised the rest to the 0.7 floor: scroll hint, marquee items, services-header copy, service card descriptions, "Find out more" links, service-panel numbers, about-left body, and section-label eyebrows. Also stripped 3 inline color overrides on .section-label that were compounding multiplicatively with the base class's opacity instead of replacing it — worked out to ~0.15–0.35 effective alpha, worse than either value alone (calebfoster.ai@5232983).
Stu calebfoster.ai A11y
Medium
a11y — Add focus traps to #servicePanel and #faqPanel
Resolved 2026-07-14. Confirmed the mobile nav had a Tab-trap but these two dialogs didn't (only Escape-to-close + initial focus). Added a shared Tab-trap covering whichever panel is open, including dynamically-injected content (service panel body links, FAQ summary/details) (calebfoster.ai@5232983).
Stu calebfoster.ai A11y
Medium
a11y — Add skip-to-content link to every page
Resolved 2026-07-14, corrected same day. Homepage, about, showcase index, and journal already had one. Added to showcase/studio-team and showcase/learning-carousel, which were genuinely missing it. Correction: also edited cookies.html/privacy.html/terms.html at repo root — turned out those are dead orphan files; _redirects sends every path variant (/terms, /terms.html) to /terms/ etc., which serve cookies/index.html/privacy/index.html/terms/index.html instead. Those real live pages already had skip-links independently — no actual gap existed there. Wasted edit landed on unreachable files (harmless, but see new Operational item on the orphan-file cleanup) (calebfoster.ai@5232983).
Stu calebfoster.ai A11y
Medium
a11y — Add aria-labelledby to #servicePanel and #faqPanel dialogs
Resolved 2026-07-14. Replaced static aria-label with aria-labelledby pointing at each panel's visible title (added id="faqPanelTitle" — servicePanel's title already had one) (calebfoster.ai@5232983).
Stu calebfoster.ai A11y
Low
a11y — Differentiate "Find out more" link labels per service card
Resolved 2026-07-14, diagnosis corrected. .service-link is a decorative span inside the parent role="button" div, not an independently-focusable element — so the 3 cards already had distinct accessible names (their full text content), not a WCAG 2.4.4 failure as originally diagnosed. Real issue was that the auto-computed name (the whole card paragraph) was needlessly verbose for screen readers. Added a concise aria-label per card instead (calebfoster.ai@5232983).
Stu calebfoster.ai A11y
Low
Mobile nav — close menu on outside tap
Resolved 2026-07-14. Added a document click listener that closes the mobile nav when the tap target is outside both the nav and the hamburger button (calebfoster.ai@5232983).
Stu calebfoster.ai
Low
Create custom 404 page
Resolved 2026-07-14. Added a branded 404.html matching the dark aesthetic, with links home and to the Journal — Cloudflare Pages serves it automatically for unmatched routes (calebfoster.ai@5232983).
Stu calebfoster.ai
Low
Add post-push deploy reminder hook — closed, premise was false
Closed 2026-07-14 — verified as not needed. Item assumed both sites deploy via manual wrangler pages deploy with no auto-deploy on push. Checked live: wrangler pages deployment list for mindboost-ops shows every commit pushed during this session auto-deployed to Production within 1–6 minutes via Cloudflare's native git integration (no wrangler.toml or deploy workflow exists in that repo — nothing there ever calls wrangler manually). scorm-lms has a real .github/workflows/deploy.yml firing on: push: branches: [main] via cloudflare/pages-action@v1. Both properties already auto-deploy on every push — no silent-deploy-miss risk exists, so no hook is needed.
Stu mindboost lms Infra
High
Structured error logging in Worker + Pages Functions
Resolved 2026-07-14. Added logError(endpoint, type, message, extra) — one JSON line per failure (severity, endpoint, error type, message, context) so real infra failures (GitHub API down, tree/commit creation failed, R2 not configured, etc.) actually show up in Cloudflare Workers Logs instead of only surfacing as a generic client-side error. Wired into the 2 top-level fetch() catches (covers any unhandled exception, with method+pathname) plus all 15 explicit 500/502 guard-clause returns across handleData, handleUpload, handleHealth, handleRepublishAll, and handlePublishArticle. Left the 400/401/404 client-input-validation returns alone — expected user/data errors, not infra failures (social-dashboard@ca82185).
Stu social Infra
High
Infra — Document GitHub PAT two-place rotation requirement
Resolved 2026-07-14. Added a Credentials section to the Architecture page (ops.calebfoster.ai/architecture/) documenting the GitHub PAT's two-place sync requirement (config/github.env on the Mac mini + Cloudflare Pages env var on social-dashboard), the Cloudflare Access service token, and Worker environment secrets — tied into the existing 18 Nov 2026 credentials rotation schedule (mindboost-ops@3a1cd2b).
Stu social Infra
Medium
Delete orphaned new-slug article duplicates after regen
Resolved 2026-07-14. Root cause: 2 posts had their title later shortened for display, with an explicit canonical slug field added to blog-posts.json to preserve the original URL — but 6 call sites in the Worker (publish-article's canonical/OG/schema tags, related-articles builder, republish-all, journal-index new-post entry, both sitemap generators) always re-derived the slug fresh from the current title instead of reading post.slug, so every republish regenerated the wrong-slug file again. Fixed all 6 (social-dashboard@15e0dc1), ran Re-publish All, verified live that sitemap.xml/journal index/every article's related-links now use only the canonical slugs, then deleted the 2 orphan files (calebfoster.ai@a6925a2).
Stu social SEO
Medium
Cron — Add centralised failure alerting for all nightly jobs
Resolved 2026-07-14. Added GET /api/health to the social-dashboard Worker (social-dashboard@15e0dc1) — rolls up the latest GitHub Actions run status for all 17 workflows (list workflow defs + list recent runs, 2 API calls, reusing the existing GITHUB_TOKEN secret, no new credential). Closes the gap health-check.js doesn't cover: whether each cron actually ran, not just whether its output looks sane. Live at https://social.calebfoster.ai/api/health.
Stu social Infra
Medium
Serve R2 media from dedicated public subdomain
Resolved 2026-07-14. media.calebfoster.ai added as a Cloudflare custom domain on the social-dashboard Pages project (Caleb: DNS CNAME + Custom domain). Added a root-level Pages Function (functions/[[path]].js, social-dashboard@99214a1) that rewrites requests on that host to the existing R2 handler, dropping the /media/ prefix — every other host falls through unchanged. Verified live: correct content-type/bytes served from the new subdomain, old /media/ path and main dashboard unaffected.
Stu social Infra
Low
Harden journal worker FAQPage regex (bolded/attributed H2s silently drop schema)
Resolved 2026-07-14. The journal worker (social-dashboard/worker/index.js ~L953) derives FAQPage only from bare <h2>plain text</h2> — its regex /<h2>([^<]+)<\/h2>/ silently skips any heading with inner markup or attributes (exactly what dropped the FAQPage on skills-gaps, whose H2s were <h2><strong>…). Relax to /<h2[^>]*>([\s\S]*?)<\/h2>/ and strip inner tags before the question-pattern test + before building the question name, so a bolded or linked heading can't kill a FAQPage again.
Stu social Infra
Low
Worker auto-deploy via GitHub Actions — social dashboard
Resolved 2026-07-14. Added .github/workflows/deploy.yml to fosterc1/social-dashboard — runs wrangler pages deploy . on every push to main (single Pages project covers the dashboard, API, and R2/KV Functions; worker/index.js is bundled in via functions/api/[[path]].js, no separate Worker deploy needed). CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID repo secrets added by Caleb — fully live.
Stu social Infra
High
Enforce GitHub Contents API in all cron scripts
Resolved 2026-07-14. Audited all ~16 GitHub Actions cron scripts — every active state write already goes through ghPut/the Contents API; the only fs.writeFileSync calls left are temp files for building API payloads or a gated no-op local convenience save. No active violations found. Found 2 confirmed-dead files in the process (send-monday-digest.js referenced the defunct OpenClaw gateway, regen-draft-images.js was an orphaned one-off utility superseded by generate-draft-media.js) — Caleb confirmed, both deleted.
Stu social Infra
High
Tab/day-slot/chip <div onclick> elements not keyboard-accessible
Resolved 2026-07-14. Several interactive elements in the dashboard (tab strips, day selector slots, filter chips) are implemented as <div onclick> without tabindex, role, or keyboard event handlers. Keyboard-only users cannot reach or activate them. Add role="button", tabindex="0", and onkeydown Enter/Space handling — or replace with native <button> elements.
Stu social A11y
High
Fix --mb-text-muted and stat label contrast failures
Resolved 2026-07-14. Measured (not estimated): 4.30:1 on the white card background, 4.17:1 on the page background — both under 4.5:1 AA for small text (the item's original 3.1:1/3.9:1 figures were close but not exact). Raised --mb-text-muted from rgba(13,13,13,0.55) to 0.6, which clears both backgrounds with margin (4.6-5.1:1). Stat labels already used this token, so one change fixed both halves of the finding.
Stu social A11y
Medium
Add focus trap + aria-modal to post and blog modals
Closed 2026-07-14 — not applicable. No modal exists to fix: .modal-overlay is dead CSS never applied to any element in index.html. The post-detail and blog-draft views are rendered inline in a split-pane layout (click a day slot → content replaces the right-hand panel on the same page), not in a dialog overlay. This backlog item describes a UI pattern from an earlier iteration of the dashboard.
Stu social A11y
Medium
Guard /api/save posts writes against null/non-object entries
Resolved 2026-07-14. Added exactly the suggested fix: .filter(p => p != null && typeof p === 'object') before the write in handleSave's post branch, with a console.error log line naming how many entries were filtered so corrupt data can still be investigated after the fact.
Stu social Dev
Medium
Server-side reject publish if draft_copy contains scaffolding markers
Resolved 2026-07-14. handlePublishArticle now returns a 400 with a clear error message if draft_copy still contains a Meta description: scaffolding line, in addition to the existing silent strip during HTML conversion (kept as a second line of defence for anything that slips past the new guard some other way).
Stu social Dev
Medium
Cron — Add pre-scrape session validity check to LinkedIn scrape
Resolved 2026-07-14. Added checkSessionValid(): navigates to /feed/ right after browser launch and checks the resulting URL for a redirect to /login, /authwall, or /checkpoint. If redirected, logs a clear message and exits non-zero before any scraping starts, so the GitHub Actions run shows as failed instead of silently recording nothing. (Superseded the old raw-CDP mechanism this item originally described.)
Stu social Dev
Medium
AEO — FAQ sections + FAQPage schema on all journal articles
Done 2026-07-04. All 11/11 journal articles now emit FAQPage JSON-LD. Amanda fixed the last two — skills-gaps (bold-wrapped H2s <h2><strong> → stripped **) + why-behaviour-change (too few question H2s → reworded 3) — and republished; Claude retested live: both ✅, 4 questions each, bare H2s, no self-links. Answer engines (Perplexity, AI Overviews, People Also Ask) lift these directly.
Amanda social AEO
Medium
AEO — Question-phrased H2s with concise answers in articles
Done 2026-07-04. All 11/11 journal articles now lead with question-phrased H2s (How/What/Why), each followed by a direct-answer paragraph — which is what auto-derives the FAQPage schema at publish. Final holdout why-behaviour-change reworded + republished by Amanda; Claude retested live ✅.
Amanda social AEO
Medium
Finish Claude Design components — hand off to Claude Code
Done 20 Jun 2026. The updated mindboost Design System was completed in Claude Design and handed off — the design-system/ reference bundle + HANDOFF.md now live in the vault (references/mindboost-design-system/) and are installed as the user-invocable mindboost-design skill for Claude Code to build from in Freedom / lesson-shell.
Caleb freedom Content
Medium
CF Access — harden session timeout settings
Done 17 Jun 2026. Enforced independent MFA (TOTP) across Ops/LMS/Social (mfa_required_for_all_apps=true, 24h auth duration) and enabled the App Launcher (Caleb-only policy) for device enrolment; hardened cookies on Ops + LMS (HTTP Only + binding cookie + SameSite=Lax); single-identity "Caleb only" policy retained. Session duration left at 24h — acceptable now MFA + binding cookies are in place; optional 8h tighten not pursued.
Caleb Infra
Low
Post status refresh without hard reload
After a dashboard action (publish, regenerate, delete), the post status only reflects after a full page reload. Add a lightweight fetch call to refresh the post's status field in-place — within 5 seconds of a successful action — so Caleb doesn't need to manually reload the dashboard to confirm what happened.
Amanda social Infra
Medium
Unify post status schema across all stored posts
Post status values are inconsistent across blog-posts.json and posts.json — "published", "draft", "scheduled", "pending", and "live" appear in different contexts. Define a canonical status enum (draft | scheduled | published | archived), run a one-off migration across all stored posts, and update the Worker to enforce the enum on write.
Amanda social Infra
Medium
Publish one original first-party data piece for GEO
The biggest single GEO (Generative Engine Optimisation) opportunity on the site is producing first-party data that AI crawlers can cite. One piece — a short survey result, a benchmark from client work, or an original analysis — would meaningfully differentiate calebfoster.ai from aggregator sites covering the same L&D topics. Prioritise something with a specific stat or finding.
Amanda social Content
Medium
OG image ratio — regenerate article banners at 1200×630
Article og:image / banner images are 1400×600 (2.33:1); the canonical social ratio is 1200×630 (1.91:1), so LinkedIn / X may crop the preview. Regenerate article banners at 1200×630 and update the Worker's og:image:width/height (currently 1400/600 in worker/index.js) to match.
Amanda social SEO
Low
Journal index — add read time and publish date to article cards
The journal index (/journal/) shows article cards with title and excerpt only. Adding estimated read time (word count ÷ 200, rounded up) and publish date improves perceived content quality and matches professional blog conventions. Static data — update the journal index HTML and the automated publish pipeline's card template.
Amanda social Content
Low
Blog image URL validation before publish
Blog posts can be published with broken or placeholder image URLs — these then appear in the sitemap and journal index with dead images. Add a Worker-side check on publish: if the image URL returns a non-200 response, reject the publish with a clear error to the dashboard. Prevents broken image cards in the journal index.
Amanda social Infra
High
a11y — Image alt text audit across all 7 journal articles
Alt text across the 7 journal articles has not been systematically audited. Some images may have empty, generic ("image"), or missing alt attributes. Audit each article: for decorative images confirm alt="" is intentional; for informational images ensure the alt meaningfully describes the content. Log findings in a short checklist per article.
Amanda social A11y
Medium
Open Graph image audit — all 7 journal articles
Each journal article needs an og:image that is 1200×630px, loads quickly, and is not a placeholder. Audit all 7 articles. Missing or broken og:image tags cause LinkedIn and X share previews to render as plain-text cards — reducing click-through from social shares. Also verify twitter:image is set consistently.
Amanda social SEO
Medium
mindboost. Design System — publish as org system in Claude Design
Done 20 Jun 2026. Published as the active org design system in Claude Design so all projects inherit it. The current system is the light --mb-* set (the 12 May dark-era values are superseded) — bundle in the vault at references/mindboost-design-system/ + installed as the mindboost-design skill. Brief: workspace/team/briefs/OWEN-BRIEF-mindboost-design-system.md.
mindboost Content
Medium
Pre-publish validation in dashboard UI
The dashboard "Publish" button currently has no pre-flight checks. Before publishing: validate that title, body, image URL, and blog body fields are non-empty; confirm the image URL resolves (HEAD request); warn if the slug already exists in blog-posts.json. Prevents silent publishes of incomplete or broken posts.
Amanda social Content
High
Strengthen internal linking between journal articles
Journal articles have no cross-linking — each sits as an island. Add 2–3 contextually relevant inline links per article pointing to other articles in the journal. This improves crawl depth, distributes PageRank between pages, and signals topical authority to search engines. Map the linking opportunities first, then implement per article.
Amanda social SEO
High
SEO — Shorten over-length article title tags to ≤60 chars
10 of 11 journal <title> tags exceed 60 characters (up to 99 on the BaxterStorey DE&I piece), so Google truncates them in results. Rewrite each to ≤60 chars, front-loading the primary keyword while keeping the hook.
Amanda social SEO
Medium
Add system health status tile to ops dashboard
Add a "System Health" tile to the ops dashboard home (ops.calebfoster.ai) showing current uptime status for all four properties. Pull from a public status JSON endpoint (UptimeRobot or Better Uptime) once uptime monitoring is in place. Tile should show green/amber/red per property and time of last check. Depends on: Uptime monitoring item.
ops
Low
JS-rendered service panels: make pricing visible to AI crawlers
Service panel pricing and deliverables are rendered via JavaScript slide-out panels. AI crawlers (Perplexity, ChatGPT Search, etc.) may not execute JS reliably, meaning commercial detail is invisible to them. Fix: duplicate key pricing/deliverables into static HTML (hidden visually if needed) or into JSON-LD Offer schema. This is the primary remaining AEO/GEO gap on the homepage.
calebfoster.ai SEO
Medium
Back up OpenClaw cron schedule (jobs.json) to version control
The cron schedule lived only on the local Mac and was unrecoverable if it died. Snapshotted jobs.json (17 active jobs) into social-dashboard/cron/ with restore notes in SCHEDULE.md.
Stu social Infra Cron
Medium
Workflow guardrails — PR-only main + self-healing version hooks
Hardened .githooks (pre-push blocks direct pushes to main; pre-commit self-heals the app-version across all pages) rolled out to all four ladder repos, and every dev/staging branch resynced to main. (True server-side branch protection still needs GitHub Pro.)
Infra Dev
Medium
Add FAQPage JSON-LD schema to homepage
The FAQ section is fully rendered in static HTML but lacks JSON-LD markup. Adding FAQPage schema surfaces questions in Google's "People also ask" feature and passes structured data directly to AI search engines (Perplexity, ChatGPT Search). ~30 minutes: write the schema block and add it to the page <head>.
calebfoster.ai SEO
High
Create author bio page with Person schema
No dedicated /author/caleb-foster/ page exists with structured Person schema. Adding one (name, jobTitle, worksFor, url, sameAs linking to LinkedIn and GitHub) strengthens E-E-A-T signals and gives AI search engines a canonical identity anchor for the author. One new page, ~1 hour of work.
calebfoster.ai SEO
High
Add lesson-shell demo tile to ops dashboard
Once the lesson shell showcase page is live on calebfoster.ai, add a tile to the ops dashboard (similar to the existing Card Carousel tile) linking to it and summarising the component's purpose, usage, and source location. Keeps ops.calebfoster.ai as the single reference point for all learning components. Depends on: lesson shell showcase page.
ops
Low
Create Architecture page as living document
The ops dashboard needs an /architecture/ page that documents the full tech stack, repo structure, Worker endpoints, D1/R2/KV namespaces, and Cloudflare Access policies — kept up to date as a living reference. Single-page HTML in the same design system as this backlog. This becomes the onboarding document for any new team member touching the infrastructure.
ops
Medium
Uptime monitoring — all four properties
No external uptime monitoring exists for any of the four properties. Add a free-tier monitor (Better Uptime, UptimeRobot, or Cloudflare Notifications) for calebfoster.ai, social.calebfoster.ai, ops.calebfoster.ai, and lms.calebfoster.ai. Alert to caleb.foster@mindboostlearning.com on downtime. ~20 minutes total setup.
Infra
High
Lighthouse CI workflow — GitHub Actions on every PR
GitHub Actions workflow added to fosterc1/calebfoster.ai running Lighthouse CI on every PR against the Cloudflare Pages preview URL. Fails the PR if Performance <90, Accessibility <90, Best Practices <90, or SEO <90. Enforces quality gates before any code reaches production.
calebfoster.ai Infra
Medium
Automate version bumping — all 7 pages in one command
Bash script added at scripts/bump-version.sh. Running ./scripts/bump-version.sh 1.x.x updates the version string in all 7 pages' footer in a single command, then stages the changes ready to commit. Eliminates the risk of version drift between pages.
calebfoster.ai Infra
Medium
ops source backed up to GitHub — fosterc1/mindboost-ops
All ops dashboard source files committed to fosterc1/mindboost-ops (private). Git history provides a full audit trail of all backlog and ops infrastructure changes. Repo is the source of truth for all ops tooling.
ops Infra
Medium
Git-connect ops to GitHub for auto-deploy
fosterc1/mindboost-ops connected to the calebfoster-ai-ops Cloudflare Pages project. Push to main triggers automatic deployment to ops.calebfoster.ai within ~60 seconds — no manual wrangler publish needed. Confirmed working end-to-end.
ops Infra
Medium
Wednesday cron morning report — content generation visibility
The Wednesday 10pm content cron runs silently. When it fails or generates bad posts (null entries, duplicates), there is no visibility until Caleb notices in the dashboard — sometimes days later. Fix: add a Thursday morning (9am) summary message from Amanda: "Here's what the cron generated last night — 3 posts for w/c [date], hooks listed, any issues flagged." Catches nulls, duplicates, and missing media before Caleb opens the dashboard. Model: Gemini Flash.
Amanda social Content Infra
High
Fix Worker — set published: true on article publish
The Worker sets status: "published" on article publish but never sets the published boolean field. Cron scripts that filter blog-posts.json on published: true silently miss all newly published articles. One-line fix in the publish handler in worker/index.js.
Stu social Infra Cron
Critical
Publish pipeline — CDN purge, sitemap, and Blog schema in one atomic Worker commit
Three manual steps follow every article publish: (1) CDN cache purge; (2) update sitemap.xml; (3) prepend a new BlogPosting entry to Blog JSON-LD in journal/index.html. Extended the Worker publish handler to include all three files in the same Git Trees API commit — making publish fully one-click.
Stu social Infra
High
Worker decommission — Task 1: Migrate stored media URLs
Found and replaced all references to calebfoster-dashboard-api.mindboost.workers.dev/media/... in blog-posts.json, posts.json, and published journal article HTML with social.calebfoster.ai/media/....
Stu social Infra
High
Worker decommission — Task 2: CF Access service token for cron scripts
Created a Cloudflare Access service token via Zero Trust UI. Updated cron scripts (generate-weekly-content.js, regen-draft-images.js) to use token headers against social.calebfoster.ai/api/* instead of old Worker URL.
Stu social Infra Cron
Medium
Fix empty blogPost array in journal Blog schema
journal/index.html contains a Blog JSON-LD block with "blogPost": [] — an empty array. Google indexes zero articles from this signal. Populate the array with all published article slugs (title, url, datePublished, author) so the Blog entity reflects the actual content. Update this array every time a new article is published.
Stu social SEO
Critical
Fix truncated meta description on broken-learning-design article
The article broken-learning-design-principles-ruin-2026-strategies.html has a meta description that appears to be cut off mid-sentence. A truncated description renders poorly in SERPs and may signal low-quality content to crawlers. Rewrite to a complete, compelling sentence under 155 characters that accurately reflects the article's angle.
Amanda social Content
Critical
Article schema audit — all 7 journal articles
Each journal article should have a complete Article/BlogPosting JSON-LD block with author, datePublished, dateModified, image, and headline. Audit all 7 articles for completeness and accuracy. The publish pipeline now adds a BlogPosting entry to the journal index — verify the article pages themselves are also correct and consistent.
Stu social SEO
High
Canonical tag audit — all pages and journal articles
Every page on calebfoster.ai must have a self-referencing <link rel="canonical" href="..."> to prevent duplicate content issues. Audit all pages and all 7 articles for canonical presence and correctness — flag any missing, relative (not absolute), or duplicated canonicals. One-pass fix once audit is complete.
calebfoster.ai SEO
Medium
GDPR — verify GA4 is gated behind cookie consent
GA4 is loaded on calebfoster.ai. Under UK GDPR / PECR, analytics scripts must only fire after explicit user consent. Verify that the GA4 snippet is gated behind consent and does not fire on page load for new visitors. If it currently fires unconditionally, add a consent banner and implement conditional script loading.
calebfoster.ai Infra
Medium
Remove Coming Soon showcase entries from sitemap.xml
Five showcase items with no real content are currently listed in sitemap.xml. Googlebot crawling these gets soft 404s or thin-content pages, which drags crawl budget and can dilute overall site quality signals. Remove all Coming Soon entries from the sitemap until they have real content. Biggest single SEO drag remaining on the site.
calebfoster.ai SEO
Critical