Open-Source Cold Email & Warmup Platform
Warmbly is the open-source platform for cold email: warm your mailboxes, send campaigns, and triage every reply. Run it on our cloud or self-host the whole thing.
Strategy agents turn a campaign objective into an evidenced brief; synthetic personas critique it; a person signs it off.
Translation pending
MarketingTypeScript · PLpgSQLGitHub @rorymcclellandOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A demonstration multi-agent campaign studio: AI agents take a marketing campaign from a one-line objective to checked, on-brand ads in every size and language, with a person approving every step that spends, publishes, or replaces work. Non-commercial; fictional brands and simulated data.
Loading the full README.
Read the full README ↗A multi-agent campaign studio for marketing teams. Three squads of AI agents (Strategy, Creative and Performance) share one Business Context store and take a campaign from a one-line objective to on-brand creative that stays above its performance threshold. A person approves every consequential move.
About this project. Studio is a demonstration, built to show how a team of AI agents can take on marketing production safely, and it has no commercial aim: it is not for sale, and it is not offered as a service. The idea was inspired by multi-agent campaign platforms I saw while working at Elsewhen. Studio was built independently, after I left, and uses none of Elsewhen's code, data, or designs. All brands and figures in the app are fictional or simulated.
Status: Sprint 9 of 11 (Performance I: simulator and monitor). What works today:
The rest of the Performance squad (fatigue forecasts, swaps and budget) arrives in Sprint 10. Every performance figure is simulated, and the app says so wherever it shows one.
Next.js 16 on Vercel (London), Postgres on Neon (London, with row-level security per workspace), Studio's own sign-in with links sent by Resend, Inngest for durable agent workflows, the Vercel AI SDK with Claude and Gemini behind one provider layer. See docs/decisions/ for why (0015 for Neon and the sign-in).
Needs Node 22 and a local Postgres 16 on port 54329 (trust auth for postgres).
npm ci
cp .env.example .env.local # the console mailer and MODEL_PROVIDER_OVERRIDE=mock need no keys
npm run db:reset # rebuild the local database from db/migrations, with the dev seed
npm run dev # app on http://localhost:3000
npm run inngest # workflow dev server on http://localhost:8288 (separate terminal)
To sign in, enter an ALLOWED_EMAILS address on /signin. Locally no email is sent: the sign-in link is written to the npm run dev log (look for [mail]); open it and press Continue. It works once, for 15 minutes.
With MODEL_PROVIDER_OVERRIDE=mock nothing is spent. To use real models, set ANTHROPIC_API_KEY (and GOOGLE_GENERATIVE_AI_API_KEY for Gemini) and remove the override.
| Command | Does |
|---|---|
npm run typecheck / npm run lint | Types and lint, zero warnings |
npm test | Unit, database (tenancy and RLS) and agent-workflow tests |
npm run test:e2e | Playwright against a running app and Inngest dev server |
npm run check:secrets | Blocks anything key-shaped from being committed |
npm run db:migrate | Applies pending files in db/migrations to DATABASE_URL and records them in schema_migrations; -- --dry-run lists them and changes nothing |
CI runs all of these on every push. A git pre-commit hook and Claude Code hooks run the same checks locally.
Sprint sign-off (decision 0021). Every agreed test case is in tests/e2e/cases.ts with how it is checked. In CI the browser tests are recorded, and each push's results and recordings go to the branch e2e-results/ci/<branch>; node scripts/demo-page.mjs --results <checkout of that branch> --sprint <N> --out <folder> builds the demo page Rory signs the sprint off from. Locally, E2E_VIDEO=1 npm run test:e2e records too, and node scripts/e2e-results.mjs --out <folder> gathers a run's results the same way.
Honest by default; fictional brands only; people approve consequential actions; every agent run is traceable; spend is capped; secrets stay out of the repo; tenancy from day one; the image model never draws text. In full in CLAUDE.md.
docs/refinement/: each sprint's stories, test cases and agreed answersdocs/decisions/: decision recordsdocs/design/directions.md: the Sprint 1 design directions (Soft machine chosen; see decision 0007 and /design for the design system)docs/hosting.md: setting up Neon, Resend, Vercel, Inngest and the model keys, and applying migrationsdocs/new-demo-app.md: the sign-in, migrations and Neon set-up to copy into the next demo app