Part of the LemonBrand Build Challenges — tools you build, tools you own.
A proof-of-concept outbound email tool for podcast guest outreach, built in 21 minutes and 3 seconds with Claude Code. Manages contacts, templates, and AI-powered email generation — all running locally.
This is a proof of concept — not a polished product. It was built in a single timed session to demonstrate what's possible when you pair Claude Code with a clear idea and a tight deadline.
What works well:
- The matrix aesthetic is genuinely fun
- The three-touchpoint email strategy is solid
- Template variable merging works
- Contact and template CRUD is functional
What's rough:
- AI generation shells out to the Claude Code CLI instead of using an API key (should call Haiku or Sonnet via the Anthropic API directly)
- No real history UI — the backend stores drafts but there's no tab to browse them
- Not particularly useful for actual outreach tracking — you can't mark contacts as "emailed" or "replied" or track where someone is in the sequence
- Data lives in flat JSON files with no validation
- No search, no filtering, no sorting
- Single-user only, no auth
The point isn't that this is ready to use. The point is that it went from zero to a working prototype in 21 minutes. Fork it, gut it, rebuild the parts that matter to you.
- Contact Management — Store guest details, notes, custom fields for personalization
- Template System — Three-touchpoint email sequence (The Fan, The Value Add, The Hail Mary)
- AI Generation — Uses Claude Code CLI to personalize emails following the anti-AI strategy (works, but should use an API key instead)
- Template Preview — Merge
{{variables}}into templates before generating - Optional SMTP — Send emails directly if you configure credentials
- Matrix UI — Scanlines, digital rain, monospace everything
# Clone it
git clone https://github.com/lemonbrand/outbound-engine.git
cd outbound-engine
# Install dependencies
npm install
# Run it
npm startOpen http://localhost:3000. That's it.
If you have Claude Code CLI installed, the "Generate" button will use Claude to personalize your templates. Without it, the tool falls back to simple template merging.
If you're forking this: You'd probably want to swap the CLI call for a direct Anthropic API call using
claude-3-haikuorclaude-3-5-sonnet. The current approach works but it's clunky — it spawns a subprocess for every generation.
Copy .env.example to .env and fill in your SMTP credentials to send emails directly. Leave them empty for draft-only mode.
Three tabs.
Pre-built three-touchpoint outreach sequence based on the anti-AI strategy:
| Touchpoint | Name | When | Goal |
|---|---|---|---|
| 1 | The Fan | Day 0 | Prove you know them + low friction ask |
| 2 | The Value Add | Day 3-4 | Show you're looking for a convo, not a booking |
| 3 | The Hail Mary | Day 8-10 | Remove guilt, leave door open |
Templates use {{variable}} syntax that maps to contact fields and custom fields.
Add the people you want to reach out to. Each contact has:
- Name, email, company, role
- Tags for filtering
- Notes (your research about them)
- Custom fields — these map directly to template variables
Pick a contact + template, preview the merge, then generate with Claude or save a manual draft.
Missing: A history/drafts tab. The backend saves every generated email to
history.jsonwith timestamps and status, but there's no UI to browse it. That's what 21 minutes gets you.
outbound-engine/
├── server.js # Express API + Claude CLI integration
├── public/
│ └── index.html # Full UI (vanilla HTML/CSS/JS)
├── data/ # JSON file storage (gitignored)
│ ├── contacts.json # Your contact list
│ ├── templates.json # Email templates
│ └── history.json # Generated/drafted emails
├── data-sample/ # Sample data (seeds on first run)
├── .claude/
│ └── outbound-strategy.md # The anti-AI email writing guide
├── .env.example # SMTP config template
└── package.json
- Node.js + Express — Lightweight API server
- Vanilla HTML/CSS/JS — No frontend framework, no build step
- Claude Code CLI — AI email personalization (should be swapped for API)
- Nodemailer — SMTP email sending (optional)
- JSON files — Local data storage, no database
The built-in strategy guide (.claude/outbound-strategy.md) is honestly the most valuable part of this repo. It follows three principles:
- Raw — Lowercase, no HTML, stream of consciousness. Kill the polish.
- Real — Reference specific details that prove you consumed their content.
- Relevant — Make it about them, not about you.
The goal: your email should fail the "Did AI write this?" test. If ChatGPT isn't sure, rewrite it messier.
Here's what would make this actually useful:
- Swap CLI for API — Use the Anthropic SDK with an API key instead of shelling out to
claude. Call Haiku for speed, Sonnet for quality. - Add a history tab — The backend already stores everything in
history.json. Just needs a UI. - Track outreach status — Add a
statusfield to contacts:not_contacted,touchpoint_1_sent,replied,booked, etc. - Sequence automation — Auto-suggest the next touchpoint based on days since last email.
- Better data storage — SQLite or even just validated JSON schemas.
This is one of 28 build challenges from LemonBrand. Each challenge is a timed build session — the goal is to show what's possible, not to ship a perfect product.
21 minutes. Zero to working prototype. That's the point.
- Pricing Calculator — Dead-simple pricing for freelancers and consultants
- Proposal Generator — Turn a conversation into a formal proposal
- Invoice Generator — Create and track invoices
- Contract Builder — Standard agreements with custom terms
See all challenges at lemonbrand.io.
MIT — do whatever you want with it.
Built with Claude Code in 21 minutes and 3 seconds as part of a LemonBrand build challenge.
