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 on Caleb's Mac. Source of truth = the vault (Claude/Infra + email-sync-spec).Meetings/, backlinked to client hubs. Idempotent via a granola_id key.📧 From email sections; mid: markers dedup.launchd → weekly Studio Digest + gaps scan over the vault.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.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.