Cold email that finds its own leads. You hit send.
Harvey finds businesses, reads their sites and drafts a personal email for each, on the Claude or ChatGPT plan you already pay for. Nothing sends without your OK.
Setup, plus the free key it needs before anything sends
Pointing it at your customers, not its samples
The mailbox setup that keeps you out of spam
The approval queue, and two settings I leave alone
What it can't check for Australian email law
One email opens every guide in the library.
One email. No follow-up unless I ship something that fits.
WHAT YOU NEED
Python 3.11 or newer. On a Mac, bare python3 is often 3.9. Use python3.13 by name.
Claude Pro or Max with Claude Code logged in, or a ChatGPT plan with the Codex CLI. Harvey calls the CLI, so there is no model API key and no per token bill. Usage limits on your plan still apply.
A sending mailbox on a second domain. The project suggests Google Workspace at about $7 a month, plus a domain you don't mind risking. Never your main one.
One free email checker key. Reoon (600 checks a month free) or ZeroBounce (100 free). Without one, every address stays a guess and Harvey never sends to it.
Codex users: macOS or Linux only, and Codex CLI 0.159.3 exactly. Harvey refuses any other version, newer ones included.
Skip the signals step and the first search finds nothing. This is what a run looked like before it:
what I got21 Oct 2026
DISCOVER, 0 results across 2 queriesstopped early: no confirmed signals
Then teach it your business and connect the mailbox. harvey train reads your website with your Claude or ChatGPT login and writes your product, targeting and company into harvey.local.yaml.
terminalafter claude login
harvey train https://your-company.comharvey gmail authharvey discover --estimateharvey discoverharvey dashboardharvey run
Prove itOn the test install, the free map search for electricians in Melbourne returned 10 new companies and 17 observations, at an actual cost of $0.0000. Seven of the ten had no website, which is itself a signal Harvey can pitch on.
CONFIGURE
The settings that matter, and why
Defaults live in harvey.yaml. Your own values go in harvey.local.yaml, which harvey train and harvey setup write for you.
setting
default
why
require_approval
true
Every email waits in the Outbox. I leave it on.
max_daily_sends
50
The project's ceiling for Gmail. Start at 10 to 20 on a new domain while it warms up.
send_to_risky
false
Keeps it off catch all domains, where a bounce costs you reputation. I leave it off.
max_bounce_rate
0.05
Past 5% bounces, all sending stops.
quiet_hours.timezone
America/New_York
Change it to Australia/Melbourne, or it sleeps through your business day.
max_daily_claude_percent
80
Leaves 20% of your plan for your own work. Covers Codex too, despite the name.
heartbeat_interval_minutes
15
How often it wakes to prospect, write, send and read replies.
DAILY USE
Five minutes in the Outbox
MorningdashboardOpen the private link harvey dashboard prints. The Today queue shows what is waiting on you.
ReviewA, R, J, KOne email fills the screen. A approves, R rejects, J and K move. Read each one.
Repliessame queueHarvey sorts each reply by intent and drafts the answer. It waits for you too.
Cost--estimateBefore any paid search, the estimate prints the projected spend. The hard cap defaults to $1.00.
Stopkill switchharvey sending pauses or resumes all sending.
The habitharvey outbox --approve-all exists. Don't use it in the first month. The one at a time queue is the safety net.
THE TRAPS
What goes wrong, and the fix
"Ready to write for: 0"
Found companies but no emails get written. With no checker key, addresses stay guesses and are never sent to. Add a free Reoon or ZeroBounce key to .env.
It is selling SaaS to US marketers
Untrained, it uses the sample targets: SaaS and marketing agencies in the United States. Run harvey train on your own site first.
"persona: Field required"
A hand written harvey.local.yaml must hold the whole config, not only the lines you changed. Let harvey setup or train write it.
"502 Bad Gateway" from overpass
The free map search uses a shared public server that has busy moments. One of my two searches failed this way. Run it again later.
Codex refuses to run
It must be exactly 0.159.3, signed in with ChatGPT, not an API key. Windows is not supported for Codex. Use Claude there.
Australian prospects
The optional Precleared check covers UK, US, Canadian, German and French rules. Australia's Spam Act 2003 is not on that list, so keep an unsubscribe line in every email and check the Act yourself.
LinkedInIt can log into LinkedIn and prospect there. The project warns this breaks LinkedIn's terms and can get the account banned. It is off by default. Leave it off.
THE SHAPE OF IT
What's in the repo
harvey/agents/Scout, Writer, Sender and Handler, the sub agents skills/the playbooks it reads to write and reply prompts/the prompts behind each step harvey.yamlevery default, with a note on each data/harvey.dbyour prospects and mail, in one local file
Everything stays on your machine in that one database file. Back it up and you have backed up Harvey.
That is the whole thing
A plan you already pay for, a second domain, one free checker key and five minutes a day in the Outbox. Harvey does the finding and the drafting. You decide what goes out.
I'm Raj Singh. I've led ecommerce at two Fortune 100 companies, and at one of them I ran about $8M a year in ads for four years. I've worked with AI since 2019. Now my engineering team and I ship AI products, including debtops.ai. Each guide here is written from a real install, with the output dated.