Demo:
June 10, 2026 ยท View on GitHub

Describe your product. Define your target market. The AI finds the leads for you.
๐ What is OpenOutreach?
OpenOutreach is a self-hosted, open-source LinkedIn automation tool for B2B lead generation. Unlike other tools, you don't need a list of profiles to contact โ you describe your product and your target market, and the system autonomously discovers, qualifies, and contacts the right people.
How it works:
- You provide a product description and a campaign objective (e.g. "SaaS analytics platform" targeting "VP of Engineering at Series B startups")
- The AI generates LinkedIn search queries to discover candidate profiles
- A Bayesian ML model (Gaussian Process Regressor on profile embeddings) learns which profiles match your ideal customer โ using an explore/exploit strategy to balance finding the best leads now vs. learning what makes a good lead
- An LLM classifies each profile selected by the model; the GP learns from every decision to select better candidates over time
- Qualified leads are automatically contacted, and an AI agent manages multi-turn follow-up conversations
The system gets smarter with every decision. It starts by exploring broadly, then progressively focuses on the highest-value profiles as it learns your ideal customer profile from its own classification history.
Why choose OpenOutreach?
- ๐ง Autonomous lead discovery โ No contact lists needed; AI finds your ideal customers
- ๐ก๏ธ Undetectable โ Playwright + stealth plugins mimic real user behavior
- ๐พ Self-hosted + full data ownership โ Everything runs locally, browse your CRM in a web UI
- ๐ณ One-command setup โ Dockerized deployment, interactive onboarding
- โจ AI-powered messaging โ LLM-generated personalized outreach (bring your own model)
Perfect for founders, sales teams, and agencies who want powerful automation without account bans or subscription lock-in.
๐ What You Need
| # | What | Example |
|---|---|---|
| 1 | A LinkedIn account | Your email + password |
| 2 | An LLM API key | OpenAI, Anthropic, or any OpenAI-compatible endpoint |
| 3 | A product description + target market | "We sell cloud cost optimization for DevOps teams at mid-market SaaS companies" |
That's it. No spreadsheets, no lead databases, no scraping setup.
โก Quick Start (Docker โ Recommended)
Pre-built images are published to GitHub Container Registry on every push to master.
docker run --pull always -it -p 5900:5900 -p 6080:6080 -v ~/.openoutreach/data:/app/data ghcr.io/eracle/openoutreach:latest
# Open http://localhost:6080/vnc.html in your browser to watch the automation live
The interactive onboarding walks you through the three inputs above on first run. All data persists in ~/.openoutreach/data on your host across restarts.
Once the container is running, open http://localhost:6080/vnc.html in your browser to watch the browser live (noVNC). Alternatively, connect a native VNC client to localhost:5900.
For Docker Compose, build-from-source, and more options see the Docker Guide.
โ๏ธ Local Installation (Development)
For contributors or if you prefer running directly on your machine.
Prerequisites
1. Clone & Set Up
git clone https://github.com/eracle/OpenOutreach.git
cd OpenOutreach
# Install deps, Playwright browsers, run migrations, and bootstrap CRM
make setup
2. Run the Daemon
make run
The interactive onboarding will prompt for LinkedIn credentials, LLM API key, and campaign details on first run. Fully resumable โ stop/restart anytime without losing progress.
3. View Your Data (CRM Admin)
OpenOutreach includes a full CRM web interface powered by DjangoCRM:
# Create an admin account (first time only)
python manage.py createsuperuser
# Start the web server
make admin
Then open:
- Django Admin: http://localhost:8000/admin/
โจ Features
| Feature | Description |
|---|---|
| ๐ง Autonomous Lead Discovery | No contact lists needed โ LLM generates search queries from your product description and campaign objective. |
| ๐ฏ Bayesian Active Learning | Gaussian Process model on profile embeddings learns your ideal customer via explore/exploit, selecting the most informative candidates for LLM qualification. |
| ๐ค Stealth Browser Automation | Playwright + stealth plugins mimic real user behavior for undetectable interactions. |
| ๐ก๏ธ Voyager API Scraping | Uses LinkedIn's internal API for accurate, structured profile data (no fragile HTML parsing). |
| ๐ Stateful Pipeline | Tracks profile states (QUALIFIED โ READY_TO_CONNECT โ PENDING โ CONNECTED โ COMPLETED) in a local DB โ fully resumable. |
| โฑ๏ธ Smart Rate Limiting | Configurable daily/weekly limits per action type, respects LinkedIn's own limits automatically. |
| ๐พ Built-in CRM | Full data ownership via DjangoCRM with Django Admin UI โ browse Leads, Contacts, Companies, and Deals. |
| ๐ณ One-Command Deployment | Dockerized setup with interactive onboarding and a live browser view in your browser (noVNC at http://localhost:6080/vnc.html). |
| โ๏ธ AI-Powered Messaging | Agentic multi-turn follow-up conversations โ the AI agent reads history, sends messages, and schedules future follow-ups. |
๐ค Drive LinkedIn from Your Own LLM
OpenOutreach's LinkedIn layer is also published as a standalone, Django-free package โ
linkedin-agent-cli โ so you can let your own
LLM agent drive LinkedIn directly, no OpenOutreach install required. Every verb prints a human
summary or the full result dict with --json, and errors go to stderr with stable types โ a
clean tool-use contract any agent (or any language) can call:
pip install linkedin-agent-cli
python -m playwright install chromium
linkedin-cli session open --session work # launch + bind a browser (this process owns it)
linkedin-cli login --session work # authenticate in that session
linkedin-cli search "head of growth" --network first --json # โ handles your LLM can parse
linkedin-cli profile alice-smith --json # โ full profile dict
linkedin-cli message alice-smith --session work --text "Hi Alice"
Point your agent at the --json output and the per-verb --help; see the
linkedin-cli README for the full verb surface
and output contract.
๐ How the ML Pipeline Works
The daemon runs a continuous task queue backed by a persistent Task model. Three task types self-schedule follow-on work:
| Task Type | What it does |
|---|---|
| Connect | Ranks qualified profiles by GP model probability, sends connection requests (daily + weekly limits). Triggers qualification and search via composable generators when the pool is empty. |
| Check Pending | Checks if a pending request was accepted (exponential backoff per profile) |
| Follow Up | Runs an AI agent that manages multi-turn conversations with connected profiles |
The qualification loop in detail:
Profiles discovered during navigation are automatically scraped and embedded (384-dim FastEmbed vectors). The connect task's backfill chain decides which profile to evaluate next using a balance-driven strategy:
- When negatives outnumber positives โ exploit: pick the profile with highest predicted qualification probability (seek likely positives to fill the pipeline)
- Otherwise โ explore: pick the profile with highest BALD (Bayesian Active Learning by Disagreement) score (seek the most informative label to improve the model)
All qualification decisions go through the LLM. The GP model selects which candidate to evaluate next and gates promotion from QUALIFIED to READY_TO_CONNECT (confidence threshold). Every LLM decision feeds back into the model, making candidate selection progressively smarter.
Cold start: With fewer than 2 labelled profiles, the model can't fit โ candidates are selected in order and qualified via LLM. As labels accumulate, the GP becomes better at selecting high-value candidates.
Configure rate limits and behavior via Django Admin (LinkedInProfile + Campaign models).
๐ Project Structure
โโโ docs/
โ โโโ architecture.md # System architecture
โ โโโ configuration.md # Configuration reference
โ โโโ docker.md # Docker setup guide
โ โโโ templating.md # Follow-up messaging guide
โ โโโ testing.md # Testing strategy
โโโ openoutreach/ # single source package; Django apps nested inside
โ โโโ settings.py # Django/CRM settings (SQLite at data/db.sqlite3)
โ โโโ core/ # engine app: daemon, task queue + scheduler,
โ โ # Campaign/SiteConfig/Task, LLM factory, onboarding,
โ โ # follow-up agent, db helpers, management commands
โ โโโ linkedin/ # LinkedIn channel app: browser, discovery pipeline,
โ โ # ML qualifier, task handlers, channel models
โ โโโ emails/ # email channel app (Layer 1 of the email-first pivot)
โ โโโ crm/ # Lead + Deal models
โ โโโ chat/ # ChatMessage model
โโโ manage.py # Django management (no args defaults to rundaemon)
โโโ local.yml # Docker Compose
โโโ Makefile # Shortcuts (setup, run, admin, test)
๐ Documentation
- Architecture
- Configuration
- Profile Lifecycle
- Docker Installation
- Follow-up Messaging
- Template Variables
- Testing
๐ฌ Community
Join for support and discussions: Telegram Group
๐๏ธ Book a Free 15-Minute Call
Got a specific use case, feature request, or questions about setup?
Book a free 15-minute call โ I'd love to hear your needs and improve the tool based on real feedback.
โค๏ธ Support OpenOutreach
This project is built in spare time to provide powerful, free open-source growth tools. Your sponsorship funds faster updates and keeps it free for everyone.
| Tier | Monthly | Benefits |
|---|---|---|
| โ Supporter | $5 | Huge thanks + name in README supporters list |
| ๐ Booster | $25 | All above + priority feature requests + early access to new campaigns |
| ๐ฆธ Hero | $100 | All above + personal 1-on-1 support + influence roadmap |
| ๐ Legend | $500+ | All above + custom feature development + shoutout in releases |
โ๏ธ License
GNU GPLv3 โ see LICENCE.md
๐ Legal Notice
Not affiliated with LinkedIn.
By using this software you accept the Legal Notice. It covers LinkedIn ToS risks, built-in self-promotional actions, automatic newsletter subscription for non-GDPR accounts, and liability disclaimers.
Use at your own risk โ no liability assumed.