Multi-agent growth loop, closed

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.

Capabilities

Ten agents.
One growth loop.

01

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.

AI
02

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.

LiX@+
03

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.

A45%B55%vs
04

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.

05

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.

RGTX
06

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.

07

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.

08

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.

09

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.

10

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.

Process

Research. Publish.
Learn. Repeat.

caldrin-loop.ts
1// Researcher + 7-domain PESTEL + Seed Curator
2await researcher.crawl({ url: 'yourcompany.com' })
3
4await 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])
13
14await curator.seed()  // master_context v1
Loop active
The Loop

How the loop
works.

Five stages, ten agents, one living strategy document that evolves every cycle.

01

Research

Site crawl plus seven PESTEL domains seed master_context v1

02

Generate

Conductor drafts A and B variants tuned to your voice

03

Publish

Real LinkedIn + Gmail via Unipile, real Sanity blog via @sanity/client

04

Measure

Monitor pulls engagement, Synthesizer writes learnings

05

Evolve

Comparator picks winners, Curator rolls master_context forward

Autopilot closes the loop
Integrations

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.

LinkedIn
Live channel
Gmail
Live channel
Sanity
Live channel
Unipile
Channel infra
Firecrawl
Research
Supabase
Data + realtime
Trigger.dev
Durable jobs
Claude Sonnet
Reasoning
Vercel AI SDK
Runtime
Outlook
Roadmap
Instagram
Roadmap
WhatsApp
Roadmap
X / Twitter
Roadmap
LinkedIn
Live channel
Gmail
Live channel
Sanity
Live channel
Unipile
Channel infra
Firecrawl
Research
Supabase
Data + realtime
Trigger.dev
Durable jobs
Claude Sonnet
Reasoning
Vercel AI SDK
Runtime
Outlook
Roadmap
Instagram
Roadmap
WhatsApp
Roadmap
X / Twitter
Roadmap
X / Twitter
Roadmap
WhatsApp
Roadmap
Instagram
Roadmap
Outlook
Roadmap
Vercel AI SDK
Runtime
Claude Sonnet
Reasoning
Trigger.dev
Durable jobs
Supabase
Data + realtime
Firecrawl
Research
Unipile
Channel infra
Sanity
Live channel
Gmail
Live channel
LinkedIn
Live channel
X / Twitter
Roadmap
WhatsApp
Roadmap
Instagram
Roadmap
Outlook
Roadmap
Vercel AI SDK
Runtime
Claude Sonnet
Reasoning
Trigger.dev
Durable jobs
Supabase
Data + realtime
Firecrawl
Research
Unipile
Channel infra
Sanity
Live channel
Gmail
Live channel
LinkedIn
Live channel
Security

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.

For developers

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