GitHub Repo Signals
gooseworks-ai/goose-skills
Extract and score leads from GitHub repositories by analyzing stars, forks, issues, PRs, comments, and contributions.
Find qualified B2B leads with OpenOutreach — run openoutreach find N [emails], read the CSV it prints on stdout, and hand the rows to whatever sends.
$ npx skills add eracle/OpenOutreach --skill find-leads -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install eracle/OpenOutreach find-leads --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/find-leads .claude/skills/find-leads && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .claude/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/eracle/OpenOutreach/tree/main/skills/find-leadsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add eracle/OpenOutreach --skill find-leads -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install eracle/OpenOutreach find-leads --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/find-leads .agents/skills/find-leads && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .agents/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add eracle/OpenOutreach --skill find-leads -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install eracle/OpenOutreach find-leads --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/find-leads .cursor/skills/find-leads && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .cursor/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/eracle/OpenOutreach.git --path skills/find-leads--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add eracle/OpenOutreach --skill find-leads -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install eracle/OpenOutreach find-leads --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/find-leads .gemini/skills/find-leads && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .gemini/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install eracle/OpenOutreach find-leadsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add eracle/OpenOutreach --skill find-leads -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/find-leads .github/skills/find-leads && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .github/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add eracle/OpenOutreach --skill find-leads -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install eracle/OpenOutreach find-leads --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eracle/OpenOutreach.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/find-leads .opencode/skills/find-leads && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "find-leads" agent skill from https://github.com/eracle/OpenOutreach/tree/main/skills/find-leads into .opencode/skills/find-leads/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "find-leads", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
find-leadsFind qualified B2B leads with OpenOutreach — run openoutreach find N [emails], read the CSV it prints on stdout, and hand the rows to whatever sends.
Find Leads is an agent skill from eracle/OpenOutreach. Find qualified B2B leads with OpenOutreach — run openoutreach find N [emails], read the CSV it prints on stdout, and hand the rows to whatever sends. Use when the user wants leads, prospects, an ICP-matched contact list, or asks what a campaign already has. Also covers first-run setup (openoutreach init), openoutreach status, when a lookup costs money, and the verbs that actually send mail (send, run) — which you never run unasked.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Marketing & SEO, covering CSV and tabular files and Lead generation. The repository describes itself as: Open-source AI agent for B2B lead generation — describe your product, it finds the people who fit, explains why each one does, and emails them from your mailbox. Self-hosted CLI… The licence is GPL-3.0.
Read from SKILL.md and the folder at commit 2d6b8a0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jquvxpippythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uvx and pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENOUTFIND_LLM_API_KEYOPENOUTFIND_BETTERCONTACT_API_KEYOUTSEND_MAILBOX_PASSWORDOUTSEND_LLM_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Find Leads loads about 4.6k tokens when it runs. Until then it costs about 114 tokens; SKILL.md has 2,514 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from eracle/OpenOutreach at commit 2d6b8a0, republished under its GPL-3.0 licence (© eracle). 2,514 words, ~4,576 tokens.
.claude/skills/find-leads/SKILL.md (or your agent's skills folder).OpenOutreach is a self-hosted CLI lead finder. You describe a product and a target market once; each run discovers candidates from a licensed data source, has an LLM judge each one against that ICP, writes down why, and prints every lead it has as CSV on stdout.
It is one bounded command: ask for an amount, get rows, exit. There is no daemon, no background job, no file the tool writes for the operator, and nothing to poll. If you find yourself wanting to tail a log or wait for something, you have the wrong model of this tool.
It can also send — send mails what is stored, and run is find-then-send in one pass. Both
put mail in strangers' inboxes under the user's own identity, so never run either one unless the
user asked for mail to go out. find is the default answer to "get me leads"; its deliverable is
a CSV for whatever they already send with.
openoutreach status # human summary
openoutreach status --json # the same document, for you to parseIf the command is missing, run it through uvx instead — uvx openoutreach ... — or install it
with pip install openoutreach. Inside a checkout of the repo, python manage.py <verb> is the
same entry point.
status never blocks and never spends. It answers onboarding (complete or which
OPENOUTFIND_* variables are missing), the counts, the credit balance, anything blocked, and a
next_action — start there whenever you are unsure what state the user is in. It reports the
finding half; the sending half reports itself when send runs.
status says onboarding is incompleteopenoutreach init # interactive wizard on a TTY; environment otherwiseinit creates the database, asks for whatever this install has not been told, and stops before
spending anything. It is one flow over both halves — the finding first, then what only the sending
needs. Every answer can come from the environment instead of a prompt, which is what makes a
headless setup possible:
| Step | Environment variables |
|---|---|
| campaign | OPENOUTFIND_PRODUCT_DOCS, OPENOUTFIND_CAMPAIGN_TARGET |
| llm | OPENOUTFIND_AI_MODEL, OPENOUTFIND_LLM_API_KEY |
| bettercontact | OPENOUTFIND_BETTERCONTACT_API_KEY |
| account | OPENOUTFIND_OPERATOR_EMAIL, OPENOUTFIND_OPERATOR_COUNTRY |
| the sender | OUTSEND_OPERATOR_NAME (who signs the mail), OUTSEND_MAILBOX_ADDRESS, OUTSEND_MAILBOX_PASSWORD (the provider's app password), optional OUTSEND_BOOKING_LINK |
A variable you export is an answer already given, and the wizard skips that question rather than
asking for it again. The fields both halves share — what you sell, who for, the model and its key —
are asked once and exported under each child's own name (OPENOUTFIND_PRODUCT_DOCS and
OUTSEND_PRODUCT_DOCS are the same answer), so there is no second copy to keep in step. On a
machine with no TTY, an incomplete install fails naming every variable that would have completed it.
The product description and target market are pages of prose, so pass them as files rather than shell-quoted strings — quoting a markdown paragraph on a command line corrupts it quietly:
openoutreach init --product-docs product.md --target target.mdNever guess the mailbox credentials — ask the user for them.
init is the only verb that asks. find creates the database if it has to, but it never
prompts: given an unconfigured install it stops with onboarding_incomplete, naming every variable
that would have satisfied it. So run init when the user has not configured anything — it fails
cheaply, before any work.
openoutreach find 10 # ten more qualified leads — free, and cannot spend
openoutreach find 10 --emails # ...and buy an address for whatever cleared the gate
openoutreach find 10 emails # ten more *carrying* a verified email (≤10 credits)
openoutreach find 0 # no work at all — just print what is already thereThree things about N that are easy to get wrong:
N is how many more, not a total. A store with 30 leads answers find 10 by working
until it has 40. Runs are fully resumable; re-running continues rather than restarting.find 0 does no work and spends nothing. It is how you re-export, or answer "what do we
have?" without running a job.N is a budget when the unit is emails. The provider bills one credit per verified hit, so
find 10 emails is capped at ten credits by construction — the number typed is in the same unit
as the invoice.Discovery and qualification are free (they cost only the user's own LLM key). The address lookup is the only paid step, and it is opt-in:
find N cannot spend a credit, however many leads are queued past the confidence gate;--emails permits buying for whatever is ready;emails unit implies --emails, because a goal counted in addresses cannot be met without
buying them.Do not add emails or --emails unless the user asked for email addresses. If they said
"find me leads", run the free form and tell them the paid form exists. A lead with no address still
exports — the row carries the person, the company and the reason with a blank email.
| Flag | What it does |
|---|---|
--new | Print only the rows this run produced, instead of every lead in the store. Use this when you are reading stdout into your own context rather than into a file. |
--json | The rows as JSON Lines on stdout (the full record, profile_text included); the run's metadata — goal, outcome, next_action — as one JSON object on stderr, and nothing else there. Prefer it when you are going to parse. |
--batch | Hold everything until the job ends, then print every lead once — the old, pre-streaming shape. Output is progressive by default now (see below); reach for --batch only if whatever you are piping into cannot handle a stream — a strict single-document JSON parser, for instance. Not something you need for reading into your own context — that is what --new is for. |
--debug | Show the discovery walk's reasoning on stderr. For diagnosing a run that finds nothing. |
--open | Opens each new lead's profile in a browser. Never pass this — it is for a human at a terminal, and it errors out headless. |
--db PATH | Work against a SQLite file other than ~/.openoutreach/data/db.sqlite3 (same as OPENOUTREACH_DB). Accepted by every verb. |
--agent-qualify | Opt out of AI_MODEL for the qualify step — see Answering qualify yourself below. |
A run can take a while: each lead is an LLM call, and paid lookups are polled. Give it a generous timeout rather than a short one plus a retry — a killed run wastes the work, though nothing already qualified is lost.
If you (the calling agent) are already reasoning about these leads in this conversation,
OPENOUTFIND_LLM_API_KEY is a second, redundant LLM bill for a verdict you can write yourself. Add
--agent-qualify and the run stops at the first candidate needing one instead of calling AI_MODEL
— and in this mode openoutreach status/find never require a model key at all:
openoutreach find 10 --agent-qualify --jsonIt runs discovery exactly as normal — free either way — and exits non-zero with qualify_pending,
which carries the candidate's own fields right on the error object under --json
({"error": {"type": "qualify_pending", "profile_text", "company", "job_title", "full_name", "profile_url", "lead_id", ...}}, or on the plain-text line without --json). Judge the fit the same
way you would judge anything else in this conversation, then re-run the same command with your
verdict attached:
openoutreach find 10 --agent-qualify --verdict fit --reason "Series B security infra buyer, matches the ICP on team size and stack."
openoutreach find 10 --agent-qualify --verdict no-fit --reason "Consumer app, not B2B — outside the target market."This resumes from exactly that candidate — no lead id to track, since at most one is ever pending —
records the verdict, and keeps going: either the goal is met, the search runs dry, or it stops again
at the next qualify_pending. Nothing already found is lost either way, same as goal_unreached.
--verdict needs both --agent-qualify and --reason — passing one without the other is
bad_config. Don't pass --agent-qualify unless you intend to answer every qualify_pending it
raises — a bare find without the flag uses AI_MODEL and never stops for a verdict, which is the
right default for a run nobody is driving turn-by-turn.
stdout is result-only; logs, counts and progress go to stderr. That is the contract that makes redirection correct:
openoutreach find 10 > leads.csvstdout carries every lead in the store, not just this run's rows. The newest file supersedes every
earlier one, and a lead whose address resolved since last time comes back with it filled in. It is
one file to overwrite, never a batch per run — so never append, and never stitch runs together.
Rows arrive progressively by default (what is already stored, immediately, then each new
lead as it resolves) rather than all at once at the end — the total is the same either way, so this
only matters if you are piping into something that cannot take a partial stream, in which case
--batch restores the old wait-for-the-end behavior.
Columns, in this order:
email, first_name, last_name, company, title, website, linkedin_url, reason, lead_id, qualified_atemail/first_name/last_name and recognise company/title/website/linkedin_url, so the
file imports without column mapping. Everything else, reason included, arrives as a custom
variable. Do not rename these columns when handing the file on.reason is the point — the LLM's written rationale for choosing this person. It is prose,
so it contains commas and quotes: parse with a real CSV reader (Python's csv, pandas), never
by splitting on ,. When summarising leads for the user, quote the reason; that is what
distinguishes these rows from a list bought anywhere else.lead_id is the stable key for dedupe across exports. qualified_at is when the verdict landed.reason is written for the operator, not the prospect. It justifies a yes/no —
third-person and evaluative. Never paste it into a message to the lead.The CSV is the integration. Instantly, Smartlead, Lemlist, HubSpot, a spreadsheet — the file imports as-is, and there is no adapter, webhook or plugin to look for. One thing to tell the operator when you hand a file on: turn on their tool's import deduplication. It is opt-in on Smartlead and undocumented on Instantly, so a re-exported lead can otherwise be contacted twice.
find 0 is the re-emit path — no work, no spend, prints what is already stored. That is
what to run for give me that file again; there is no export verb and none is coming.
For anything programmatic, prefer --json over parsing the CSV. It is JSON Lines: one record
per line on stdout, carrying every CSV column plus profile_text — the raw firmographic text the
qualifier judged on, which is what a sender writes a message from. The run's own metadata is one
JSON object on stderr:
openoutreach find 10 --json > leads.jsonl 2> run.json
openoutreach find 10 --json | jq -r '.email' # the recordsOne record, two serialisations: the JSON is the whole thing, the CSV is the importer-safe projection of it. A reader ignores keys it does not know — the finder never renames a key or repurposes one, and only ever adds.
Exit 0 means the goal was met, and nothing else. Anything short still prints its rows and exits non-zero with a single line on stderr:
error: <type>: <message>Under --json that becomes {"error": {"type": ..., "message": ...}}, still on stderr. The type
is a stable string worth branching on:
| type | What it means | What to do |
|---|---|---|
goal_unreached | Ran, produced fewer than asked. The rows are on stdout. | Read the message: a drained index is a dead end, addresses on order are a reason to run again later. |
not_initialized | No pipeline at this database yet. | openoutreach init |
onboarding_incomplete | Missing configuration and no TTY to ask. | openoutreach status names the variables. |
no_credential | No BetterContact key. | Configure one; discovery needs it too, and the free tier has 40 credits. |
provider_auth | The key was rejected. | Do not retry; the key is wrong. |
provider_out_of_credits | Credits exhausted. | Free find N still works; addresses do not. |
provider_rate_limited | 429. | Back off. Never retry at speed — the provider's docs say that can block the account. |
provider_unavailable | Provider unreachable at all. | Transient; retry later. |
bad_config | A value is set but unusable (e.g. an LLM model id no provider answers to). | Read the message; it names the field. |
qualify_pending | --agent-qualify stopped one candidate short of the AI_MODEL call it opted out of. | Judge the candidate carried on the error object, then re-run with --verdict/--reason — see Answering qualify yourself. |
Treat a non-zero exit as partial success with a stated reason, not as "nothing happened" — the rows are already on stdout. And never report a failed run to the user as "no leads matched": a throttled or unauthorised run that reads as an empty result is the worst possible answer, which is why every failure carries a type.
The export is a one-way boundary: leads leave, nothing comes back. There is no inbound endpoint and no callback. Whoever sends owns the conversation, the suppression list and the opt-out duty.
So the natural next step after a run is another tool's importer — Instantly, Smartlead, Lemlist, a CRM, a spreadsheet. Tell the user to switch on their sequencer's import deduplication: it is opt-in on Smartlead and undocumented on Instantly, so a lead exported twice can otherwise be contacted twice.
openoutreach send # one pass: open whatever the guards allow right now
openoutreach send 5 # keep going until five conversations are open
openoutreach run 5 # find five leads carrying an address, then sendThese put real mail in strangers' inboxes, signed with the user's name, from the user's mailbox. Run them only when the user has asked for mail to go out, in this session, in so many words. "Find me some leads" is not that ask, and neither is "set this up".
Three things to know if you do run one:
run spends. There is no sending without an address, so run N finds in the emails unit —
at most N credits — where a bare find N cannot spend at all.send has its own clocks. A sending window, a daily cap and pacing between messages all sit
between "queued" and "sent", so a pass can legitimately open nothing and still succeed.run is find --json piped into the sender, in one process. If the search stops short, what
it found is still sent — a partial find is not a failed run.Everything the sender knows about a lead comes from the finder's JSON record, so the outreach
agent's opener is written from profile_text, not from reason.
The sending half has the same opt-out --agent-qualify does, one step later: --agent-draft stops
send at the first deal needing an opener instead of spending OUTSEND_LLM_API_KEY, and drops that
key out of what send requires entirely:
openoutreach send --agent-draftIt exits non-zero with draft_pending, carrying the deal's profile_text/company/title (on the
error object under --json, or the plain-text line without it). Write the opener yourself, then
re-run with the answer:
openoutreach send --agent-draft --subject "Quick one" --body "Saw you're hiring for platform roles..."This resumes the same deal and sends it once a mailbox is free — an answer given while every box is
busy is kept, not thrown away, so a later bare openoutreach send --agent-draft picks it back up
without repeating the text. No count yet: it is one pass at a time. Still never run this unasked
— it is send, and everything in The verbs that send mail above about consent applies unchanged.
find is the answer to "get me leads"; send and run
are answers only to "email them".© eracle, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/find-leads of eracle/OpenOutreach.
Open the folder on GitHubat commit 2d6b8a0
Find Leads next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Find Leads this skilleracle/OpenOutreach | 3.2k | — | ~4.6k | Automated safety check: Pass | GPL-3.0 | |
| GitHub Repo Signalsgooseworks-ai/goose-skills | 1.2k | 1 repos | ~2.6k | Automated safety check: Notes | MIT | |
| Email Generationextruct-ai/gtm-skills | 109 | — | ~1.7k | Automated safety check: Pass | None | |
| Lead Importindranilbanerjee/digital-marketing-pro | 859 | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Business Contact and Social Links Finderbrowser-act/skills | 6.1k | 1 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Apify Buying Signal Detectionapify/awesome-skills | 265 | — | ~5.1k | Automated safety check: Notes | Apache-2.0 |
gooseworks-ai/goose-skills
Extract and score leads from GitHub repositories by analyzing stars, forks, issues, PRs, comments, and contributions.
extruct-ai/gtm-skills
Render a cold-outreach email sequence from a fixed template set and a contact CSV whose input fields are already filled.
indranilbanerjee/digital-marketing-pro
Import leads into Salesforce, HubSpot, Zoho, or Pipedrive with validation, deduplication against existing CRM records, lead scoring, consent and compliance checks, and source attribution — then push…
browser-act/skills
Finds a company's official website and social profiles from its name, or collects social links from a website URL, using BrowserAct templates run by a Python script.
apify/awesome-skills
Set up a recurring buying-signal detection pipeline that finds companies showing buying intent across three signal types — job postings (hiring for the persona), fundraising events (recent raises)…
apify/awesome-skills
Score and enrich a CSV of B2B leads using Apify Actors. An agent skill from apify/awesome-skills.
Find qualified B2B leads with OpenOutreach — run openoutreach find N [emails], read the CSV it prints on stdout, and hand the rows to whatever sends. Find Leads is an agent skill from eracle/OpenOutreach. Find qualified B2B leads with OpenOutreach — run openoutreach find N [emails], read the CSV it prints on stdout, and hand the rows to whatever sends.
Find Leads fits situations like: the user wants leads; an ICP-matched contact list; asks what a campaign already has.
Run `npx skills add eracle/OpenOutreach --skill find-leads -a claude-code`. Or copy the skill folder (skills/find-leads in eracle/OpenOutreach) into .claude/skills/find-leads in your project. Claude Code loads it when a task matches its description.
Run `npx skills add eracle/OpenOutreach --skill find-leads -a codex`. Or copy the skill folder (skills/find-leads in eracle/OpenOutreach) into .agents/skills/find-leads in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add eracle/OpenOutreach --skill find-leads -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/find-leads, .gemini/skills/find-leads, .github/skills/find-leads and .opencode/skills/find-leads in your project.
Going by SKILL.md and its folder, Find Leads needs the command-line tools its instructions call (jq, uvx, pip and python) and credentials named OPENOUTFIND_LLM_API_KEY, OPENOUTFIND_BETTERCONTACT_API_KEY, OUTSEND_MAILBOX_PASSWORD and OUTSEND_LLM_API_KEY. Our summary lists: Python 3; A credential in OPENOUTFIND_LLM_API_KEY; A credential in OPENOUTFIND_BETTERCONTACT_API_KEY.
SKILL.md contains no URLs. Its commands use uvx and pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Find Leads is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Find Leads: GitHub Repo Signals (gooseworks-ai/goose-skills, 1.2k stars), Email Generation (extruct-ai/gtm-skills, 109 stars), Lead Import (indranilbanerjee/digital-marketing-pro, 859 stars) and Business Contact and Social Links Finder (browser-act/skills, 6.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
eracle (a GitHub user) maintains it in eracle/OpenOutreach, which has 3,207 GitHub stars. The repository was last updated on September 29, 2026.
Source: eracle/OpenOutreach on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.