Each workflow is a complete recipe: trigger source, AI step, output destination — all on Vercel cron + serverless. Drop the code, set the env vars, deploy. No Zapier, no n8n, no monthly platform fee.
Both include the architecture diagram, env vars, the actual Vercel serverless function code, and the gotchas I hit shipping them in production.
Drop a long-form blog post in. Get back: X thread (8 tweets), LinkedIn carousel script (9 slides), Beehiiv newsletter draft, native X video script (60s), Reddit-friendly version, podcast intro. All voice-matched, all queued in your scheduling tools.
// vercel.json { "crons": [{ "path": "/api/cron/content-engine", "schedule": "0 11 * * 1-5" // weekdays 07:00 ET }] } // api/cron/content-engine.ts import { Anthropic } from '@anthropic-ai/sdk'; import { parseFeed } from './_feed'; import { kv } from '@vercel/kv'; const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }); export async function GET() { const feed = await parseFeed('https://aiopsforge.dev/blogs/feed.xml'); const latest = feed.items[0]; // Idempotency — don't reprocess const seen = await kv.get(`content-engine:${latest.guid}`); if (seen) return Response.json({ skipped: true }); // Run 6 variants in parallel const variants = await Promise.all([ generate('x-thread', latest), generate('linkedin-carousel', latest), generate('newsletter', latest), generate('x-video-script', latest), generate('reddit', latest), generate('podcast-intro', latest), ]); await queueToTypefully(variants[0], variants[3]); await queueToAuthoredUp(variants[1]); await emailDraft(variants[2]); await kv.set(`content-engine:${latest.guid}`, true, { ex: 86400 * 30 }); return Response.json({ ok: true, variants: variants.length }); }
ANTHROPIC_API_KEY · Claude API tokenTYPEFULLY_API_KEY · for queueing X draftsAUTHOREDUP_API_KEY · for LinkedIn draftsKV_REST_API_URL + KV_REST_API_TOKEN · Vercel KV for idempotencyWhen someone joins via Whop, fire a personalized Day-0 welcome (via Claude), tag them in Beehiiv with their referral source, schedule the 30-day sequence, post to your operator Slack. All in one webhook handler.
// api/whop-webhook-membership-created.ts import crypto from 'crypto'; import { Anthropic } from '@anthropic-ai/sdk'; import { kv } from '@vercel/kv'; export async function POST(req: Request) { const body = await req.text(); const sig = req.headers.get('x-whop-signature'); // Verify HMAC const expected = crypto.createHmac('sha256', process.env.WHOP_WEBHOOK_SECRET!).update(body).digest('hex'); if (sig !== expected) return new Response('invalid signature', { status: 401 }); const event = JSON.parse(body); const { user, membership } = event.data; // Idempotency — don't double-process retries const seen = await kv.get(`whop:${event.id}`); if (seen) return Response.json({ skipped: true }); // Personalize welcome with Claude const welcome = await anthropic.messages.create({ model: 'claude-sonnet-4-6', max_tokens: 300, messages: [{ role: 'user', content: `Write a 3-line welcome DM for ${user.first_name} who joined via ${membership.referrer || 'organic'}. Voice: operator-to-operator, no fluff, sentence case. Reference one specific thing in /community/start-here.` }] }); // Add to Beehiiv with tag await fetch(`https://api.beehiiv.com/v2/publications/${PUB_ID}/subscriptions`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.BEEHIIV_API_KEY}` }, body: JSON.stringify({ email: user.email, custom_fields: { first_name: user.first_name, whop_id: user.id }, tags: ['members-active', `source:${membership.referrer || 'organic'}`] }) }); // Send Whop DM + Slack ping await sendWhopDM(user.id, welcome.content[0].text); await pingSlack(`New member: ${user.first_name} via ${membership.referrer || 'organic'}`); await kv.set(`whop:${event.id}`, true, { ex: 86400 * 7 }); return Response.json({ ok: true }); }
Each ships with the same level of detail: architecture diagram, full code, env vars, gotchas. New workflow drops every 3 weeks.