---
## Quick Start
```bash
git clone https://github.com/RudrenduPaul/podcast-guest-crm
cd podcast-guest-crm
pnpm install
pnpm dev
```
The app runs on seed data from first boot; 34 realistic guests across all six pipeline stages. No environment variables required.
```
web: http://localhost:3000
api: http://localhost:3001
docs: http://localhost:3001/docs โ Swagger UI, auto-generated from route schemas
```
> [!NOTE]
> Zero-config only applies to this local dev mode running on seed data. A production deployment needs real Supabase and Anthropic credentials set in the environment: the Zod env schema in `packages/config` crashes the server at boot if a required secret is missing, by design.
---
## The Problem
**Every tool a podcast host reaches for was built for a different job.** HubSpot is a sales CRM. PodMatch is a discovery marketplace. Notion is a blank canvas that requires engineering to become anything useful. None of them model the guest lifecycle (the arc from discovery through outreach, scheduling, recording, publishing, and follow-up) as a first-class object.
This tool does. Guest fit scoring, personalized outreach drafting, interview prep, and follow-up sequences run on `claude-sonnet-4-6`, which is what makes automating those specific steps viable now in a way that wasn't a couple of years ago.
---
## The Product
A full-stack AI-native CRM with six pages, eleven features, and zero compromises on craft.
### Core Workflow
```
Discover โ Outreach โ Scheduled โ Recorded โ Published โ Follow-up
```
Every guest moves through this lifecycle. Every transition is validated, logged, and acted on. The system knows where every guest is, when they last heard from you, and what needs to happen next. Without you having to remember.
### Feature Surface
| Feature | What it does |
|---------|-------------|
| **Cmd+K Palette** | Search any guest by name, company, or topic. Navigate all six pages. Trigger actions. Entirely keyboard-driven. The fastest path to anything in the app. |
| **Kanban Pipeline** | Six-column drag-and-drop board. Optimistic updates. Lifecycle rules enforced at the service layer. You can't jump from Discover to Published. Confetti fires on every confirmed booking. |
| **AI Email Composer** | Select a guest, click Generate. Our AI streams a personalized 150โ250 word pitch, character by character. Typewriter effect, not a spinner. Confidence score included. |
| **Interview Brief** | One-click pre-recording brief: bio intro, 5 tailored question types, talking points, closing hook. Copy-ready. |
| **Social Posts** | LinkedIn post, Twitter/X thread (5 tweets with character counts), Instagram caption. Platform tabs, one-click copy per platform. |
| **Notification Center** | Persistent bell dropdown. Shows guests without reply in 7+ days and upcoming recordings. Always visible. Always actionable. |
| **Today's Focus** | Dashboard section that surfaces exactly what needs attention today. No manual triage required. |
| **Guest Detail** | Animated fit score ring (counts from 0), lifecycle progress timeline, full contact links, AI action sidebar with three generative panels. |
| **Analytics** | Bar chart by stage, donut by topic, 12-week outreach activity timeline, conversion metrics. Runs without backend dependency. |
| **Add Guest Modal** | Cmd+N from anywhere. Name, email, title, company, bio, topics, LinkedIn, Twitter, stage, priority. Fit score auto-generated on create. |
| **Smart Nudges** | Toast appears on dashboard load when guests have been in outreach > 7 days without reply. Proactive, named, not nagging. |
### Keyboard Shortcuts
The app is designed for keyboard-first workflows. Power users never touch the mouse for core tasks.
| Shortcut | Action |
|----------|--------|
| `โK` | Command palette. Search guests, navigate, trigger actions |
| `โN` | Add Guest modal directly |
| `โ โ` | Navigate palette results |
| `โต` | Select |
| `Esc` | Close any modal |
---
## AI Layer
All AI lives in `packages/ai`. The only place in the codebase that imports `@anthropic-ai/sdk`. Every feature calls a typed function. It never touches the SDK directly.
Two modes: `completeJSON