openoutreach 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openoutreach might be problematic. Click here for more details.
- openoutreach-0.1.0/.gitignore +19 -0
- openoutreach-0.1.0/LEGAL_NOTICE.md +77 -0
- openoutreach-0.1.0/LICENCE.md +596 -0
- openoutreach-0.1.0/PKG-INFO +415 -0
- openoutreach-0.1.0/README.md +368 -0
- openoutreach-0.1.0/compose/openoutreach/Dockerfile +45 -0
- openoutreach-0.1.0/compose/openoutreach/entrypoint +18 -0
- openoutreach-0.1.0/compose/openoutreach/start +14 -0
- openoutreach-0.1.0/openoutreach/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/__main__.py +106 -0
- openoutreach-0.1.0/openoutreach/contacts/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/contacts/service.py +189 -0
- openoutreach-0.1.0/openoutreach/core/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/admin.py +79 -0
- openoutreach-0.1.0/openoutreach/core/apps.py +8 -0
- openoutreach-0.1.0/openoutreach/core/business_time.py +52 -0
- openoutreach-0.1.0/openoutreach/core/conf.py +87 -0
- openoutreach-0.1.0/openoutreach/core/cycle.py +360 -0
- openoutreach-0.1.0/openoutreach/core/db/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/db/deals.py +168 -0
- openoutreach-0.1.0/openoutreach/core/db/leads.py +113 -0
- openoutreach-0.1.0/openoutreach/core/db/summaries.py +258 -0
- openoutreach-0.1.0/openoutreach/core/errors.py +69 -0
- openoutreach-0.1.0/openoutreach/core/export.py +157 -0
- openoutreach-0.1.0/openoutreach/core/geo.py +87 -0
- openoutreach-0.1.0/openoutreach/core/job.py +175 -0
- openoutreach-0.1.0/openoutreach/core/llm.py +243 -0
- openoutreach-0.1.0/openoutreach/core/logblock.py +40 -0
- openoutreach-0.1.0/openoutreach/core/logging.py +148 -0
- openoutreach-0.1.0/openoutreach/core/management/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/management/base.py +84 -0
- openoutreach-0.1.0/openoutreach/core/management/bootstrap.py +96 -0
- openoutreach-0.1.0/openoutreach/core/management/commands/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/management/commands/find.py +203 -0
- openoutreach-0.1.0/openoutreach/core/management/commands/init.py +155 -0
- openoutreach-0.1.0/openoutreach/core/management/commands/status.py +110 -0
- openoutreach-0.1.0/openoutreach/core/management/setup_crm.py +19 -0
- openoutreach-0.1.0/openoutreach/core/migrations/0001_initial.py +204 -0
- openoutreach-0.1.0/openoutreach/core/migrations/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/ml/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/ml/embeddings.py +45 -0
- openoutreach-0.1.0/openoutreach/core/ml/qualifier.py +702 -0
- openoutreach-0.1.0/openoutreach/core/models.py +257 -0
- openoutreach-0.1.0/openoutreach/core/newsletter.py +60 -0
- openoutreach-0.1.0/openoutreach/core/onboarding.py +625 -0
- openoutreach-0.1.0/openoutreach/core/onboarding_wizard.py +113 -0
- openoutreach-0.1.0/openoutreach/core/operator.py +63 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/discover.py +226 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/icp.py +290 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/qualify.py +125 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/ready_pool.py +98 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/select.py +489 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/top_up.py +106 -0
- openoutreach-0.1.0/openoutreach/core/pipeline/vocabulary.py +167 -0
- openoutreach-0.1.0/openoutreach/core/status.py +231 -0
- openoutreach-0.1.0/openoutreach/core/templates/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/templates/prompts/anchor_profiles.j2 +29 -0
- openoutreach-0.1.0/openoutreach/core/templates/prompts/icp_filters.j2 +22 -0
- openoutreach-0.1.0/openoutreach/core/templates/prompts/qualify_lead.j2 +19 -0
- openoutreach-0.1.0/openoutreach/core/vendor/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/vendor/mem0/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/vendor/mem0/configs/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/vendor/mem0/configs/prompts.py +214 -0
- openoutreach-0.1.0/openoutreach/core/vendor/mem0/memory/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/core/vendor/mem0/memory/utils.py +45 -0
- openoutreach-0.1.0/openoutreach/core/version.py +186 -0
- openoutreach-0.1.0/openoutreach/crm/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/crm/apps.py +7 -0
- openoutreach-0.1.0/openoutreach/crm/migrations/0001_initial.py +217 -0
- openoutreach-0.1.0/openoutreach/crm/migrations/__init__.py +0 -0
- openoutreach-0.1.0/openoutreach/crm/models/__init__.py +3 -0
- openoutreach-0.1.0/openoutreach/crm/models/company.py +53 -0
- openoutreach-0.1.0/openoutreach/crm/models/deal.py +147 -0
- openoutreach-0.1.0/openoutreach/crm/models/lead.py +155 -0
- openoutreach-0.1.0/openoutreach/crm/models/to_translate.txt +40 -0
- openoutreach-0.1.0/openoutreach/discovery.py +355 -0
- openoutreach-0.1.0/openoutreach/enrichment/__init__.py +17 -0
- openoutreach-0.1.0/openoutreach/enrichment/bettercontact.py +344 -0
- openoutreach-0.1.0/openoutreach/enrichment/lookup.py +237 -0
- openoutreach-0.1.0/openoutreach/settings.py +120 -0
- openoutreach-0.1.0/openoutreach/urls.py +11 -0
- openoutreach-0.1.0/pyproject.toml +87 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
.idea/
|
|
3
|
+
.venv/
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.vscode
|
|
6
|
+
.dockerignore
|
|
7
|
+
.env
|
|
8
|
+
|
|
9
|
+
/.coverage
|
|
10
|
+
/venv/
|
|
11
|
+
# Nothing here consumes a lockfile: the production image installs the built package
|
|
12
|
+
# (`uv pip install /src`), and dev is `uv pip install -e ".[dev]"`. A committed
|
|
13
|
+
# uv.lock would only be a second dependency source to keep in step with pyproject.
|
|
14
|
+
uv.lock
|
|
15
|
+
/data/*
|
|
16
|
+
!/data/.gitkeep
|
|
17
|
+
/media/
|
|
18
|
+
.cache/
|
|
19
|
+
tests/fixtures/pages/**/*.html
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# LEGAL NOTICE – OpenOutreach
|
|
2
|
+
|
|
3
|
+
**Effective upon use of this software**
|
|
4
|
+
|
|
5
|
+
OpenOutreach is a self-hosted, open-source **lead finder**. It discovers B2B leads from a **licensed third-party data provider**, qualifies them against your described ICP on your own machine, optionally resolves a work email for the best-fit leads through a **paid third-party email-finder**, and hands the result to you as a file. It is **browserless: it does not use, log into, scrape, or automate any social network or professional-network account, and it stores no such credentials.** By running this software, you acknowledge and accept the following facts, risks, and terms.
|
|
6
|
+
|
|
7
|
+
> **It no longer sends email.** Earlier versions ran cold outreach from mailboxes you owned, with an unsubscribe mechanism, a promotional campaign of the maintainer's own, and an attribution line on every message. All of it has been removed, and the obligations that came with it now sit with whatever tool you send with — see Sections 4 and 5.
|
|
8
|
+
|
|
9
|
+
> This notice describes how the software behaves and is **not legal advice**. You are responsible for your own compliance; where the stakes warrant it, consult a lawyer. Material aspects of the data model below are still pending a formal legal review.
|
|
10
|
+
|
|
11
|
+
### 1. No Platform Scraping or Automation
|
|
12
|
+
OpenOutreach performs **no** automated access to any social or professional network — no login, no browser session, no bot, no scraping, no messaging on such a platform. Lead **discovery** comes from a licensed data provider (currently BetterContact **Lead Finder**), and **enrichment** (resolving a work email) comes from a paid email-finder — both third-party services **you** sign up for and configure with **your own** API key, used under **that provider's** terms.
|
|
13
|
+
|
|
14
|
+
- **Profile URLs are identifiers, not fetch targets.** A discovered lead may carry a professional-network profile URL as an opaque identifier. OpenOutreach **stores it and never visits it** — it is a lookup/dedup key, nothing more.
|
|
15
|
+
- **You accept the third-party terms.** You are responsible for using the data provider and email-finder in line with each provider's terms of service and acceptable-use policy.
|
|
16
|
+
|
|
17
|
+
### 2. Newsletter Subscription (Asked at Onboarding, Default Set by Jurisdiction)
|
|
18
|
+
During onboarding you enter the **country** your operation is based in, and you are then **asked** whether to subscribe the email address you provided to the OpenOutreach newsletter. The question is always asked; only its **default answer** depends on your jurisdiction.
|
|
19
|
+
|
|
20
|
+
- **Protected jurisdictions**: for operators based in the EU/EEA, UK, Switzerland, Canada, Brazil, Australia, Japan, South Korea, or New Zealand, the default is **no**. An explicit yes is lawful consent anywhere.
|
|
21
|
+
- **Elsewhere**: the default is **yes** — so accepting the prompt without changing it subscribes you.
|
|
22
|
+
- **Unknown location**: if the country cannot be read, the software treats you as protected (default no).
|
|
23
|
+
- **Opting out later**: the choice is made once, at onboarding, and is acted on immediately (a single subscription request); **there is no stored setting to change afterwards**. To leave the list later, use the unsubscribe link in any newsletter email.
|
|
24
|
+
|
|
25
|
+
### 3. No Warranty – Use at Your Own Risk
|
|
26
|
+
OpenOutreach is provided **AS IS**, without warranties of any kind (express or implied), including fitness for a particular purpose, non-infringement, or that it will not cause harm to your accounts, mailboxes, domains, or data.
|
|
27
|
+
|
|
28
|
+
The developer(s):
|
|
29
|
+
- Do not guarantee any results from using the tool
|
|
30
|
+
- Are not responsible for account/domain/mailbox suspensions, deliverability harm, lost business, legal consequences, or other damages
|
|
31
|
+
- Recommend you review the terms of every third-party service you connect (data provider, email-finder) before use
|
|
32
|
+
|
|
33
|
+
### 4. How the Project Is Funded (Affiliate Links)
|
|
34
|
+
OpenOutreach is free and open-source. It sustains itself through **affiliate links**: the unavoidably-paid third-party service the tool relies on — the email-finder, which powers both lead discovery and address resolution — is surfaced during onboarding through an affiliate link. If you sign up through one, the project may earn a commission **at no markup to you**. You are free to sign up any other way.
|
|
35
|
+
|
|
36
|
+
**Two funding mechanisms have been removed, and it matters that you know they are gone**, because earlier versions of this notice disclosed them and earlier installs still run them:
|
|
37
|
+
|
|
38
|
+
- **The freemium promotional campaign.** The tool used to ship with a promotional campaign of its own, imported when the daemon started, which took its turn in the sending rotation alongside your own campaigns — so a share of the tool's sending advertised **OpenOutreach**, from **your own mailbox**, to recipients unrelated to your targets. It is deleted.
|
|
39
|
+
- **The attribution line.** Every message the tool sent ended with the fixed line "Sent with OpenOutreach". It is deleted with the code that appended it.
|
|
40
|
+
|
|
41
|
+
Both went because OpenOutreach **no longer sends email at all** (Section 5). Any hosted service operated by the maintainer is **not** covered by this notice and states its own terms at sign-up.
|
|
42
|
+
|
|
43
|
+
### 5. Lead Discovery and Email Enrichment
|
|
44
|
+
**OpenOutreach does not send email.** It discovers leads, judges them against your described ICP, and writes the result to a file you export. Sending was removed from the project; whatever you use to contact the people it finds is a separate tool you choose, configure and are responsible for.
|
|
45
|
+
|
|
46
|
+
Address resolution runs through a **third-party email-finder** (e.g. BetterContact) — a paid service you sign up for and configure yourself. It is optional: leads export with their qualification reason whether or not an address was resolved.
|
|
47
|
+
|
|
48
|
+
- **Data protection**: resolving and storing a person's work email is processing of personal data. Where data-protection law applies (GDPR, UK GDPR, LGPD, etc.) **you are the data controller** and are responsible for a lawful basis, honouring access/erasure/objection requests, and any required disclosures. OpenOutreach provides the mechanism, not legal cover.
|
|
49
|
+
- **Anti-spam law is now entirely on the tool you send with.** Unsolicited commercial email is regulated — CAN-SPAM (US), GDPR/ePrivacy (EU/EEA), CASL (Canada), the Spam Act (Australia), and others. Requirements commonly include truthful sender and subject lines, a valid physical postal address, and a working, honoured opt-out. **None of these are provided by this software any more**, because it emits no message in which to provide them.
|
|
50
|
+
- **The opt-out mechanisms are gone from this project.** Earlier versions added a `List-Unsubscribe` header pointing at a `+unsub` alias of your sending address, a visible plain-text opt-out line in every body, a mailbox scan that detected client-generated unsubscribes, and an agent that recognised worded requests in replies — all enforced permanently across campaigns. **All of it moved out with the sending code.** Your sequencer is now the only thing that can honour an opt-out, because it is the only thing that makes contact. Instantly and Smartlead both block a suppressed address at import; confirm your own tool does the same before your first send.
|
|
51
|
+
- **Turn on your sequencer's import deduplication.** Exporting the same lead twice can otherwise contact the same person twice. It is opt-in on Smartlead and undocumented on Instantly. This is the one duty the split hands to you that the software cannot do for you.
|
|
52
|
+
- **Accuracy**: finder results may be wrong, stale, or belong to a different person. You are responsible for whom you contact and what you send.
|
|
53
|
+
|
|
54
|
+
### 6. Central Contacts Store (Contribution and Resolution)
|
|
55
|
+
OpenOutreach connects to an optional **central contacts store operated by the project maintainer** (`hub.openoutreach.app`). It pools work email addresses across the OpenOutreach network so a contact one operator has already paid to resolve can be served — for free — to another, lowering everyone's email-finder spend as coverage grows. By running the software with contribution enabled you participate as described here.
|
|
56
|
+
|
|
57
|
+
- **What is contributed, and when**: at the **one** moment a real contact comes into existence — **after a paid email-finder returns a verified work email** — OpenOutreach sends a minimal record: the person's **profile identifier** (the stored, never-fetched profile URL), their **country code**, and the **work email address(es)** resolved. No name, headline, company, title, phone, or profile text is sent. *(The store is now sourced only from paid finder results; the earlier contribution path that captured a 1st-degree connection's contact info has been removed with the browser channel.)* Where a vector for that person is already cached on your machine, the record also carries a **384-dimension numeric profile vector** computed locally — the raw profile text never leaves your machine. (There is no separate switch for the vector: it is included whenever it is already in hand.)
|
|
58
|
+
- **Whether you contribute is derived from your country — it is not a setting.** If your operation is **not** based in the EU/EEA, UK, or Switzerland, contribution is **on**, and **there is no toggle to turn it off**: it can be disabled only by modifying the source, which the licence permits. If your operation **is** based there, the software contributes nothing at all (an unreadable country is treated as protected).
|
|
59
|
+
- **The consequence for protected operators.** The store works give-to-get: an operator's access token is minted by their **first contribution**. An EEA/UK/CH-based operator therefore never contributes, never earns a token, and so **never resolves from the store** — every lookup falls through to the paid finder. This is a structural consequence of the jurisdiction rule, not a penalty, and it means the store cannot lower your costs if you are based there.
|
|
60
|
+
- **Geo-gate on the people in the store**: independently of where *you* are, a contact located in the **EU/EEA, UK, or Switzerland — or whose location cannot be determined — is never written to the store.** This gate runs authoritatively **server-side**; the client's pre-filter is only a bandwidth optimisation.
|
|
61
|
+
- **Resolution is a disclosure to third parties.** OpenOutreach reads the store *first*, before spending a paid finder credit. A hit is served free. So an email you contribute **may be disclosed to other operators** to contact that person, and emails others contributed may be disclosed to you. This is a disclosure of personal data to a third party — in substance the commercial-contact-data model (Apollo, Cognism, Dropcontact). It is **not** a sale of data, but it **is** a separate processing purpose from your own outreach.
|
|
62
|
+
- **Similarity search (profile vector).** Contributed vectors additionally power a **similarity-search service**: an operator can ask the store for the stored contacts most similar to a given profile. This is a further **disclosure** purpose — it returns *which existing contacts resemble a query*, not a score or prediction about a person — over the store's non-EU/EEA/UK/CH contacts only. The maintainer relies on **legitimate interest**, honours the **objection right** and store-wide suppression, and **never sends on your behalf**.
|
|
63
|
+
- **Your role and responsibilities.** Where data-protection law applies, contributing and resolving personal data is processing for which you may be a controller or joint controller alongside the maintainer. **You remain responsible** for a lawful basis (the project relies on legitimate interest for B2B professional contact data only), for honouring access/erasure/objection requests, and for any required notices.
|
|
64
|
+
- **Suppression / opt-out.** Any person whose email is in the store can be removed and blocked from re-entry via the store's suppression mechanism (`POST /api/v2/suppress/`), honoured across the whole store. The store publishes a separate **Privacy Notice** for those people at <https://hub.openoutreach.app/privacy/>.
|
|
65
|
+
|
|
66
|
+
### 7. Your Responsibility
|
|
67
|
+
By downloading, installing, configuring, or running OpenOutreach, you:
|
|
68
|
+
- Confirm you are of legal age and have authority to accept these terms
|
|
69
|
+
- Agree to use the tool only in compliance with all applicable laws (data-protection/privacy law such as GDPR, anti-spam law such as CAN-SPAM/CASL) and with the terms of every third-party service you connect
|
|
70
|
+
- Accept full responsibility for the contacts you process, and for any email you go on to send to them with another tool
|
|
71
|
+
- Understand that modifying the code to disable the hub contribution is permitted under the licence, but remains your responsibility
|
|
72
|
+
|
|
73
|
+
If you do **not** agree with any part of this notice — especially the central contacts store — **do not use this software**. Delete it immediately.
|
|
74
|
+
|
|
75
|
+
Questions or concerns? Open an issue on the repository or contact the maintainer(s).
|
|
76
|
+
|
|
77
|
+
**Continued use constitutes acceptance of this Legal Notice.**
|