Studio Team

Humans with real emotions, real insight and real lived experience supported by the power and scale of AI at every opportunity.

H
Caleb
Mad Scientist
Vision Clients
Key Responsibility
Vision keeper, quality standard-setter, and the voice of the client inside the studio.
  • Client relationships & commercial decisions
  • Quality bar — the final yes or no
  • Creative solutions and ideas
  • Gatekeeper on deliverables
  • Growth, positioning & brand direction
  • The reason the work has to be platinum
  • Functional, quality and client expectation testing
Human
🦾 CW
Amanda
Ideas Creator
Strategy Creative
Key Responsibility
Orchestrates the team, translates solutions into briefs to deliver high impact to clients.
  • Business ops, client comms, proposals
  • Creative solutions and ideas — early concepts
  • Creates detailed briefs for Lily, Owen and Stu
  • Writes test specs & QA sign-off
  • Executive and creative assistant
  • End to end testing
Claude Cowork
H
Lily
Words Wizard
LXD Copywriting
Key Responsibility
Creates magic from words. Turns learning objectives into emotionally resonant experiences.
  • Learner personas & journey mapping
  • Emotional arc design & experience scripts
  • Copy that feels human, never corporate
  • Behaviour change & engagement strategy
  • Design thinking from empathy outward
  • Sentiment KPIs & impact measurement
  • Functional, quality and copy testing
Human
🎨 CD
Owen
Visual Alchemist
Design UI/UX
Key Responsibility
Creative inspiration and direction. Creates awe-inspiring visual language that connects the written language.
  • Creative direction & visual concepts
  • World class UI/UX for learning interfaces
  • Learning content art direction and asset creation
  • Colour systems, typography & motion
  • Relentless research and inspiration daily for world class interactions
  • Functional, quality and design testing
Claude Design
CC
Stu
Code Whisperer
Front-end Back-end
Key Responsibility
Owns the full technical stack. Turns designs and scripts into built, tested, production-ready experiences.
  • Brings creative ideas and language to life
  • Front-end: HTML, CSS, JS, GSAP, Three.js
  • Back-end: APIs, workers, data pipelines
  • Digital learning content creation
  • SCORM packaging & LMS integration
  • Technical QA, browser, device & accessibility testing
Claude Code

