### Start the Local Daemon Source: https://github.com/eracle/openoutreach/blob/main/README.md Launches the application daemon for local execution. ```bash make run ``` -------------------------------- ### Build and run from source Source: https://github.com/eracle/openoutreach/blob/main/docs/docker.md Clones the repository and starts the application using the provided Makefile. ```bash git clone https://github.com/eracle/OpenOutreach.git cd OpenOutreach # Build and start make up ``` -------------------------------- ### Run OpenOutreach container Source: https://github.com/eracle/openoutreach/blob/main/docs/docker.md Starts the pre-built OpenOutreach container with data persistence enabled. ```bash docker run --pull always -it -v ~/.openoutreach/data:/app/data ghcr.io/eracle/openoutreach:latest ``` -------------------------------- ### Project Management Commands Source: https://github.com/eracle/openoutreach/blob/main/CLAUDE.md Use these Makefile commands to manage the Docker environment, local development setup, and test execution. ```bash # Docker make build / make up / make stop / make logs / make up-view # Local dev make setup # install deps + migrate + bootstrap CRM make run # run the daemon (== python manage.py rundaemon; bare manage.py also defaults to it) make admin # Django Admin at localhost:8000/admin/ # Testing make test / make docker-test .venv/bin/pytest tests/test_qualify.py # single file .venv/bin/pytest -k test_name # single test ``` -------------------------------- ### Run Django Admin server Source: https://github.com/eracle/openoutreach/blob/main/docs/docker.md Starts the container with the Django development server to access the admin interface on port 8000. ```bash docker run --pull always -it -p 8000:8000 -v ~/.openoutreach/data:/app/data \ ghcr.io/eracle/openoutreach:latest python manage.py runserver 0.0.0.0:8000 ``` -------------------------------- ### Clone and Bootstrap Local Environment Source: https://github.com/eracle/openoutreach/blob/main/README.md Downloads the repository and initializes the development environment including dependencies and database migrations. ```bash git clone https://github.com/eracle/OpenOutreach.git cd OpenOutreach # Install deps, run migrations, and bootstrap CRM make setup ``` -------------------------------- ### Define Onboarding Steps Source: https://github.com/eracle/openoutreach/blob/main/ARCHITECTURE.md The onboarding process is structured as a sequence of steps, each mapping a configuration requirement to a database persistence action. ```text campaign product description + target + booking link → Campaign row llm LLM creds, live-verified via verify_llm_credentials (retries in place on failure) mailbox field-by-field SMTP box → auth-check → Mailbox row; retries with values retained signature sign-off per never-asked (NULL) box; "" = declined and sticks bettercontact API key (mandatory — the SAME key powers Lead Finder discovery AND enrichment) account your email (contacts key + newsletter target, optional BCC) → country → newsletter (opt-in) → legal (required gate) → operator User + subscribe ``` -------------------------------- ### Configure and Access CRM Admin Source: https://github.com/eracle/openoutreach/blob/main/README.md Commands to create an administrative user and launch the Django-based web interface. ```bash # Create an admin account (first time only) python manage.py createsuperuser # Start the web server make admin ``` -------------------------------- ### Project Directory Structure Source: https://github.com/eracle/openoutreach/blob/main/ARCHITECTURE.md The layout of the OpenOutreach package, highlighting the Django app organization and core functional modules. ```text manage.py tests/ openoutreach/ settings.py # Django settings (SQLite at data/db.sqlite3) urls.py discovery.py # Lead Finder client (ICP search + row embedding) — the top of the funnel core/ # engine app (label: core) — daemon, task queue + scheduler, # Campaign/SiteConfig/Task models, llm.py, conf.py, onboarding, # ML (qualifier/embeddings/kit), discovery+qualify pipeline, # the two agents, db/ helpers, session, geo, management commands, # vendored mem0 emails/ # channel app (label: emails) — enrichment (BetterContact), Mailbox + # import + SMTP/IMAP, sender/inbox, the three task handlers crm/ # app (label: crm) — Lead, Deal chat/ # app (label: chat) — ChatMessage (the per-Deal conversation) legacy/ # model-less app (label: legacy) — migration-history anchor only contacts/ # central contacts-store client (service.py only — no models, not an app) ``` -------------------------------- ### Project Directory Structure Source: https://github.com/eracle/openoutreach/blob/main/README.md Visual representation of the project file hierarchy and core Django application modules. ```text ├── docs/ # architecture, configuration, docker, templating, testing ├── openoutreach/ # single source package; Django apps nested inside │ ├── settings.py # Django settings (SQLite at data/db.sqlite3) │ ├── core/ # engine app: daemon, task queue + scheduler, │ │ # Campaign/SiteConfig/Task, LLM factory, onboarding, │ │ # ML + discovery/qualify pipeline, the two agents │ ├── emails/ # discovery/enrichment client, Mailbox + SMTP/IMAP, │ │ # sender, the four task handlers │ ├── crm/ # Lead + Deal models │ ├── chat/ # ChatMessage (per-Deal conversation) │ └── legacy/ # model-less migration-history anchor (retired channel) ├── manage.py # Django management (no args defaults to rundaemon) ├── local.yml # Docker Compose └── Makefile # Shortcuts (setup, run, admin, test) ``` -------------------------------- ### Run tests via Makefile or pytest Source: https://github.com/eracle/openoutreach/blob/main/docs/testing.md Commands to execute the full test suite or specific test files and individual tests by name. ```bash make test # full suite (local) make docker-test # full suite in Docker .venv/bin/pytest tests/test_qualify.py # a single file .venv/bin/pytest -k test_name # a single test by name ``` -------------------------------- ### Project test directory layout Source: https://github.com/eracle/openoutreach/blob/main/docs/testing.md The structure of the tests/ directory, organizing tests by module and including shared fixtures and factories. ```text tests/ ├── conftest.py # shared fixtures (fake_session: Django User + SiteConfig, no browser) ├── factories.py # factory-boy factories (LeadFactory → profile_url, etc.) ├── agents/test_follow_up.py # the agentic follow-up decision loop ├── contacts/test_service.py # the hub client (resolve / contribute), best-effort degradation ├── db/ │ ├── test_deals.py # Deal state ops │ └── test_summaries.py # mem0-style profile/chat summaries ├── emails/ │ ├── test_bettercontact.py # finder submit/poll + discovery transport │ ├── test_find_email.py # the find_email → collect_email legs │ ├── test_mailbox.py # per-box daily-cap pacing │ ├── test_send.py # opener send + EMAILED transition │ └── test_smtp.py # SMTP auth-check (port-based transport) ├── ml/ │ ├── test_embeddings.py # FastEmbed embedding │ └── test_qualifier.py # GP + BALD selection, LLM qualification ├── test_discovery.py # Lead Finder search + embed_row ├── test_discovery_wiring.py # discover → qualify wiring ├── test_pools.py # composable candidate generators ├── test_ready_pool.py # GP rank gate ├── test_qualify.py # qualification flow └── test_onboarding{,_wizard}.py, test_llm.py, test_geo.py, test_tz_country.py, test_schedule.py ``` -------------------------------- ### Lead Lifecycle State Machine Source: https://github.com/eracle/openoutreach/blob/main/docs/profile_lifecycle.md Visual representation of the lead progression from discovery to completion. ```text Discover (Lead Finder) → embed → Qualify (LLM) → QUALIFIED ─(GP gate)─▶ READY_TO_FIND_EMAIL licensed firmographics (Deal) │ find_email (submit) ▼ free hub hit ─▶ READY_TO_EMAIL FINDING_EMAIL ─(collect_email poll)─▶ hit: READY_TO_EMAIL │ provider job in flight miss: FAILED (no email) ▼ email opener ─▶ EMAILED ⟲ (agentic follow-up) ─▶ COMPLETED / FAILED ``` -------------------------------- ### Stop and restart container Source: https://github.com/eracle/openoutreach/blob/main/docs/docker.md Commands to identify, stop, and restart the container while maintaining data persistence. ```bash # Find the container docker ps # Stop it docker stop # Restart (data persists in the mounted directory) docker run --pull always -it -v ~/.openoutreach/data:/app/data ghcr.io/eracle/openoutreach:latest ``` -------------------------------- ### Set host UID/GID for Docker Compose Source: https://github.com/eracle/openoutreach/blob/main/docs/docker.md Overrides default file ownership settings if the host user ID is not 1000. ```bash HOST_UID=$(id -u) HOST_GID=$(id -g) make up ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.