Humans with real emotions, real insight and real lived experience supported by the power and scale of AI at every opportunity.
dev. New features use a feature/xxx branch. Every push generates a Cloudflare preview URL automatically.dev preview URL. “Looks good” → Claude auto-merges to dev and shares the staging preview URL.staging preview URL. “Looks good” → Claude auto-merges staging → main.staging → main. Cloudflare auto-deploys to the live domain. No manual steps needed.main — PRs onlydevdevmain/dev/staging: restrict deletions + block force-push) + “Protect release tags” (v*)dev, staging, feature/* all generate previewsfosterc1/calebfoster.ai — protected (org ruleset) · migrating to mindboost-studiofosterc1/mindboost-ops — protected (org ruleset) · migrating to mindboost-studiomindboost-studio/scorm-lms — protected (org ruleset)fosterc1/lesson-shell — Freedom Framework → freedom.calebfoster.ai · protected (org ruleset) · migrating to mindboost-studiofosterc1/social-dashboard — covered by org ruleset (force-push/deletion protected); require-PR off (journal-worker direct-push) · migrating to mindboost-studiosocial-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.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).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.fetch-website-analytics.js — pulls GA4 + Search Console into website-analytics.json.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.analyse-post.js — analyses posts flagged pending_analysis for performance signals.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).learn-from-edits.js — learns from Caleb's pending_copy_diff edits; appends lessons to style-guide.md.learn-from-performance.js — extracts patterns from posted-post metrics into writing rules; runs before content generation.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).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.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.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.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.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.scrape-linkedin-metrics.js — same script as the Wednesday scrape; captures the Saturday follower snapshot.send-weekly-digest.js — templated, no AI. Caleb's weekly LinkedIn + content-activity email, delivered via Microsoft Graph.send-ld-news-digest.js — top 5 L&D / AI stories grounded in live Firecrawl search, with AI commentary. HTML email via Microsoft Graph.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).vault-digest.py → dated note in Operational/Studio Digest/: what changed, open 🔮 Future Thoughts, recent 🧠 Decisions.vault-gaps.py → approval checklist of stub notes, orphans, stale active notes and unactioned ideas. Nothing changes until items are ticked.📧 From email sections; mid: markers dedup. Follows email-sync-spec.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.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.config/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.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.