Owned
Cloudflare services
Public sites
Protected / internal
Team / tooling
⬡ GitHub — Source Repos  ·  fosterc1 → mindboost-studio (org) — migration in progress
calebfoster.ai
fosterc1/calebfoster.ai → migrating to mindboost-studio
Branch: main → Cloudflare Pages (→ CI/wrangler planned)
Private
social-dashboard
fosterc1/social-dashboard → migrating to mindboost-studio
Branch: main → GitHub Actions (deploy.yml, CI/wrangler) → Cloudflare Pages — live 14 Jul 2026
Pages project: social-dashboard
Includes: blog-posts.json (journal data) · cron/ scripts · functions/ + worker/ · media.calebfoster.ai (R2, via root-catch-all Function)
Private
mindboost-ops
fosterc1/mindboost-ops → migrating to mindboost-studio
Branch: main → Cloudflare Pages (→ CI/wrangler planned)
ops.calebfoster.ai — all ops pages
Private
scorm-lms
mindboost-studio/scorm-lms
Branch: main → Cloudflare Pages
lms.calebfoster.ai — SCORM player
Part-built — static today, D1-backed build planned · deploys via GitHub Actions (CI/wrangler — the target model for all repos)
Private
lesson-shell
fosterc1/lesson-shell → migrating to mindboost-studio
→ to be renamed freedom (framework split)
Branch: main → Cloudflare Pages (→ CI/wrangler planned)
freedom.calebfoster.ai — Freedom Framework demo
Web Components · CI release-guards · Semgrep SAST + GitHub Advanced Security
Private
freedom-framework
mindboost-studio/freedom-framework
Reserved name — empty (no content yet)
Freedom code currently lives in lesson-shell
Private
mindboost-skills
mindboost-studio/mindboost-skills
Reusable Claude/Claw skills + production scripts · not deployed
Private
mindboostlearning.com
mindboost-studio/mindboostlearning.com
Holding repo — agency-site rebuild planned (CI/wrangler) · not deployed yet
Private
☁ Cloudflare — Platform Services
DNS — calebfoster.ai Zone
Routes: calebfoster.ai, social.*, ops.*
Proxied through Cloudflare
Pages — Auto Deploy
Deploys run in GitHub Actions via wrangler (ownership-independent)
Migrating off git-push-triggered Pages git-integration — scorm-lms already on CI
Hosts all 4 sites
Pages Functions at /api/* & /media/*
Access / Zero Trust
Protects ops + lms subdomains
Allowed: caleb.foster@mindboostlearning.com
R2 — Object Storage
Bucket: dashboard-media
Media files for social dashboard
KV — Key-Value Store
Namespace: FLAGS
Inspiration analysis flag (cron-gated)
Pages Functions — API Layer
functions/api/[[path]].jsworker/index.js (1,429 lines)
Publishes articles · updates sitemap · CDN purge (atomic)
Deploys with social dashboard — no separate deploy step
⬤ Live Sites
calebfoster.ai
Personal site
Public
ops.calebfoster.ai
Ops dashboard — this page lives here
Superpower · Tech Stack · Backlog · Studio Team · Freedom deck
Protected
social.calebfoster.ai
Content Dashboard — UI public (no CF Access)
API: /api/* /media/* auth-gated (401)
Storage: R2 + KV FLAGS · Pages Functions
API-gated
freedom.calebfoster.ai
Freedom Framework — live course demo
Deployed from lesson-shell repo
Public today · Access protection planned
Public
lms.calebfoster.ai
SCORM Player
Upload · enrol · launch · track
Protected

Development Workflow fixes → dev · features → feature/xxx → dev · staging → main · updated 13 Jun 2026

Ladder enforced org-wide via rulesets — all repos.  ·  social-dashboard: require-PR off (journal-worker direct-push), but force-push/deletion protected
STEP 1 — BUILD
dev / feature/xxx
Fixes & changes go direct to dev. New features use a feature/xxx branch. Every push generates a Cloudflare preview URL automatically.
STEP 2 — QA
dev
Team reviews the dev preview URL. “Looks good” → Claude auto-merges to dev and shares the staging preview URL.
STEP 3 — ACCEPTANCE
staging
Team reviews the staging preview URL. “Looks good” → Claude auto-merges staging → main.
STEP 4 — LIVE
main
Claude merges staging → main. Cloudflare auto-deploys to the live domain. No manual steps needed.
BRANCH RULES
  • Nobody pushes direct to main — PRs only
  • Feature branches only for new features — cut from dev
  • Fixes commit direct to dev
  • Team reviews previews — Claude handles all merges
  • Enforced org-wide via rulesets: “Protect ladder branches” (main/dev/staging: restrict deletions + block force-push) + “Protect release tags” (v*)
  • MFA required org-wide · Advanced Security on (Secret Protection push-protection + Dependabot)
  • Actions locked (GitHub + verified creators, default token read-only) · member privileges → owners only
PREVIEW URLS
  • Every branch push → unique CF preview URL
  • Every PR → dedicated preview URL
  • dev, staging, feature/* all generate previews
  • Preview URLs never replace the live domain
REPOS IN SCOPE
  • fosterc1/calebfoster.ai — protected (org ruleset) · migrating to mindboost-studio
  • fosterc1/mindboost-ops — protected (org ruleset) · migrating to mindboost-studio
  • mindboost-studio/scorm-lms — protected (org ruleset)
  • fosterc1/lesson-shell — Freedom Framework → freedom.calebfoster.ai · protected (org ruleset) · migrating to mindboost-studio
  • fosterc1/social-dashboard — covered by org ruleset (force-push/deletion protected); require-PR off (journal-worker direct-push) · migrating to mindboost-studio

Deploy & Data Flow

TEAM GITHUB CLOUDFLARE LIVE SITES Caleb Ideation · reviews previews Stu Claude Code · commits / PRs fosterc1 → mindboost-studio · 8 repos feature/* new features only dev fixes commit here directly staging acceptance checkpoint main auto-deploys to live Cloudflare Pages Auto-deploy on push CF Access / Zero Trust Protects ops + lms R2 Media storage KV FLAGS namespace Pages Functions — API Layer functions/api/[[path]].js → worker/index.js Publishes articles · CDN purge · sitemap · R2 media calebfoster.ai Public · personal site calebfoster.ai/journal Public · reads blog-posts.json social.calebfoster.ai Public UI · API auth-gated ops.calebfoster.ai Protected · This site lms.calebfoster.ai Protected · SCORM player freedom.calebfoster.ai Public · Freedom course demo fixes / PRs webhook publishes articles
Team
Caleb
Ideation · reviews previews
Stu
Claude Code · commits / PRs
↓ fixes / PRs
GitHub — fosterc1 → mindboost-studio · 8 repos
feature/*
New features only
dev
Fixes commit here directly
staging
Acceptance checkpoint
main
Auto-deploys to live
↓ webhook
Cloudflare
Cloudflare Pages
Auto-deploy on push
CF Access / Zero Trust
Protects ops + lms
R2
Media storage
KV
FLAGS namespace
Pages Functions — API Layer
functions/api/[[path]].js → worker/index.js · publishes articles · CDN purge · sitemap · R2 media
Live Sites
calebfoster.ai
Public · personal site
ops.calebfoster.ai
Protected · This site
social.calebfoster.ai
Public UI · API auth-gated
calebfoster.ai/journal
Public · reads blog-posts.json · published from social
lms.calebfoster.ai
Protected · SCORM player
freedom.calebfoster.ai
Public · Freedom course demo

Scheduled Jobs — Amanda 16 active · GitHub Actions, social-dashboard/.github/workflows/ · updated 14 Jul 2026

Migrated off OpenClaw/Genspark Claw onto GitHub Actions (tz UTC — times below shown in BST, the UK's current clock); each job runs a script from social-dashboard/cron/ and commits results back to the repo. Two jobs (draft/blog image generation) run on the self-hosted Mac mini runner — they need the Higgsfield CLI, which is only authenticated on that machine; everything else runs on GitHub-hosted runners. Agent model per job: most default to Claude Haiku via cron/lib/ai.js; long-form content generation (weekly LinkedIn drafts, blog copy, final-media analysis) overrides to Claude Sonnet; a few jobs (scraping, mining, templated emails) call no AI at all.
Most work happens Wednesday (refresh → analyse → learn → generate). Not scheduled: analyse-inspiration.js and send-monday-digest.js exist in the repo but have no active workflow (the latter superseded by the L&D digest). The weekly Health Check is no longer here — it moved to a daily GitHub Action (see the System Health panel below).
Claude Haiku
LinkedIn Metrics Scrape
Wednesday — 8:00am (0 7 * * 3)
scrape-linkedin-metrics.js — no AI, pure browser scrape. Runs --find-pending first to discover analytics URLs for posts marked posted without one (fixed 14 Jul — this pass wasn't scheduled before, stranding new posts), then the default full metrics scrape.
No AI
Website Analytics (GA4 + GSC)
Wednesday — 8:15am (15 7 * * 3)
fetch-website-analytics.js — pulls GA4 + Search Console into website-analytics.json.
No AI
Hook Mining
Wednesday — 8:45am (45 7 * * 3)
mine-hooks.js — mines hooks from posted posts into the Hook Vault (hooks.json). Fixed 14 Jul: near-duplicate hooks (same hook, one word different) now merge into the existing vault entry instead of creating a parallel duplicate.
Claude Haiku
Post Analysis
Wednesday — 9:00am (0 8 * * 3)
analyse-post.js — analyses posts flagged pending_analysis for performance signals.
Claude Sonnet
Blog Content Generation
Wednesday — 9:30am (30 8 * * 3)
generate-blog-content.js — processes pending blog idea / copy requests, grounded in live Firecrawl search. Also runs on-demand: the dashboard's "Generate Idea"/"Generate Copy" buttons dispatch this workflow directly (fixed 14 Jul — they used to just set a flag and wait for Wednesday).
Claude Haiku
Copy-Edit Learning
Wednesday — 10:00am (0 9 * * 3)
learn-from-edits.js — learns from Caleb's pending_copy_diff edits; appends lessons to style-guide.md.
Claude Haiku
Performance Learning
Wednesday — 9:30pm (30 20 * * 3)
learn-from-performance.js — extracts patterns from posted-post metrics into writing rules; runs before content generation.
Claude Sonnet
Weekly Content Generation
Wednesday — 10:00pm (0 21 * * 3)
generate-weekly-content.js --no-images — refreshes content-angles.json from live Firecrawl search (one query per pillar), then writes Mon/Wed/Fri LinkedIn drafts from fresh angles. Hook dedup checks the full historical corpus (fixed 14 Jul — a word-overlap bug let one hook ship 3x undetected before the fix).
Claude Haiku + Higgsfield
Draft Media Generation
On demand · self-hosted (*/15 * * * * sweep)
generate-draft-media.js — dashboard's "Generate Visual Direction + Draft Media" button dispatches this immediately; a 15-min sweep is the fallback if the dispatch call fails. Supersedes the old regen-draft-images.js overnight-batch job.
Claude Haiku + Higgsfield NEW
Blog Images Generation
On demand · self-hosted (*/15 * * * * sweep)
generate-blog-images.js — built 14 Jul. Same on-demand + sweep pattern as Draft Media Generation, for blog card (4:3) + banner (16:9) images. Blog posts had published with no images at all until this.
Claude Sonnet
Final Media Analysis
Thursday — 9:00am (0 8 * * 4)
analyse-final-media.js — extracts design learnings from newly-uploaded final images. Learnings are now deduped + capped at 20/list (fixed 14 Jul — one pillar/type combo had grown to 63 near-duplicate entries). ⚠️ Same slot as Thursday Content Summary.
Claude Haiku
Thursday Content Summary
Thursday — 9:00am (0 8 * * 4)
thursday-content-summary.js — plain-English summary of last night's generated posts; flags problems. ⚠️ Fires at the same time as Final Media Analysis — consider offsetting.
No AI
Draft Review Reminder
Thursday — 9:30am (30 8 * * 4)
draft-review-reminder.js — templated, no AI. Reads posts.json from GitHub; if unapproved drafts exist, emails Caleb (Microsoft Graph) to review them on the dashboard. Written from scratch during the migration — never had a working script under OpenClaw.
No AI
LinkedIn Follower Count
Saturday — 10:00am (0 9 * * 6)
scrape-linkedin-metrics.js — same script as the Wednesday scrape; captures the Saturday follower snapshot.
No AI
Weekly Studio Digest
Sunday — 9:00pm (0 20 * * 0)
send-weekly-digest.js — templated, no AI. Caleb's weekly LinkedIn + content-activity email, delivered via Microsoft Graph.
Claude Haiku
Monday L&D Digest
Monday — 8:00am (0 7 * * 1)
send-ld-news-digest.js — top 5 L&D / AI stories grounded in live Firecrawl search, with AI commentary. HTML email via Microsoft Graph.

