Skip to content

eracle/OpenOutreach

Repository files navigation

OpenOutreach Logo

Describe your product. Define your target market. The AI finds the leads for you.

GitHub stars GitHub forks License: GPLv3 Open Issues


Demo:

Demo Animation

πŸš€ 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:

  1. You provide a product description and a campaign objective (e.g. "SaaS analytics platform" targeting "VP of Engineering at Series B startups")
  2. The AI generates LinkedIn search queries to discover candidate profiles
  3. 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
  4. An LLM classifies each profile selected by the model; the GP learns from every decision to select better candidates over time
  5. 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.

git clone https://github.com/eracle/OpenOutreach.git
cd OpenOutreach
docker run --pull always -it -p 5900:5900 --user "$(id -u):$(id -g)" -v ./assets:/app/assets ghcr.io/eracle/openoutreach:latest

The interactive onboarding walks you through the three inputs above on first run. Your data persists in the local assets/ directory across restarts β€” the same database used by python manage.py.

Connect a VNC client to localhost:5900 to watch the browser live.

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:


✨ 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 VNC browser view (localhost:5900).
✍️ AI-Powered Messaging Agentic multi-turn follow-up conversations β€” the AI agent reads history, sends messages, and schedules future follow-ups.

πŸ“– 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

β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ data/                        # crm.db (SQLite)
β”‚   β”œβ”€β”€ models/                      # Persisted GP models (campaign_<id>_model.joblib)
β”‚   └── templates/prompts/           # LLM prompt templates (qualify, search, follow-up agent)
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ architecture.md              # System architecture
β”‚   β”œβ”€β”€ configuration.md             # Configuration reference
β”‚   β”œβ”€β”€ docker.md                    # Docker setup guide
β”‚   β”œβ”€β”€ templating.md                # Follow-up messaging guide
β”‚   └── testing.md                   # Testing strategy
β”œβ”€β”€ linkedin/
β”‚   β”œβ”€β”€ actions/                     # Browser actions (connect, message, status, search)
β”‚   β”œβ”€β”€ agents/                      # ReAct follow-up agent (multi-turn conversations)
β”‚   β”œβ”€β”€ api/                         # Voyager API client + parser + messaging package
β”‚   β”œβ”€β”€ browser/                     # Session management, login, navigation
β”‚   β”œβ”€β”€ conf.py                      # Configuration loading (.env + defaults)
β”‚   β”œβ”€β”€ daemon.py                    # Task queue worker loop
β”‚   β”œβ”€β”€ db/                          # CRM-backed CRUD (leads, deals, enrichment, chat)
β”‚   β”œβ”€β”€ django_settings.py           # Django/CRM settings (SQLite at assets/data/crm.db)
β”‚   β”œβ”€β”€ management/setup_crm.py      # Idempotent CRM bootstrap (Dept, Stages, Closing Reasons)
β”‚   β”œβ”€β”€ ml/                          # Bayesian qualifier (GPR), embeddings, profile text
β”‚   β”œβ”€β”€ models.py                    # Django models (Campaign, LinkedInProfile, Task, etc.)
β”‚   β”œβ”€β”€ onboarding.py                # Interactive onboarding (campaign, credentials, LLM config)
β”‚   β”œβ”€β”€ pipeline/                    # Candidate sourcing, qualification, pool management
β”‚   β”œβ”€β”€ setup/                       # GDPR, self-profile, freemium campaign setup
β”‚   └── tasks/                       # Task handlers (connect, check_pending, follow_up)
β”œβ”€β”€ manage.py                         # Entry point (no args = daemon, or Django commands)
β”œβ”€β”€ local.yml                        # Docker Compose
└── Makefile                         # Shortcuts (setup, run, admin, test)

πŸ“š Documentation


πŸ’¬ 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.

Book a 15-min call


❀️ 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.

Sponsor with GitHub


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.


Made with ❀️

Releases

No releases published

Sponsor this project

 

Packages

 
 
 

Contributors

Languages