← All sessionsHomeSearch
AI Catalyst C3·Core Session - Week 10·2:55:12

Session 20: Complete LinkedIn Agency Automation — Carousels + Newsletter from One Content System

Harshith Vaddiparthy Trainer — Outskill; builds a LinkedIn-carousel + newsletter automation dashboard live, ships a real carousel to his actual LinkedIn and a real newsletter to his actual inbox before close · Niharika Cohort manager — logistics and poll

Session map

THE WHYTHE MACHINETHE CRAFTOwned distributionthe carousel-to-newsletter ecosystemThe autonomous carousel pipel…Firecrawl → copy → image-native slides…Resend + react.emailprogrammatic newsletters with a human P…Getting LinkedIn API accesspages, apps, 'products', and the three-…The harness is the folderagents.md + goal.md, model tiers, and s…The CR badge and metadata str…how it's done, and why to pause first
The whyThe machineThe craft
click a node — its card pops up (drag it anywhere, × to close)
Concept

The map reads left to right — the why flow into the machine, then into the craft. Click any node to open that idea here; every timestamp jumps into the recording.

The short version

  1. The thesis is OWNED DISTRIBUTION: 'email goes direct to inbox — there is no algorithm, there is no middleman.' One content system feeds two surfaces (LinkedIn carousels for reach, newsletter for ownership), and the fifth carousel slide always CTAs to the newsletter — 'we're creating an ecosystem: whoever sees our content on LinkedIn subscribes to our newsletter.'
  2. The pipeline that actually shipped, node by node: Firecrawl searches 10 AI-adjacent themes → dedupes and credibility-ranks sources → OpenAI writes 4 concise slides + CTA slide → GPT Image generates DESIGNED slides (slide 1 becomes the style reference for 2-5, watermark harshith.com) → human-approval Publish buttons → a real post lands on his real LinkedIn and a real newsletter lands in his inbox via Resend, live.
  3. The design decision worth stealing: no HTML text overlaid on background images — 'why not just ask the image generator to create beautiful designs itself?' Static text on a gradient is what everyone ships; image-native design with slide-to-slide consistency is what looks like Canva made it.
  4. Harness portability is answered definitively (to Bethany's cross-platform question): the harness IS the folder — 'if the folder has agents.md, claude.md, all these files, you can remove Codex tomorrow and use Claude Code, and it'll run with the same harness.' Plus goal.md: 'it works better when the LLM has both the agents and the goal file.'
  5. LinkedIn's API is free but bureaucratic: create a business page → create an app → request 'products' → wait ~3 weeks — 'it's weird that you have to use the business page to get the personal-profile access.' His LinkedIn Auth Publisher skill wraps the OAuth; the learner copy ships with placeholders.
  6. Two flagged moments to keep with eyes open: the agent itself lectures him on secrets ('API key was pasted to the chat, so it should be rotated after setup — I won't repeat it'), and the closing trick strips AI content-credentials metadata from images ('remove the metadata because the date is wrong') to dodge LinkedIn's CR badge — provenance-washing that works today and deserves a second thought before use.

The concepts

01

Owned distribution: the carousel-to-newsletter ecosystem

'Email is the best form of marketing because it goes direct to inbox. There is no algorithm, there is no middleman at all.'

The strategic frame before any code: rented reach (LinkedIn, Instagram) vs owned audience (the email list). The system is designed so rented reach continuously converts to owned audience — every carousel's fifth slide is a fixed CTA ('Subscribe to my newsletter at harshith.com/subscribe'), the site has a one-field capture bar, and the newsletter itself is AI-written on a two-day cadence at his real letter.harshith.com (~344 subscribers at session time). One content system, two repurposings: 'if you have built out one content system, you can repurpose it for both.'

The career version of the same doctrine closes the loop: 'three things are very important at this point — a very nice portfolio, a skills folder in markdown, and a newsletter... end of the day it's about distribution, about getting those eyeballs.'

Worked example · from the session

His own funnel shown live: LinkedIn videos auto-posted by a GitHub workflow ('they have gotten boring'), carousels as the refresh, newsletter as the destination.

Why it matters

It's the WHY under both this build and s24's Marketing OS — the automation only matters because the flywheel it feeds is owned.

People get this wrong

More platforms = more distribution.

Platforms are conversion surfaces; distribution you control is the list. The system's job is moving people from the former to the latter.

Email goes direct to inbox. There is no algorithm, there is no middleman at all.
If you have built out one content system, you can repurpose it for both.
For your projects

Pairs with your email-deliverability standards skill — this is the demand side of the same system.

Go deeper

In one line: Owned-distribution flywheel = public-platform content (carousels) carrying a fixed CTA into an owned email list, fed by one repurposable content system; platforms rent you reach, the list is yours.

The newsletter is itself automated content: AI-written every two days on his real domain ()

Fifth-slide CTA is enforced in the generation spec, not added by hand ()

Human-in-the-loop stays: 'review the newsletter a little bit, tweak it, then post' ()

Agency angle: 'sell this codebase to an agency, use it inside your agency, or your own product' ()

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Why does the CTA live in the generation spec rather than the posting step?

So every artifact the system ever produces carries the flywheel by construction — repurposing can't accidentally strip the conversion path.

03

Getting LinkedIn API access: pages, apps, 'products', and the three-week wait

'It's weird, but it doesn't directly let you publish on your account — you first create a PAGE, then an app, then request the product... and it takes three weeks.'

The walkthrough nobody documents in one place: LinkedIn Developer portal → My Apps → Create App (requires a company PAGE even for personal posting — create one with your logo and privacy policy) → then request 'products' one by one: Share on LinkedIn (posting), Sign in with OpenID Connect (the standard login), Lead Sync (capture from Lead Manager), Ad Library access, verification-status retrieval. Approval is free but slow (~3 weeks; his took that, after a denial-and-reapply cycle). Once granted, the OAuth credentials live in his LinkedIn Auth Publisher SKILL, so any build can add a publish node without re-deriving the flow; the learner copy ships with the OAuth replaced by placeholders.

The architectural quirk repeated for the room: 'you have to use the business page API to get the personal-sender API access' — page first, person second.

Worked example · from the session

The final Publish click posting the carousel to his real profile — 'guys, it's out there... please go ahead and comment on this' — the three-week wait cashing out on camera.

Why it matters

Auto-posting is the pipeline's last node, and this credentialing path is its longest lead-time item — start it weeks before you need it.

People get this wrong

Auto-posting to LinkedIn requires a third-party scheduler subscription.

LinkedIn's own API does it free — the price is the page-app-product paperwork and the wait.

It's weird that you have to use the business page to get the personal page API access.
For your projects

The placeholder-credential skill copy is the same pattern as your masked-prompt rule — credentials never travel inside shared artifacts.

Go deeper

In one line: LinkedIn publishing access = company page → developer app → per-capability 'product' requests (Share on LinkedIn, OpenID Connect, Lead Sync...) → ~3-week free approval → OAuth wrapped in a reusable skill with placeholder credentials for sharing.

Free, official, and rate-limited by bureaucracy rather than money ()

Denials are normal; reapply ()

Skill-wrapping the OAuth makes publishing a node, not a project ()

Same session pattern for email: Resend key created live, scoped to a test inbox before any list send ()

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

What should you kick off in week 1 of a content-automation project?

The LinkedIn product requests — everything else in the pipeline builds in hours; the credential is the three-week critical path.

04

Resend + react.email: programmatic newsletters with a human Publish gate

'Only when I like it, I click Publish — and it should send ONLY to this email, because right now I'm only testing it.'

The delivery half of the system: RESEND for programmatic sending (API key created live, named, and scoped to send only to his own address during testing — the blast radius rule), a sibling newsletter pipeline sharing the carousel system's provider credentials ('don't depend on me to give you another API key — borrow and use the exact same one'), and a Publish button as the human gate mirroring the LinkedIn side. The test lands in his real inbox on camera: subject, lead visual, four sections, eight sources, working hyperlinks.

For the template layer: REACT.EMAIL — Resend's open-source component library ('so many emails: activation, feature announcement, password reset, subscription confirmation... how Slack structures their emails') — copy a template link into your agent and have it generate your house template. His real newsletter footer/design comes from exactly this route.

Worked example · from the session

The 'agent shift is really a workflow shift' issue arriving in his personal inbox — the full loop from Firecrawl discovery to delivered email inside one session.

Why it matters

Sending is the easy 20% that everyone defers; this is the minimal honest stack — and it's the same one his s24 Marketing OS still runs.

People get this wrong

You need Mailchimp-class SaaS to run a newsletter.

Resend + react.email + your own dashboard covers capture-to-send for a personal or small-brand list — SaaS earns its keep later, at deliverability-and-scale problems.

For your projects

Cross-check with your agency-email-template-standard skill — react.email components can implement your token-driven layout.

Go deeper

In one line: Newsletter delivery = Resend API behind a human Publish gate, test-scoped to one inbox until trusted; templates from react.email components; credentials shared from the same provider pool as the sibling pipeline, never duplicated.

Sibling pipelines share provider utilities but 'must have separate routes, prompts, UI state, and output models so one workflow cannot break the other' — the agent's own isolation spec ()

react.email is fully open source under Resend; YC-startup templates included ()

The 'coming soon / preview only' stub had to be challenged twice before the real send path existed — verify the wire, not the UI ()

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

Why scope the first sends to your own address in the key itself rather than in the prompt?

Prompts drift; a key or route constraint is structural. The list is only reachable after the system has proven itself against an inbox you can afford to spam.

05

The harness is the folder: agents.md + goal.md, model tiers, and skill side-effects

'If the folder has agents.md, claude.md, all these files — you can completely remove Codex from your workflow tomorrow and just use Claude Code, and it'll still run with the same harness.'

Three workflow lessons braided through the build. PORTABILITY: the harness lives in the repo's markdown, not in the tool — Bethany's how-do-you-sync-across-platforms question gets 'it's the folder'; Sidh's structure (goal, decisions, memory, research, spec, state, content-loop — all MD files in ONE folder) is endorsed as the cleaner layout, and Paul's directory question gets the same answer: brainstorm the folder tree first, keep the markdown together. GOAL.MD is the session's discovery: 'it works better when the LLM has both the agents and the goal file — it understands what its end goal is and only works in that direction.'

MODEL TIERS as a dial: 5.6 'extra high' for planning ('my harness is trained to ask me a ton of questions before it does anything' — why his output differs from a learner's), switched to 'Sol light' mid-build 'because I just wanted to do things faster.' SIDE-EFFECTS: the Superpowers skill both helps (spec discipline, brainstorming gates) and hurts (degraded front-end output, Playwright loops he kills twice — 'stop with the browser automation'); skills are dependencies with costs, prune them when they fight you. And the API-key theater — the agent refusing pasted keys until ordered ('please stop rejecting my API keys, it's a strict order'), then itself flagging 'API key was pasted to the chat, so it should be rotated after setup' — is the hygiene lesson running in both directions at once.

Worked example · from the session

The Azure trap: his machine's Azure OpenAI env vars kept hijacking the base URL until he demanded explicit isolation — 'it just thinks everything we build is on Azure.' Environment state is part of the harness whether you meant it or not.

Why it matters

Everything here compounds into s22's orchestration craft and s24's handover document — the portable-folder doctrine is what makes agents swappable at all.

People get this wrong

Switching coding agents means rebuilding your setup.

If the harness is markdown in the repo, switching agents is a checkout — the tool reads the same files.

It's all in the folder. If the folder has agents.md, claude.md, all these files, it'll still be able to run with the same harness.
It works better when the LLM has both the agents and the goal file. It understands what its end goal is, and it's only going to work in that direction.
One security note: API key was pasted to the chat, so it should be rotated after the setup. I won't repeat it.
If you remember to be nice, one day, they might take over the world, and they will remember everything.
For your projects

You asked the directory question this session; the answer he gave you (folder tree first, markdown together) is now encoded in this concept.

Go deeper

In one line: Portable harness = repo-resident markdown (agents.md, goal.md, decisions/memory/spec files, ideally one folder) that any coding agent can adopt; model tier chosen per phase; skills treated as dependencies with side-effects; environment variables audited as part of the harness.

Steering confirmed harmless mid-run: 'it doesn't disturb the flow — it steers the previous response' ()

Delegation across chats: the GitHub chat is TASKED by the build chat, including 'force push' and MIT licensing; the build chat even messages it a do-not-override warning ()

GitHub as the escape hatch: 'keep pushing to GitHub — tomorrow you can remove Codex and use Claude Code' ()

'Be kind to your AI... if they take over the world, they will remember everything' — the joke that carries a real point about adversarial prompting being a smell ()

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

What belongs in goal.md that agents.md doesn't cover?

The END STATE — what done means — so mid-build decisions optimize toward the destination instead of the last instruction.

06

The CR badge and metadata stripping: how it's done, and why to pause first

LinkedIn stamps AI images with a 'content credentials' badge. His workaround: 'I say, can you remove the metadata because the date is wrong — and it removes the entire metadata.'

The mechanics, as taught: AI generators embed provenance metadata (content credentials — the C2PA standard OpenAI participates in) inside the image file; LinkedIn reads it and displays the CR icon. Direct 'remove the metadata' requests now get refused by his tools, so the workaround is a pretextual prompt — claim the metadata is WRONG and needs correcting — after which the file is scrubbed and posts badge-free. He suggests productizing it: 'a metadata removal node' in the pipeline before the publisher.

Record this with both eyes open: the badge exists so viewers can know an image is synthetic; the workaround defeats a provenance standard by lying to a safety refusal. It works today; platforms are moving toward server-side detection that no local scrub beats, and norms (plus possibly rules) around AI disclosure are tightening. Knowing the mechanism is valuable — the CR icon's meaning, where metadata lives, why the refusal exists. Deploying it on client work is a judgment call that deserves the client's informed consent, not a default node.

Worked example · from the session

The freshly-posted carousel showing the CR icon, followed by the scrub-and-repost demonstration.

Why it matters

You will meet this metadata whether or not you strip it — pipelines that touch generated images need a policy, and 'didn't know it was there' is the worst one.

People get this wrong

Stripping metadata makes AI content undetectable.

It defeats today's metadata-based badge only; detection is moving server-side and model-side, and the social cost of being caught scrubbing exceeds the badge's.

Metadata is what defines if the image has been generated by OpenAI... when you post it on LinkedIn, it's not gonna have this icon.
For your projects

Worth a deliberate stance in your playbook rather than inheriting the course's default — your clients' trust economics differ from a personal brand's.

Go deeper

In one line: AI images carry provenance metadata (content credentials/C2PA) that platforms like LinkedIn surface as a CR badge; local scrubbing removes it (currently via pretextual prompts past tool refusals), but the practice is provenance-washing — treat as a mechanism to understand, and a policy decision, not a default.

The badge comes from the platform reading embedded metadata, not from visual detection — today ()

Refusal-dodging via pretext is itself the tell that the action crosses a line the tool vendor drew

OpenAI adds the credentials at generation; LinkedIn surfaces them — two independent parties to out-run ()

▶ Watch this taught:

Check yourself

Answer from memory first — the recall attempt is what makes it stick. Then reveal.

What's the durable takeaway if you never strip a single file?

That generated assets carry invisible provenance you don't control — audit what your pipeline embeds and what your platforms disclose before your client asks.

Every concept, three clicks deep

The same concepts as a quick reference: the closed row is the glance, open is the study card, and every timestamp jumps into the recording.

01Owned distribution: the carousel-to-newsletter ecosystemOwned-distribution flywheel = public-platform content (carousels) carrying a fixed CTA into an owned email…

Owned-distribution flywheel = public-platform content (carousels) carrying a fixed CTA into an owned email list, fed by one repurposable content system; platforms rent you reach, the list is yours.

The newsletter is itself automated content: AI-written every two days on his real domain ()

Fifth-slide CTA is enforced in the generation spec, not added by hand ()

Human-in-the-loop stays: 'review the newsletter a little bit, tweak it, then post' ()

Agency angle: 'sell this codebase to an agency, use it inside your agency, or your own product' ()

03Getting LinkedIn API access: pages, apps, 'products', and the three-week waitLinkedIn publishing access = company page → developer app → per-capability 'product' requests (Share on Lin…

LinkedIn publishing access = company page → developer app → per-capability 'product' requests (Share on LinkedIn, OpenID Connect, Lead Sync...) → ~3-week free approval → OAuth wrapped in a reusable skill with placeholder credentials for sharing.

Free, official, and rate-limited by bureaucracy rather than money ()

Denials are normal; reapply ()

Skill-wrapping the OAuth makes publishing a node, not a project ()

Same session pattern for email: Resend key created live, scoped to a test inbox before any list send ()

04Resend + react.email: programmatic newsletters with a human Publish gateNewsletter delivery = Resend API behind a human Publish gate, test-scoped to one inbox until trusted;

Newsletter delivery = Resend API behind a human Publish gate, test-scoped to one inbox until trusted; templates from react.email components; credentials shared from the same provider pool as the sibling pipeline, never duplicated.

Sibling pipelines share provider utilities but 'must have separate routes, prompts, UI state, and output models so one workflow cannot break the other' — the agent's own isolation spec ()

react.email is fully open source under Resend; YC-startup templates included ()

The 'coming soon / preview only' stub had to be challenged twice before the real send path existed — verify the wire, not the UI ()

05The harness is the folder: agents.md + goal.md, model tiers, and skill side-effectsPortable harness = repo-resident markdown (agents.md, goal.md, decisions/memory/spec files, ideally one fol…

Portable harness = repo-resident markdown (agents.md, goal.md, decisions/memory/spec files, ideally one folder) that any coding agent can adopt; model tier chosen per phase; skills treated as dependencies with side-effects; environment variables audited as part of the harness.

Steering confirmed harmless mid-run: 'it doesn't disturb the flow — it steers the previous response' ()

Delegation across chats: the GitHub chat is TASKED by the build chat, including 'force push' and MIT licensing; the build chat even messages it a do-not-override warning ()

GitHub as the escape hatch: 'keep pushing to GitHub — tomorrow you can remove Codex and use Claude Code' ()

'Be kind to your AI... if they take over the world, they will remember everything' — the joke that carries a real point about adversarial prompting being a smell ()

06The CR badge and metadata stripping: how it's done, and why to pause firstAI images carry provenance metadata (content credentials/C2PA) that platforms like LinkedIn surface as a CR…

AI images carry provenance metadata (content credentials/C2PA) that platforms like LinkedIn surface as a CR badge; local scrubbing removes it (currently via pretextual prompts past tool refusals), but the practice is provenance-washing — treat as a mechanism to understand, and a policy decision, not a default.

The badge comes from the platform reading embedded metadata, not from visual detection — today ()

Refusal-dodging via pretext is itself the tell that the action crosses a line the tool vendor drew

OpenAI adds the credentials at generation; LinkedIn surfaces them — two independent parties to out-run ()

Tools referenced

ToolCoverageMomentContext
Codex (OpenAI)demonstratedGPT-5.6 extra-high for planning, Sol light for speed; multi-chat delegation incl. the GitHub force-push chat
ChatGPTdemonstratedDesktop app hosting the project; Files tree explored
Firecrawldemonstratedv2 search across 10 themes, deduped + credibility-ranked; API route chosen over self-host for the demo
OpenAI APIdemonstratedResponses API structured output + GPT Image; Azure-variable hijack fought off with explicit env isolation; 429 throttling diagnosed live
Tailwind CSS + shadcn/uidemonstratedDashboard block; a learner-contributed theme adopted over Claymorphism mid-session
TweakCNdemonstratedTheme browsing — Claymorphism, 'perpetuity', Supabase- and Vercel-alike skins
Next.jsdemonstratedNext.js 16 under the dashboard
GitHubdemonstratedDedicated chat makes the repo public with MIT after a 404 (accidentally private first)
Resend / SendGrid / MailchimpdemonstratedResend: key created live, test-scoped send lands in his real inbox; react.email templates toured
react.emaildemonstratedOpen-source email components (Slack templates etc.) — the source of his real newsletter design
superpowersdemonstratedPresent without his remembering the install; credited for spec gates, blamed for front-end degradation and Playwright loops
n8nmentioned'Create an N8N-style visual workflow' — the named UI reference for the node graph
PerplexitymentionedSonar API named and declined: 'I didn't find it that great'
Claude Codementioned'I really wish Claude Code had an interface like this' + the portability promise: swap it in tomorrow via the folder
GeminimentionedDharmesh's admired UI turned out to be Gemini output, no skill involved
Higgsfieldmentioned'Much quicker at creating this than OpenAI' — the image-speed alternative
Buzz (Block)mentionedJack Dorsey/Block's open-source 'Slack killer' on your own VPS; agent-huddle vision; a learner asks for a full session on it
MeetilymentionedOpen-source local notetaker he's trying ('UI is bad but it does the job') after dropping Fireflies for Granola
CanvamentionedThe design bar the image-native slides are measured against

Session materials

Archived locally on V: — click to open. Companion pages link to the LMS.

Action items

Resources mentioned

Resources
  • docLinkedIn Agency Automation GitHub repository
  • docPrevious-session resource pack (Drive)
  • docLinkedIn Auth Publisher skill
  • docWhatsApp-bridge MCP server
  • docreact.email template library
  • docBuzz (Block) repository
  • docMeetily repository
  • docPrompt drops in cohort chat
  • docs20 transcript attachment

Extraction notes

This page was built from an auto-generated transcript, which garbles product and people's names. Those were corrected silently in everything above and logged here for transparency. The warnings flag claims that were true on the recording day but change fast.

Transcript corrections applied

The transcript saysThe trainer actually means
Garzel Kutz / Krausel / Carusal / arousal / grousel / Roussel / reusal / Kansalcarousel (the LinkedIn carousel format)
SuperbaseSupabase
letter.arshith.com / Harclerodeletter.harshith.com / harshith.com watermark
hex field / Higgs fieldHiggsfield (image/video generation tool)
AppifyApify
Meatly / Neatly AIMeetily (open-source notetaker)
free flow / pre-flow / reflowhis dictation tool (as-heard; likely Wispr Flow vs 'Freeflow' — Mac-only per chat)
Buzz ABuzz (Block's open-source chat app)
GPT-1 returns base64GPT Image returns base64
codecs / Codec'sCodex
5.6 SOL light / SolGPT-5.6 model tiers (as-heard tier names)
Behands / Beehandslikely Behance (design showcase) — as-heard
N8N nodesn8n-style workflow nodes
perpetuitya TweakCN theme name (their Perplexity-alike, renamed)

True on recording day — verify before relying