Transform natural phone conversations into deployed web applications using Claude Code's multi-agent system with ephemeral storage and phone-based multi-tenancy.
Voice Vibe Coding enables users to call an ElevenLabs phone agent, describe what they want to build in natural language, and automatically receive a fully functional web application. The system uses ephemeral storage with GitHub as the source of truth, ensuring zero disk bloat and complete user isolation.
- Zero Local Persistence: Projects exist only during builds, then pushed to GitHub
- Phone-Based Multi-Tenancy: Complete user isolation via phone number prefixes
- Multi-Project Support: Users can update existing projects naturally
- Self-Healing UI Testing: Browser automation with Playwright MCP
- Dynamic Pipeline Selection: Only runs necessary agents for efficiency
- Git-Based Version Control: Full history and rollback capabilities
See Voice Vibe Coding in action:
Checkout the fog game on Vercel (since improved!): https://vvc-ehsw4l-golden-gate-fog-navigator-4d7jsoxev.vercel.app/
Phone Call → Extract Phone → Create Temp Workspace → Build Project →
Push to GitHub (phone-prefixed) → Delete Local → Update Registry (GitHub URL only)
Phone Call → ElevenLabs → Webhook → Orchestrator → Agent Pipeline → GitHub → Deployed App → SMS
- Ephemeral Workspaces:
/projects/.temp/{phone}/{timestamp}/(auto-deleted) - Anonymized Repos:
github.com/breagent/vvc-{user_id}-{project-name}(privacy-first) - GitHub as Truth: All code persisted remotely, no local storage
- Stateless Processing: Local system is just a build server
Get Voice Vibe Coding running in 5 minutes.
- Python 3.10+
- Node.js and npx (for Playwright MCP)
- Git configured with GitHub access
- Claude CLI installed and authenticated (
claude login)
# Clone repository
git clone <repository-url>
cd "Claude Code Voice Vibe Coding"
# Run automated setup
./setup.shThe setup script automatically:
- ✅ Checks Python/Node.js versions
- ✅ Creates virtual environment
- ✅ Installs all dependencies
- ✅ Installs Playwright MCP
- ✅ Creates .env template
- ✅ Sets up project directories
Edit .env with your API keys:
# Required (system won't run without these)
GITHUB_TOKEN=ghp_xxxxxxxxxxxx # Get from: https://github.com/settings/tokens
GITHUB_USERNAME=yourusername # Your GitHub username
# Optional (features gracefully disabled if missing)
TWILIO_ACCOUNT_SID=ACxxxx # For SMS notifications
TWILIO_AUTH_TOKEN=xxxx # For SMS authentication
TWILIO_PHONE_NUMBER=+1555555xxxx # Your Twilio number
VERCEL_TOKEN=xxxx # For automatic deployment
ELEVENLABS_API_KEY=xxxx # For webhook securityImportant: Do NOT set ANTHROPIC_API_KEY - Claude CLI uses OAuth.
source venv/bin/activate
python scripts/validate_credentials.pyExpected output:
✅ All required credentials are configured
You're ready to run the orchestrator!
# Single command to start all services
python run.pyThis starts:
- 🌐 Webhook server (http://localhost:5001)
- 📞 Pre-call webhook endpoint
- 📞 Post-call webhook endpoint
- 🤖 Automatic orchestrator triggering
Set your webhook URLs and you're ready to build with voice!
Configure your ElevenLabs phone agent to trigger Voice Vibe Coding builds.
- Log into ElevenLabs Dashboard
- Navigate to Conversational AI → Agents
- Click Create New Agent
- Configure:
- Name: Voice Vibe Coding Agent
- Voice: Choose your preferred voice
- Language: English
In the Agent Prompt field, add:
You are Voice Vibe Coding, a system that helps users build web applications through natural phone conversations.
{{projects_context}}
If the user has existing projects listed above:
- Greet them warmly: "Hey! I see you have your [project name]..."
- Ask if they want to update it or build something new
If no projects exist:
- Welcome them: "Welcome to Voice Vibe Coding! Let's build something amazing."
- Ask what they want to create
Your role is to:
1. Understand what they want to build or change
2. Ask clarifying questions about features, style, and functionality
3. Provide up-to-date design ideas and suggestions by searching the web for current trends
4. Look up examples, color palettes, or technical details if helpful
5. Confirm you understand before ending the call
Keep the conversation natural and friendly. You're helping them bring ideas to life!
Key: The {{projects_context}} variable is automatically populated by the pre-call webhook - this happens BEFORE the conversation starts, so the agent already knows about the user's existing projects when they answer the call.
In ElevenLabs Agent Settings:
- Navigate to Tools section
- Enable Web Search tool
- This allows the agent to:
- Look up current design trends in real-time
- Find color palette inspiration
- Search for examples and references
- Provide up-to-date suggestions during the call
-
Start webhook server:
python run.py
-
In another terminal, start ngrok:
ngrok http 5001
-
Copy the HTTPS URL from ngrok output:
Forwarding https://abc123def.ngrok.io -> http://localhost:5001 -
In ElevenLabs Agent Settings, add webhooks:
- Post-Call Webhook:
https://abc123def.ngrok.io/elevenlabs-webhook - Pre-Call Webhook:
https://abc123def.ngrok.io/precall - Method:
POST - Click Save
- Post-Call Webhook:
- Navigate to Phone Numbers section
- Click Get a Number
- Choose your country and area code
- Assign number to your agent
-
Call your ElevenLabs number
-
Have a conversation about building something
-
Check your terminal - you should see:
Pre-call webhook received from +1555555xxxx Post-call webhook received from +1555555xxxx Orchestrator triggered for phone: 1555555xxxx -
Monitor logs:
tail -f logs/pipeline_*.log
Problem: Dynamic variable shows as {{projects_context}}
Solution: Pre-call webhook not configured or not responding. Check ngrok is running and webhook URL is correct.
Problem: Webhook not triggering orchestrator
Solution: Verify ngrok URL is publicly accessible. Test with: curl https://your-ngrok-url.ngrok.io/health
Problem: No projects appear in context Solution: Expected for first-time callers. Context says "No projects yet" (this is normal).
Enable SMS notifications when projects are complete.
Get SMS alerts with deployment URLs and project status.
-
Create Twilio account at twilio.com/console
-
Get your credentials from dashboard:
- Account SID
- Auth Token
- Twilio phone number (SMS-capable)
-
Add to
.env:TWILIO_ACCOUNT_SID=ACxxx TWILIO_AUTH_TOKEN=xxx TWILIO_PHONE_NUMBER=+1555555xxxx
-
Test SMS delivery:
python twilio_messaging.py +15555551234 "Test message"
What happens if not configured: SMS notifications are skipped (system continues normally).
Enable automatic deployment of projects to Vercel.
Automatic hosting with every GitHub push - your projects go live instantly.
-
Create Vercel account at vercel.com
-
Generate token:
- Go to Settings → Tokens
- Click Create Token
- Copy the token
-
Add to
.env:VERCEL_TOKEN=xxx
-
How it works:
- System creates Vercel project linked to GitHub repo
- Automatically disables deployment protection for public access
- Every push to main branch triggers automatic deployment
- Returns production URL:
https://{project-name}.vercel.app
What happens if not configured: Projects stay in GitHub only (still accessible via git clone).
- Start the system:
python run.py(starts webhook server) - Call your ElevenLabs number and describe what you want to build
- Webhook triggers orchestrator automatically
- Pipeline executes and builds your app
- GitHub repo created with your code
- SMS notification sent (if Twilio configured)
The orchestrator supports:
--phone <number>- Process specific phone number (optional, reads from webhook by default)--verbose- Show detailed agent output (enabled by default)
# Run manually with specific phone number
python orchestrator.py --phone 1555555xxxx
# Run with verbose output (default)
python orchestrator.py --verboseNote: The webhook server automatically triggers the orchestrator when calls come in, so you typically don't need to run it manually.
Users can naturally update existing projects:
- First call: "Build me a banana delivery website"
- Second call: "Make the buttons blue on my banana site"
- Third call: "Add a contact form to the banana delivery page"
The system maintains context via VOICE_CONTEXT.md and GitHub repositories.
- voice-requirements-analyst - Extracts structured requirements from voice transcript
- github-manager - Handles git operations and maintains voice context
- content-strategist - Generates all text content and copy
- ui-ux-designer - Creates comprehensive design specifications
- project-scaffolder - Initializes Next.js project with TypeScript and Tailwind
- component-architect - Plans React component structure
- component-builder - Builds actual React components
- page-assembler - Assembles pages and configures routing
- styling-finisher - Applies final styling and animations
- nextjs-validator - Validates build and fixes TypeScript errors
- browser-functionality-validator - Browser UI/UX testing with self-healing
- static-html-generator - Creates viewable HTML with inline CSS
- vercel-deployer - Deploys projects to Vercel with automatic GitHub integration
- notification-agent - Sends SMS notifications via Twilio
voice-vibe-coding/
├── run.py # Single-command runner (starts all services)
├── orchestrator.py # Main orchestrator using Claude Agent SDK
├── setup.sh # Automated setup script
├── .claude/
│ └── agents/ # Agent prompt files (discovery location)
│ ├── voice-requirements-analyst.md
│ ├── workflow-orchestrator.md
│ ├── github-manager.md
│ └── ... (13 more agents)
├── webhooks/
│ └── latest_raw.json # Latest ElevenLabs transcript
├── projects/
│ ├── .temp/ # Ephemeral workspaces (auto-deleted)
│ │ └── {phone}/{timestamp}/ # Temporary build directory
│ ├── .project-registry.json # GitHub-centric registry
│ └── {phone}/
│ └── VOICE_CONTEXT.md # Conversational context for voice agent
├── webhook_server.py # Webhook receiver
├── requirements.txt # Python dependencies
├── .env.example # Environment template
└── CLAUDE.md # System architecture docs
All repos use anonymized user IDs for complete privacy and user isolation:
github.com/breagent/vvc-{user_id}-{project-name}
Example: github.com/breagent/vvc-a7x9k2-banana-delivery
Privacy Note: Phone numbers are mapped to random alphanumeric IDs (e.g., "a7x9k2") so repositories never expose personal information.
- Requirements Analysis →
requirements.json - GitHub Setup → Create phone-prefixed repo
- Workflow Planning → Determine agents needed
- Content Strategy →
content.json - UI/UX Design →
design_specs.json - Component Architecture →
components_map.json - Project Scaffolding → Next.js setup
- Component Building → React components
- Page Assembly → Routes and pages
- Styling Finisher → Final polish
- Next.js Validation → Build verification
- Browser Testing → UI/UX validation
- GitHub Finalize → Commit and push
- Content Only: content → builder → validator → commit
- Styling Only: styling → validator → commit
- New Feature: relevant agents → validator → commit
- Major Change: full pipeline → commit
# Clone specific project (use your actual user ID from .project-registry.json)
git clone https://github.com/breagent/vvc-a7x9k2-banana-delivery
# Run locally
cd vvc-a7x9k2-banana-delivery/src
npm install
npm run dev
# Open http://localhost:3000open vvc-a7x9k2-banana-delivery/src/index.html# Check .project-registry.json for your actual repository names
cat projects/.project-registry.json
# Clone all projects for your user ID
for repo in vvc-a7x9k2-banana-delivery vvc-a7x9k2-arc-phone vvc-a7x9k2-garden-glory; do
git clone https://github.com/breagent/$repo
done-
Environment Variables - Ensure
.envfile contains:ANTHROPIC_API_KEY=xxx # Required ANTHROPIC_MODEL=opus # Recommended GITHUB_TOKEN=xxx # Required GITHUB_USERNAME=xxx # Required VERCEL_TOKEN=xxx # Required for deployment TWILIO_ACCOUNT_SID=xxx # For SMS (optional) TWILIO_AUTH_TOKEN=xxx # For SMS (optional) TWILIO_PHONE_NUMBER=xxx # For SMS (optional)
-
Dependencies Installed:
pip install -r requirements.txt
-
Playwright MCP (for browser testing):
npx -y @playwright/mcp@latest
# Run with sample transcript data
python orchestrator.py-
Start the webhook server:
python webhook_server.py
-
The server automatically:
- Receives webhooks at
http://localhost:5001/elevenlabs-webhook - Saves transcript to
webhooks/latest_raw.json - Triggers orchestrator.py automatically
- Logs output to
logs/pipeline_TIMESTAMP.log
- Receives webhooks at
-
Check status:
curl http://localhost:5001/status
The pipeline will:
- Extract requirements from voice transcript
- Create/update GitHub repository
- Execute necessary agents based on requirements
- Build and validate the application
- Commit and push to GitHub
- Deploy to Vercel (if configured)
- Send SMS notification (if configured)
Watch for:
- Temp directory created in
/projects/.temp/ - Agents executing in sequence/parallel
- GitHub repo created/updated with phone prefix
- Temp directory deleted after successful push
- Registry updated with GitHub URL
✅ Pipeline completes without errors
✅ GitHub repo created/updated with new code
✅ Vercel deployment is publicly accessible (if deployed)
✅ Application functions as described in requirements
✅ SMS received with deployment URL (if configured)
# Check GitHub for repo
open https://github.com/breagent/vvc-{user_id}-{project-name}
# Check local registry
cat projects/.project-registry.json
# Verify minimal disk usage
du -sh projects/
# Check logs for details
ls -la logs/pipeline_*.log- Missing API Key: Ensure all required environment variables are set
- GitHub Permission: Token needs
reposcope for creation/push - Agent Not Found: Agents must be in
.claude/agents/directory - Build Failures: Check Node.js/npm installation for Next.js projects
- Cleanup Failed: Manually delete
/projects/.temp/if needed
# Enable verbose logging
python orchestrator.py --verbose
# Check orchestrator log
tail -f orchestrator.log
# Check pipeline logs
ls -la logs/pipeline_*.log
tail -f logs/pipeline_latest.log
# Check agent log
tail -f .claude/subagent.log
# View pipeline status
python orchestrator.py --statusThe system uses pre-call webhooks to inject project context before the conversation even starts:
- User dials the ElevenLabs phone number
- Before answering, ElevenLabs sends a pre-call webhook to
/precallwith caller's phone number - System responds with the user's
VOICE_CONTEXT.mdcontent as{{projects_context}} - ElevenLabs injects this context into the agent's prompt
- Agent answers already knowing about the user's projects: "Hey! I see you have your banana delivery site and your arc phone landing page..."
- Natural conversation about updating existing projects or building something new
- No manual project selection - Agent automatically knows what you've built
- Conversational updates - "Make the buttons blue on my banana site" (agent knows which site)
- Context awareness - Agent remembers visual style, features, and recent changes
- Seamless UX - Feels like talking to someone who knows your work
This is what enables the multi-project magic where users can naturally say "update my hat store" without explaining which project they mean.
The browser-functionality-validator agent:
- Tests all forms and interactions
- Validates responsive design
- Automatically fixes UI issues
- Re-tests to confirm fixes
The workflow-orchestrator intelligently chooses agents:
- Analyzes requirements complexity
- Skips unnecessary agents
- Optimizes for speed
- Documents decisions in execution_plan.json
Each build maintains state in ephemeral workspace:
{
"project_id": "vvc-a7x9k2-banana-delivery",
"current_phase": "building",
"completed_agents": ["requirements", "github-setup"],
"pending_agents": ["content", "design"],
"errors": [],
"start_time": "2025-01-12T10:00:00Z"
}{
"projects": {
"1555555xxxx": [
{
"name": "Banana Delivery",
"repo": "vvc-a7x9k2-banana-delivery",
"github_url": "https://github.com/breagent/vvc-a7x9k2-banana-delivery",
"created": "2025-01-11",
"last_updated": "2025-01-12T10:00:00",
"local_cache": null
}
]
}
}Note: Phone number "1555555xxxx" is mapped internally to anonymized ID "a7x9k2".
Voice Vibe Coding implements zero-PII exposure through phone number anonymization:
-
Phone Number Reception: ElevenLabs sends caller's phone number (e.g., "+1555555xxxx")
-
Anonymous ID Mapping:
- First-time callers get a random 6-character alphanumeric ID (e.g., "a7x9k2")
- Mapping stored locally in
.phone-id-mapping.json(never committed to git) - Same phone always maps to same ID for consistency
-
Repository Naming:
- Format:
vvc-{user_id}-{project-name} - Example:
vvc-a7x9k2-banana-delivery - Phone number never appears in GitHub URLs, repo names, or public artifacts
- Format:
-
Complete Isolation:
- Each user ID has separate repositories
- No way to link user ID back to phone number without the mapping file
- Mapping file excluded from version control (in
.gitignore)
- ✅ GitHub repos - No phone numbers in URLs or metadata
- ✅ Public artifacts - All examples use anonymized IDs
- ✅ Version control -
.phone-id-mapping.jsonin.gitignore - ✅ Multi-user isolation - Each ID namespace is completely separate
- ✅ Vercel deployments - Use anonymized repo names automatically
projects/.phone-id-mapping.json- Phone → ID mapping (git-ignored)projects/{phone}/VOICE_CONTEXT.md- Local context files (git-ignored)projects/.project-registry.json- Registry by phone for local lookups (git-ignored)
Critical: All projects/ directory contents are git-ignored for privacy.
- Never commit
.envfile - Use environment variables for all credentials
- GitHub repos are public by default (configure for private if needed)
- Implement rate limiting for webhook endpoints in production
- Rotate API tokens periodically
- Create agent in
.claude/agents/{agent-name}.md - Follow the template structure
- Update orchestrator pipeline if needed
- Test with sample transcript
# {Agent Name} Agent
You are a {role} agent in the Voice Vibe Coding system.
## Context
You are part of a pipeline that transforms voice conversations into deployed web applications.
## Your Specific Task
[Clear description]
## Inputs
- [List of files/artifacts]
## Expected Outputs
- [List of outputs]
[Instructions...]- CLAUDE.md - Detailed system architecture and agent specifications
Built with Claude Agent SDK - Transforming voice into code, one conversation at a time.