Vault automations — on demand no scheduled jobs · retired 14 Sep 2026

Keep the Obsidian second brain current. These used to run on a Monday schedule (Claude Desktop scheduler + macOS launchd); none of those schedules was still producing anything, so they now run when Caleb asks in a Claude session. The Granola sync was removed. Source of truth = the vault (Claude/Infra).
On demand
Studio Digest
Ask for “a studio digest”
vault-digest.py → dated note in Operational/Studio Digest/: what changed, open 🔮 Future Thoughts, recent 🧠 Decisions.
On demand
Gap scan
Ask for “a gap scan”
vault-gaps.py → approval checklist of stub notes, orphans, stale active notes and unactioned ideas. Nothing changes until items are ticked.
On demand
Email → vault sync
Ask to “sync my email into the vault”
Outlook Inbox + Sent (rolling 21d) distilled into client-hub 📧 From email sections; mid: markers dedup. Follows email-sync-spec.

System Health Loading...

Run daily by a GitHub Action in mindboost-ops (.github/workflows/health-check.yml, cron 0 7 * * *); it tests live data flows, APIs and sites and publishes the snapshot to Workers KV, served same-origin by /health-status. Changed 4 Sep 2026: it used to commit health-check.json to this repo daily — but the commit carried [skip ci], which Cloudflare honours, so every build was skipped and this panel silently showed 25 Aug data until 4 Sep. Monitoring data no longer touches the deploy pipeline. Updated 18 Aug 2026: the run goes red & notifies only on infrastructure failures (sites, APIs, data files unreachable). Data-quality failures — stuck pending flags, duplicate hooks, missing images — still render red on the panel below and are annotated on the run, but no longer fail it: a dead LinkedIn scrape held this workflow red for 18 consecutive mornings, one email each, which only teaches you to ignore the alert. Replaced the old OpenClaw weekly cron, 17 Jun 2026. This checks the crons' output (data quality); it doesn't confirm each workflow actually ran. Complementary check (14 Jul 2026): GET social.calebfoster.ai/api/health rolls up the latest GitHub Actions run status for all 17 social-dashboard workflows directly from the GitHub API.
–/–
checks passed
Loading health data...
Continuous uptime monitor — every 5 min · 19 Jun 2026 checking…
Cloudflare Worker uptime-monitor (cron */5 * * * *) HEAD-checks the five live properties — redirect: manual + 12s timeout, so CF-Access 302s count as up. Emails Caleb via MailChannels on state change only (🚨 down / ✅ recovered), deduped in KV UPTIME_KV (48h TTL). No manual trigger endpoint — cron-only. Continuous availability — complements the daily integrity check above. media.calebfoster.ai added 14 Jul 2026.
calebfoster.ai
marketing site
social.calebfoster.ai
social dashboard
ops.calebfoster.ai
ops dashboard · CF Access
lms.calebfoster.ai
LMS · CF Access
media.calebfoster.ai
R2 media subdomain

