My Automated Content Pipeline
Every week, 26 pieces of content go live across 6 platforms. Most of the work happens without me touching a keyboard. Here's exactly how it works.
Week 21 theme
Your Q2 Reality Check
The 6 metrics worth auditing mid-year, the 2 you can ignore until Q4, and the one conversation to have with sales before June.
- 01
Scan crosslink channel
2026-05-10 · Worktree (wonderful-bell-a108f9)
- 02
Write scripts
2026-05-15 · Worktree (sharp-shamir-a8081c)
- 03
Film
2026-05-17 · William
- 04
Process clips
2026-05-17 · Worktree (affectionate-kowalevski-ae5ce0)
- 05
Upload and schedule
2026-05-18 · Cloud Claude Code session (2026-05-18) + Worktree (friendly-germain-4088d6, 2026-05-17 Tue clean) + Worktree (affectionate-kowalevski-ae5ce0, 2026-05-17 Mon path)
- 06
Generate post copy
2026-05-18 · Cloud Claude Code session
- 07
Draft blog post
2026-05-10 · Worktree (wonderful-bell-a108f9)
- 08
Draft + Schedule Newsletter
2026-05-17 · Worktree (friendly-germain-4088d6)
- 09
Publish blog
2026-05-17 · Worktree (affectionate-kowalevski-ae5ce0)
- 10
Schedule Blog Promo
2026-05-17 · Worktree (affectionate-kowalevski-ae5ce0)
- 11
Post back to crosslink channel
- 12
Live week
- 13
Health check
Scan Crosslink Channel
Internal. Read an industry Slack channel where marketing leaders share content for mutual backlinking. Pick one article to feature this week, or skip if nothing fits the theme.
•Reads #seo-crosslink-exchange in the Lead Market Forum Slack workspace
•Selects one high-quality article aligned with this week's theme
•The chosen link flows into the blog, newsletter, and reciprocity post
•Can be skipped on weeks where nothing fits the theme (W16 ran without a crosslink)
Write Scripts
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.Internal. AI drafts prompter scripts for 5 short video clips based on the week's theme. Scripts follow a specific voice and attribution model.
•5 weekday tactical scripts + 1 Saturday wrap script per week (effective W21, 2026-05-12), each under 60 seconds
•Scripts follow Voice DNA style and the Shorts Hook Framework (reference/skills/brand-standards/SKILL.md > Shorts Hook Framework)
•Every script MUST open with one of the 4 hook patterns (Open Loop, Specific Number, Pattern Break, Name the Pain). The throat-clear anti-pattern is a hard reject.
•Each script declares its hook pattern in a header comment (e.g. '# HOOK PATTERN: Open Loop'). Pattern Break scripts include a [STAGE NOTE] describing the visual deviation.
•Stage 2 self-check (5 questions) must pass before the script ships to Stage 3 — see brand-standards SKILL > Shorts Hook Framework > Stage 2 Self-Check.
•Saved to the repo for version control and reuse
•Per-clip prompter files (effective W23, 2026-05-26): after the master is written, run `python3 scripts/shorts-renderer/extract_prompter_clips.py --week N --targets repo` to emit 7 words-only files into scripts/produced/shorts/prompter/ — W{N}-1.txt through W{N}-6.txt (one per clip) plus W{N}-1-6.txt (consolidated, simple `=== W{N}-K ===` headers). These are pure derivatives of the master; never hand-edit them. A Mac Mini launchd watcher (com.professorleads.prompter-extractor) mirrors them into the iCloud tools/shorts-processor/prompter/ directory William films from.
Film
Manual StepInternal. The only manual step. I film the batch on a dedicated production workstation. Raw clips transfer to the cloud automatically.
•The only step in the pipeline that requires human action
•Filmed in batch on a dedicated Windows PC with studio lighting
•Raw clips sync to iCloud automatically after filming wraps
The only step in the pipeline that requires human action. Everything before and after is automated.
Process & Render Clips
Internal. A Python pipeline trims dead air, normalizes audio, then renders the upload-ready clip — 9:16 reframe, word-level karaoke captions, a brand-orange hook overlay, and the Professor Leads logo. All automated, no manual editing or compositing.
•Auto-fires when a raw clip lands in iCloud raw/ (launchd WatchPaths + settle + iCloud-download-readiness gate); posts status to Slack on every fire
•Sub-step A — process_shorts.py: silence detection trims dead air, audio normalized to -16 LUFS (broadcast standard); outputs *_clean.mp4 to processed/
•Sub-step B — render_shorts.py (calls render_spike.py): 9:16 reframe (pass-through for phone 9:16, center-crop for 16:9 camera), word-level karaoke captions (Anton uppercase 120pt, brand-orange active word via faster-whisper word-timestamps + libass), hook overlay box (Anton uppercase brand-orange text on brand-navy rounded rectangle, 0-2.5s window, top edge), brand mark logo bottom-left for the full clip duration; outputs *_final.mp4 to rendered/
•Filename-agnostic: incoming clips named anything (IMG_NNNN.MOV from phone, Untitled.mov from MacBook, etc.) auto-routed to the right week-N manifest entry by ASR-vs-prompter-script similarity (rapidfuzz token_set_ratio, threshold 65). No rename habit required.
•Script-diff verification: rapidfuzz fidelity of ASR vs the cleaned prompter script. ≥98% + zero glossary substitutions auto-passes. 95-98% OR any glossary substitution proceeds but emits .review.txt next to the output. <95% halts unless --accept-adlib is passed (the standing policy — William ad-libs scripts on purpose).
•Idempotent via processed_log.txt + rendered_log.txt; reruns skip already-handled files cleanly.
•Effective W22 (2026-05-25): replaces Opus Clip's rendering role at this stage. See hub/decisions/2026-05-18-local-shorts-renderer.md.
•From W21+ onward: handles 6 clips per week (5 weekday tactical + 1 Saturday wrap). Output named W{N}-1_final.mp4 through W{N}-6_final.mp4.
Upload & Schedule
GatedBrand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.Push content. Locally-rendered *_final.mp4 clips uploaded and scheduled to YouTube, TikTok, LinkedIn, and X via the Postiz Cloud CLI. Each clip lands on its assigned slot Mon-Fri. Brand standards enforce account selection, hashtag order, the no-duplicate rule, and the no-repost rule.
•Push content: each clip stays on its scheduled slot, fired by the host platform on the calendar day
•Inputs are the fully-rendered *_final.mp4 outputs from Stage 4 (captions/hook/brand mark/reframe all baked in). No further rendering at this stage.
•Distribution via Postiz Cloud CLI (postiz upload + postiz posts:create per platform-slot) to YouTube, TikTok, LinkedIn (PL company + WD personal), and X. Effective W23 cutover; W22 runs a parallel spike. See hub/decisions/2026-05-17-postiz-cloud-stage-5.md.
•Platform-specific timing: shorts/LinkedIn 9:00 AM ET, X 11:30 AM ET (current standard)
•X remains in the rotation per the engagement gate in brand-standards/SKILL.md > X (Twitter); the morning-2026-05-17 deprecation decision was reversed the same evening (see hub/decisions/2026-05-17-reverse-x-deprecation.md). The W22/W23 zero-engagement pause trigger handles the next decision data-driven.
•No clip appears on two platforms the same day (no-duplicate rule), enforced by the wrapper script that emits one posts:create per clip-platform-day
•No video is allowed to appear more than once on a channel ever (no-repost rule)
•Mon-Fri tactical clips capped at 5 per week. The Saturday wrap is a separate TikTok-only post (see below).
•TikTok Saturday wrap video (effective W21, 2026-05-12; format restated 2026-05-09 after the carousel verification spike): one additional TikTok-only 30-45 second casual recap clip per week, scheduled for 9:00 AM ET Saturday. Rides the same Stages 2-5 pipeline as the weekday clips. From W23 onward, scheduled via Postiz CLI with only the TikTok integration ID. Does NOT count against the no-repost rule (different content from the Mon-Fri tactical clips). Does NOT count against the same-day no-duplicate rule (TikTok-only). See reference/skills/brand-standards/SKILL.md > TikTok > Saturday wrap video format. The wrap script is produced in Stage 2; the caption is produced in Stage 6.
•W20 was a one-off manual exception: the carousel-to-wrap pivot happened mid-W20 (2026-05-09) so the W20 wrap was filmed separately, trimmed by William, and scheduled directly in TikTok Studio web. From W21 the wrap rode the Opus Clip path. W22 ships from the local renderer (Stage 4 cutover); from W23 scheduling rides the Postiz path.
Generate Post Copy
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.Internal. AI writes platform-specific text for every clip: LinkedIn descriptions with inline links, YouTube titles and descriptions, TikTok captions, X copy under 280 characters with hashtags. Drafted into the week's upload-prep doc and emitted as the -c argument to each posts:create call in Stage 5.
•LinkedIn gets the YouTube URL in the post body with a compelling description; never 'link in comments'
•X copy stays under 280 characters as a single self-contained tweet with #ProfessorLeads as the first hashtag; the link goes in the main post body alongside the copy and hashtags (no reply threads)
•Every external URL pointing back to professorleads.com is UTM-tagged per the convention in reference/skills/brand-standards/SKILL.md (utm_source, utm_medium, utm_campaign=w{N}-{theme}, utm_content). Effective W20.
•TikTok Saturday wrap caption (effective W21, 2026-05-12; restated 2026-05-09): 1-2 sentences setting up the recap + the standard 6-hashtag set (#ProfessorLeads first). Less involved than the weekday clips since the wrap is TikTok-only and the post body contains no external link (the bio link rotates Saturday morning). Full format spec at reference/skills/brand-standards/SKILL.md > TikTok > Saturday wrap video format.
•Every piece of copy passes both Voice DNA and Brand Standards checks
•Drafted in hub/pipeline/weekN-upload-prep.md for traceability before being applied to scheduled posts
Draft Blog Post
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.CrosslinkInternal. AI writes a deep-dive blog post on the week's theme, incorporating the crosslink pick from Step 1 when one exists. The draft passes voice and brand compliance checks before moving to publish.
•Long-form blog post tied to the week's content theme
•Features the crosslink partner's article with a backlink when Stage 1 picked one
•Passes Voice DNA and Brand Standards before moving to Stage 9
•Drafted into content-drafts/blog/, then promoted to content/blog/ in Stage 9
Draft + Schedule Newsletter
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.CrosslinkPush content. AI drafts both newsletter editions (Beehiiv full + LinkedIn 'Playbook Preview' teaser), then schedules them via Chrome MCP for the Tuesday morning send. Beehiiv delivers; the Playbook Preview publishes 5 minutes after Beehiiv hits send.
•Full edition drafted for Beehiiv email subscribers, scheduled for the Tuesday 10:00 AM ET send
•Teaser edition drafted for LinkedIn Newsletter (The Playbook Preview), scheduled for 10:05 AM ET
•Both scheduled via Chrome MCP in the same session as the drafting (single-session pattern)
•The 5-minute lag exists so the LinkedIn body's archive link resolves to a populated Beehiiv archive page on first click
•Both feature the crosslink partner's content with attribution when one is picked for the week
•Playbook Preview body includes a prominent single-sentence Beehiiv cross-over CTA at peak interest (effective Issue 9, per 2026-04-23 health-check rule in brand-standards/SKILL.md)
•Beehiiv issue must have a one-sentence post description (Excerpt / Subtitle field) populated before the Schedule click; the field renders on every archive card at newsletter.professorleads.com (effective 2026-04-23, after the audit caught multiple blank cards)
•Beehiiv email Subject Line caps at 60 characters so the hook lands before Gmail / Apple Mail / Outlook truncation; the Beehiiv counter reads /200 but the rule is 60 (effective 2026-04-27, after the Apr 21 108-char send lost ~16pp open rate)
•Beehiiv email Subject Line and LinkedIn Newsletter headline are separate instruments effective W19 (2026-05-05): write the Subject Line for inbox curiosity-gap framing and the LinkedIn headline for article-card payoff framing; they can match, but only on purpose. Evidence: W17 curiosity gap opened 34.88% on Beehiiv vs W18 numbers/dollar at 22.73% on the same 44-recipient list, while W18 numbers/dollar tripled LinkedIn Newsletter impressions WoW (487 vs 173) on the same audience arc
Publish Blog
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.Pull content. The blog publishes as soon as Stage 7 finishes and all checks pass, not on a calendar date. The file is moved into content/blog/, committed, pushed; Vercel auto-deploys within 60 seconds.
•Publish-on-completion: fires the moment Voice DNA + Brand Standards self-checks pass AND all links verify live
•Frontmatter date stays at the canonical week-of date even when the file lands earlier
•Markdown committed and pushed to main; Vercel auto-deploys within 60 seconds
•Pull content has no audience notification, so early publish is invisible to subscribers and improves SEO indexing time
•After Vercel deploy: submit the new blog URL to Google Search Console for indexing via the URL Inspection tool (see CLAUDE.md > Google Search Console Indexing)
Schedule Blog Promo
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.Push content. AI drafts a LinkedIn text post promoting the new blog, then schedules it via Chrome MCP from the William DeCourcy personal profile for the Monday morning slot. LinkedIn delivers on schedule.
•Push content: drafted and scheduled in advance, fired by LinkedIn on the Monday morning slot
•LinkedIn text post with a direct link to the new blog article, posted from the William DeCourcy personal profile
•Drafted and scheduled in the same Chrome MCP session that publishes the blog (single-session pattern)
•Voice DNA and Brand Standards self-checks gate the draft before scheduling
•Not event-triggered by the blog publish: the calendar slot is the source of truth
Post Back to Crosslink Channel
GatedVoice DNA: Writing style compliance. Every sentence checked against banned phrases, em dash rules, paragraph length limits, and contraction requirements.Brand Standards: Brand identity and platform formatting. Correct naming, hashtag order, account selection, link placement, the no-duplicate rule, and the no-repost rule.CrosslinkPush content. After both the blog and newsletter are live, AI posts to #seo-crosslink-exchange announcing them and tagging the contributor whose article was featured. Closes the reciprocity loop. Skipped automatically on weeks where Stage 1 found no fit.
•Posts to #seo-crosslink-exchange with links to the new blog and newsletter
•Tags the contributor whose article was featured this week
•Closes the reciprocity loop: they link to us, we link to them
•Skipped automatically on weeks where Stage 1 found no crosslink fit (W16 ran without one)
Live Week
Operational. Content publishes automatically across all platforms Mon-Fri based on the schedules set in earlier stages. A 15-minute daily engagement routine runs (comment responses, outbound engagement, collaboration outreach).
•Host platforms fire scheduled content daily — nothing new is created here
•15-minute daily engagement routine: respond to comments, engage with others, reach out for collaborations
•No manual intervention needed unless the health check flags something
Health Check
Internal. A comprehensive Friday audit covering content delivery, site traffic, search performance, social channel activity across every brand-owned account, technical SEO, and deployment health. Emails a full report with a one-page PDF infographic attached.
•Verifies every scheduled piece published across all platforms
•Pulls GA4 traffic data with social breakdown by platform (LinkedIn, YouTube, TikTok, etc.) plus YTD totals since Jan 1
•Pulls Google Search Console indexing, clicks, rankings, and YTD impressions/clicks
•Pulls YouTube channel stats, subscribers, per-video performance, and YTD aggregates via YouTube Data API
•Pulls Beehiiv subscriber growth, open rates, click rates, and YTD rollups via Beehiiv API
•Scrapes LinkedIn Personal, LinkedIn Company, LinkedIn Newsletter, X, and TikTok analytics dashboards via Chrome MCP (canonical playbook: scripts/health-check/social-collection-playbook.md) — falls back to a manual-fill email if a platform's auth expires or selectors drift
•Merges all per-channel blobs into a single social_metrics.json with WoW deltas per channel and YTD totals rolled up across channels
•Claude reviews the merged numbers and writes insights (why the numbers moved) and recommendations (per-channel one-liners + overall bullets) into the same JSON
•Renders a one-page portrait PDF infographic (@react-pdf/renderer) with hero stats, per-channel grid, traffic-flow strip, recommendations panel, and YTD footer
•Runs technical SEO checks: sitemap validation, key page status codes, SSL, Core Web Vitals
•Checks Vercel deployment health and build status
•Emails the full HTML report with the PDF attached to Professor@ProfessorLeads.com via the Resend API
Weekly Output
Want the Playbook?
The newsletter breaks down one piece of this system every week. Real frameworks, real metrics, no fluff.
What you're signing up for: One email per week. That's it. You'll get actionable performance marketing insights, frameworks I've built over 15 years in the field, and the occasional resource I think is worth your time.
What I won't do: Sell your email address. Spam you with daily pitches. Pretend we're best friends so I can push affiliate links. Your inbox is already a mess. I'm not here to make it worse.
The fine print: By clicking 'Subscribe', you consent to receive weekly marketing emails from Professor Leads (ProfessorLeads.com). Every email includes an unsubscribe link that actually works (because nothing erodes trust faster than a broken opt-out). You can leave anytime, no questions asked.
Sponsored content: If I ever recommend a product or service I've been compensated for, I'll tell you. Clearly. Every time.
Oh, and one more thing: this page is generated from the same pipeline definition file that runs the actual production process. When a stage gets added, removed, or renamed, this diagram updates itself on the next deploy. The page about the automation is, itself, automated. Couldn't help it.
Last deployed May 22, 2026 at 1:23:02 PM EDT

