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 & agent automations — Stu 3 active · local · best-effort · 19 Jun 2026

Keep the Obsidian second brain current — distinct from the server-side GitHub Actions crons above, and not tracked in that repo's workflows. The two sync jobs run in the Claude Desktop in-app scheduler (only while Claude Desktop is open; they catch up on next launch); the heartbeat runs via macOS launchd on Caleb's Mac. Source of truth = the vault (Claude/Infra + email-sync-spec).
Claude Desktop
granola-vault-sync
Monday — 7:00am (in-app · while Claude open)
New Granola meeting overviews + transcripts → vault Meetings/, backlinked to client hubs. Idempotent via a granola_id key.
Claude Desktop
email-vault-sync
Monday — 7:10am (in-app · while Claude open)
Outlook Inbox + Sent (rolling 21d) distilled into client-hub 📧 From email sections; mid: markers dedup.
launchd
com.mindboost.vault-weekly
Monday — 7:00am (0 7 * * 1)
macOS launchd → weekly Studio Digest + gaps scan over the vault.

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, writes health-check.json to this repo, and the run goes red & notifies on any failure. 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.