Automation-First Email Outreach System
Enterprise-grade email outreach automation with intelligent campaign management
Features β’ Installation β’ Usage β’ Documentation β’ Contributing
Vello is an automation-first email outreach engine designed to handle cold email campaigns programmatically. Built with modern Python best practices, it emphasizes intelligent automation and deliverability safety.
| Feature | Description |
|---|---|
| π€ Automated Decision-Making | Classifies responses, manages inboxes, adjusts sending patterns automatically |
| π Deliverability-Safe Sending | Warmup management, inbox rotation, intelligent pacing controls |
| π Dynamic Campaign Logic | Multi-step campaigns with configurable timing and conditional flows |
| π§ Smart Response Handling | Intent analysis, automatic unsubscription, response classification |
| π§ Multi-Provider Support | SMTP, SendGrid, and more (extensible architecture) |
| π¨ Template System | Jinja2-based email templates with HTML and text support |
β Production-Ready - Modular, extensible architecture following SOLID principles β Type-Safe - Comprehensive type hints throughout the codebase β Testable - Protocol-based design enables easy mocking and testing β Scalable - Repository pattern and factory design for easy extension β Maintainable - Clear separation of concerns and consistent patterns
Vello is built around a set of configurable automation behaviors that control how the system:
- β Classifies and reacts to email responses automatically
- β Rotates between sending inboxes intelligently
- β Generates plaintext versions of email bodies
- β Adjusts sending times and pacing for optimal delivery
- β Warms up inboxes gradually to maintain deliverability
- β Cleans or maintains email lists automatically
This approach allows Vello to operate closer to a "programmatic SDR," reducing manual workload and making high-volume outreach safer and more consistent.
Campaigns consist of a sequence of steps, each with its own timing, subject, and template. Vello is designed to be extended into more advanced workflows, including:
- Conditional branching based on recipient behavior
- Nurturing paths for different lead segments
- Adaptive follow-up logic with machine learning integration
The application is source-available for review, auditing, and contribution. Self-hosting for personal or internal use is permitted, while commercial hosting or resale is restricted by the Vello Source-Available License.
This is a monorepo structure separating the Python backend and Next.js frontend:
vello/
βββ backend/ # Python backend
β βββ .env # Environment variables
β βββ requirements.txt # Python dependencies
β βββ setup.py # Package installation config
β βββ src/
β β βββ vello/ # Main package
β β βββ core/ # Database, models, config
β β βββ services/ # Business logic
β β βββ utils/ # Utility functions
β β βββ email/ # Email sending providers
β β βββ api/ # REST API endpoints
β βββ examples/ # Usage examples
β βββ templates/ # Email templates (Jinja2)
β βββ tests/ # Test suite
β
βββ frontend/ # Next.js web GUI (planned)
βββ src/
β βββ app/ # Next.js App Router
β βββ components/ # React components
β βββ lib/ # Utilities and API client
β βββ types/ # TypeScript types
βββ public/ # Static assets
- Python 3.8 or higher
- pip (Python package manager)
-
Clone the repository:
git clone <your-repo-url> cd vello
-
Navigate to backend and install dependencies:
cd backend pip install -r requirements.txt -
Install the package in development mode:
pip install -e . -
Configure environment variables:
cp .env.example .env # Edit .env with your configuration -
Initialize the database:
from vello.core.db import init_db init_db()
All configuration is managed through backend/.env.
Vello exposes both standard system settings (database, SMTP configuration, debug mode) and a set of automation flags that control intelligent behavior:
| Setting | Description |
|---|---|
AUTO_CLASSIFY_RESPONSES |
Automatically classify replies (positive, neutral, negative) |
AUTO_UNSUBSCRIBE_ON_REQUEST |
Unsubscribe leads who request removal |
AUTO_ROTATE_INBOXES |
Rotate sender inboxes automatically |
AUTO_ADJUST_SEND_TIMES |
Adjust send times to recipient local time |
AUTO_PAUSE_RISKY_CAMPAIGNS |
Protect deliverability by pausing risky campaigns |
WARMUP_ENABLED |
Enable inbox warmup with safe volume increases |
These automation controls allow Vello to function with minimal human intervention while maintaining safe sending practices.
backend/config/automation.json- Automation behavior flagsbackend/config/warmup.json- Inbox warmup settingsbackend/.env- Environment-specific settings (not committed)
From the backend directory:
# Test intent analysis
python examples/test_analysis.py
# Test template loading
python examples/example_template_usage.py
# Test email sending (requires .env configuration)
python examples/example_email_usage.py
# Test campaign usage
python examples/example_campaign_usage.pyfrom vello.core.db import init_db, get_db
from vello.core.models import Campaign, Recipient
from vello.services import analyze_intent
from vello.utils import get_template_loader
from vello.email import get_email_provider
# Initialize database
init_db()
# Analyze response intent
intent = analyze_intent("Yes, I'm interested!")
print(f"Intent: {intent}") # ResponseStatus.POSITIVE
# Load and render email templates
loader = get_template_loader()
html, text = loader.render_email(
"welcome_series/initial_outreach",
{"name": "John", "company": "Acme Corp"}
)
# Send emails
provider = get_email_provider()
result = provider.send_email(
to="user@example.com",
subject="Hello from Vello",
body_html=html,
body_text=text
)
if result.success:
print(f"Email sent! Message ID: {result.message_id}")
else:
print(f"Error: {result.error}")from vello.services.campaign.manager import CampaignManager
from vello.core.db import get_db
# Get database session
db = next(get_db())
# Create campaign manager
manager = CampaignManager(db)
# Create a new campaign
campaign = manager.create_campaign(
name="Q4 Outreach",
description="Quarterly outreach campaign"
)
# Add campaign steps
step1 = manager.add_campaign_step(
campaign_id=campaign.id,
position=1,
subject="Initial Outreach",
template_path="welcome_series/initial_outreach",
delay_days=0
)
step2 = manager.add_campaign_step(
campaign_id=campaign.id,
position=2,
subject="Follow-up",
template_path="follow_up/no_response",
delay_days=3
)For detailed documentation about the codebase architecture, design patterns, and development practices, see the WIKI.md.
- Architecture & Design Patterns
- Core Components
- Email Provider System
- Configuration System
- Database Models
- β Core email sending infrastructure
- β Campaign management system
- β Intent analysis and response classification
- β Template system with Jinja2
- β SMTP provider implementation
- β Database models and migrations
- π Next.js Web Interface - Visual campaign management for non-technical users
- π Inbox Rotation Management - UI for managing multiple sending inboxes
- π Delivery Analytics - Comprehensive reporting and analytics dashboard
- π Additional Email Providers - Full support for SES, Mailgun, SendGrid
- π Template Versioning - A/B testing and template versioning
- π Advanced Campaign Logic - Conditional branching and nurturing paths
- π Webhooks & Events - Event relay system for integrations
- π Send-Time Optimization - ML-powered optimal send time prediction
- π Smart Lead Enrichment - Automatic lead data enrichment
- π Open-Core Model - Community extensibility and plugins
We welcome contributions! Before contributing:
- Review the License - Ensure your use case aligns with permitted usage
- Check the Wiki - Familiarize yourself with the architecture and patterns
- Follow Code Style - Use type hints, follow existing patterns
- Write Tests - Add tests for new features
- Update Documentation - Keep the wiki and README up to date
- Follow existing code patterns (protocols, factories, type hints)
- Export new functionality from
__init__.pyfiles - Add examples to the
examples/directory - Update configuration files when adding new settings
- Document design choices in the wiki
Vello is released under the Vello Source-Available License, allowing:
- β Personal and internal use
- β Modification and contribution
- β Self-hosting for personal or internal use
While prohibiting:
- β Commercial resale
- β Offering Vello as a hosted service
See the LICENSE file for full details.
For issues, questions, or feature requests:
- π§ Open a GitHub Issue - Create an issue
- π Check the Wiki - WIKI.md for detailed documentation
- π‘ Review Examples - Check
backend/examples/for usage patterns
Vello was originally developed by Mirako and is currently for private use by NovaLare. It is released as a source-available project to support transparency, community feedback, and future open-core development.