Credentials rotation schedule blocked 18 Nov 2026 · added 14 Jul 2026

What to rotate, where each credential lives, and how to update it without downtime. Several are now 6+ months old (created ~May 2026) — Caleb's calendar is blocked 18 November 2026 to work through this list.
GitHub PAT (cron scripts)
Lives in two places that must be updated togetherconfig/github.env on the Mac mini workspace (read by the self-hosted-runner crons) and as a Cloudflare Pages environment variable (GITHUB_TOKEN) on the social-dashboard Pages project, which the Worker reads for all Contents-API reads/writes and the /api/health Actions-API rollup. Rotating in only one place breaks either the cron scripts or the dashboard/Worker API — update both in the same sitting, then verify a cron run and a dashboard save both still work before considering the rotation done.
Cloudflare Access service token
Created ~May 2026, used for machine-to-machine Access-gated requests. Rotate via Zero Trust → Access → Service Auth, then update wherever the token is consumed (check for hardcoded references before assuming a single call site).
Worker environment secrets
DASHBOARD_SECRET, CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_ID (now also used by deploy.yml's CI deploy, added 14 Jul 2026). Set via Cloudflare Pages project → Settings → Environment variables; rotating the dashboard secret also requires updating the dashboard's own config fetch (GET /api/config) client cache.