From market signalto live campaignresearch
Ten agents research your market, draft A/B variants in your voice, publish to real channels, then read the engagement back — so the next post is sharper than the last.
Ten agents.
One growth loop.
Site crawl and positioning
Point the Researcher at your website. A Firecrawl-powered crawler extracts your positioning, audience, offer, and voice — the raw inputs every downstream agent depends on.
Seven-domain PESTEL research
Seven subagents run in parallel — market, competitors, audience, trends, regulatory, tech, macro — and synthesize a master_context v1 you can read and edit.
LinkedIn, Gmail, and Sanity, live
The Publisher ships to real LinkedIn posts + Gmail A/B outreach via Unipile Hosted Auth, and real Sanity blog via @sanity/client. Not mockups. Roadmap: Instagram, WhatsApp, X — same architecture.
A/B variants by default
Ask the Conductor for a LinkedIn post or blog. The Variant Generator drafts two variants tuned to your voice and a specific audience segment — never one, always two.
Closed-loop engagement signals
The Monitor polls LinkedIn, listens to Gmail reply webhooks, and subscribes to Sanity webhooks. The Signal Synthesizer condenses reactions, comments, replies, and impressions into one engagement_batch learning per publish.
A Conductor wielding 14 tools
Strategy lives in chat. The Conductor — a Claude Sonnet LLM — picks between research, variant generation, publish, and learning tools on intent, no mode switching required.
Artifacts materialize in-chat
Research snapshots, draft variants, and winner analyses render as interactive cards inline. Pin the ones that matter into the hub view when you need a workspace.
A master_context that evolves
Append-only learnings feed a daily Curator that rolls master_context forward — v1, v2, v3, v4. The system gets measurably smarter about your audience every cycle.
Variant Comparator picks winners
When both A and B have engagement signals, the Comparator writes a variant_comparison learning — why this angle beat that one, in structured form the Curator can read.
Autopilot runs the loop
An eleventh meta-layer wires timers over the stack: monitor at T plus measurement window, comparator when both sides have learnings, curator daily at 02:00 UTC. No chip clicks.
Research. Publish.
Learn. Repeat.
1// Researcher + 7-domain PESTEL + Seed Curator2await researcher.crawl({ url: 'yourcompany.com' })34await Promise.all([5 domain.run('market'),6 domain.run('competitors'),7 domain.run('audience'),8 domain.run('trends'),9 domain.run('regulatory'),10 domain.run('tech'),11 domain.run('macro'),12])1314await curator.seed() // master_context v1
How the loop
works.
Five stages, ten agents, one living strategy document that evolves every cycle.
Research
Site crawl plus seven PESTEL domains seed master_context v1
Generate
Conductor drafts A and B variants tuned to your voice
Publish
Real LinkedIn + Gmail via Unipile, real Sanity blog via @sanity/client
Measure
Monitor pulls engagement, Synthesizer writes learnings
Evolve
Comparator picks winners, Curator rolls master_context forward
Real channels,
real publishes.
LinkedIn, Gmail, and Sanity are live today. The rest route through Unipile on the same architecture — same auth, same Monitor, same learnings.
Trust is
non-negotiable.
Autonomous agents touching real publishing surfaces is a trust problem first, a product problem second. We designed the stack that way.
Your content never trains the models
Claude Sonnet runs behind the Vercel AI Gateway with training opt-out. Your posts, master_context, and engagement history stay yours.
Hosted channel auth, zero credentials
LinkedIn and Gmail connect through Unipile Hosted Auth — cookie session for LinkedIn, Google OAuth for Gmail. We never see your password or tokens, and you can revoke access at any time.
Row-level security, end to end
Every row in Supabase Postgres is fenced by RLS keyed on project and org. A stray query can't cross a tenant boundary, by construction.
Append-only learnings, auditable
Every learning the system writes is immutable and versioned. You can walk master_context back from v4 to v1 and see exactly why each edit happened.
Built on the stack
you'd pick anyway.
Next.js 16 on Vercel Fluid Compute. Claude Sonnet 4.6 via the AI Gateway. Supabase for data and realtime. Trigger.dev for the durable jobs that close the loop. No bespoke framework to learn.
Vercel AI SDK v6
generateText plus structured Output.object — every agent is a typed tool call.
Trigger.dev v4
Durable background jobs run the Monitor, Comparator, and daily Curator on schedule.
Supabase Postgres + RLS
Append-only learnings, Realtime channels, and tenant isolation at the row.
Unipile-backed channels
LinkedIn and Gmail live today — posts, A/B email outreach, webhook-driven reply ingestion. Instagram, WhatsApp, X drop in on the same interface.
import { generateText, Output } from 'ai'import { anthropic } from '@ai-sdk/anthropic'import { z } from 'zod'const { experimental_output } = await generateText({model: anthropic('claude-sonnet-4.6'),system: conductorSystemPrompt(masterContext),prompt: 'Write a LinkedIn post about our A/B loop.',experimental_output: Output.object({schema: z.object({variantA: z.string(),variantB: z.string(),hypothesis: z.string(),}),}),})
Close the loop
on your growth.
Point Caldrin at your site, connect LinkedIn and Gmail, and watch the master_context evolve after every post and reply. Ten agents do the work.
Free during beta