Tanmay Kaper — Autonomous Cold Outreach Engine
Perpetual, self-sufficient cold email system. Sources elite leads globally, drafts deeply personalised emails via Gemini, dispatches automatically via Gmail. Runs entirely on GitHub Actions — zero always-on infrastructure, zero paid APIs beyond pennies/month.
Every week, automatically:
- Sources 20–25 qualified leads (managers → C-suite) across India-first, then UK/US/SG/UAE/EU/AU/Remote
- Drafts a unique, personalised email for each lead using one of 7 proven cold-email frameworks (Gemini Pro)
- Dispatches up to 20 emails/week during optimal local timezone windows — no approval needed
- Logs every send to
state/dispatch_log.jsonl; updatesstate/pipeline.xlsxfor your review
| Component | Tool | Cost |
|---|---|---|
| Lead search | Serper.dev | Free (2,500 searches/month) |
| Profile enrichment | linkedin-api (unofficial) | Free |
| Email inference | Pattern logic + DNS check | Free |
| Email drafting | Gemini 2.0 Flash | Free (1,500 req/day) |
| Email dispatch | Gmail SMTP + App Password | Free |
| Scheduling | GitHub Actions | Free (public repos) |
| State / database | Git-committed CSV | Free |
| Total | 0ドル.00/month |
Every Monday
04:30 UTC → [SOURCE] Serper search ×ばつ 4 geo/vertical combos
LinkedIn profile enrichment
Email pattern inference + DNS verify
Score leads (0-100), keep ≥55
Append new leads to state/pipeline.csv
Export state/pipeline.xlsx
05:00 UTC → [DRAFT] Read all Pending rows without a draft
(independent — no dependency on source job)
Choose framework (PAS/BAB/AIDA/SAS/QVC/PPPP/FFF)
Build personalised prompt → Gemini 2.0 Flash
Write subject + body back to pipeline.csv
Export updated pipeline.xlsx
Mon/Tue/Wed/Thu
06:30 UTC → [DISPATCH] Read Pending rows with draft
Check target's local timezone window
(Tue–Thu 9:30–11:30 AM or 2:00–4:00 PM)
Send via Gmail SMTP
Mark Status = Sent in CSV
Commit state/ back to repo
Title tiers (all included — wider net = higher reply rates):
- Tier A — Founder, CEO, Partner, Managing Director, CSO, COS, President
- Tier B — VP, Director, Head of [X], Principal, Engagement Manager
- Tier C — Manager, Senior Analyst, Team Lead, Hiring Manager, Associate, Senior Consultant
Geographic rotation (India = ~60% of weekly slots):
- India: Mumbai, Bangalore, Delhi/NCR, Hyderabad, Pune, Chennai, Ahmedabad
- International: London, US (NYC/SF/Boston), Singapore, UAE, Australia, EU, Remote/Global, Research orgs
Industry verticals (rotated weekly): Management Consulting · Tech Startups · Impact/Climate Startups · PE & VC · Corporate Strategy · Economic Research & Policy · Investment Banking · Data & Analytics
Pool exhaustion? Never. 12-week rotation ×ばつ week-number query variation ×ばつ 8 verticals ×ばつ 16 geo segments ×ばつ 3 title tiers = thousands of unique search paths. Same geo+vertical combo recurs after ~3 months with different query phrasing, surfacing new people.
Each email uses one of 7 frameworks, algorithmically chosen per lead:
| Framework | Best for | Structure |
|---|---|---|
| PAS | Startups | Problem → Agitate → Solve |
| BAB | Growth roles | Before → After → Bridge |
| AIDA | Tier-1 / consulting | Attention → Interest → Desire → Action |
| SAS | PE/VC/IB | Star → Arch → Success |
| QVC | Any senior role | Question → Value → CTA |
| PPPP | Corporate strategy | Picture → Promise → Prove → Push |
| FFF | Research / impact | Feel → Felt → Found |
Tone varies by region: India (warm-direct), UK (measured), US (punchy), AU (casual-pro), SG/ME (precise), Remote (async-clear).
Hard rules baked into every prompt:
- ≤ 120 words body
- ≤ 8 word subject (no "Quick question" or "Internship inquiry")
- No generic openers — first line must reference something SPECIFIC about the target
- One CTA only
git clone https://github.com/YOUR_USERNAME/outbound-sniper.git
cd outbound-sniperSerper — serper.dev → Sign up → Dashboard → copy API Key
Gemini — aistudio.google.com → Get API Key → copy it
Gmail App Password:
- Enable 2FA on your Google account
myaccount.google.com→ Security → App Passwords- App: Mail → Device: Other → name it
OutboundBot - Copy the 16-char password (no spaces)
LinkedIn secondary account: Create a fresh Gmail, then a new LinkedIn account. Takes 5 minutes. Use those credentials — not your main profile.
Settings → Secrets and variables → Actions → New repository secret
| Secret | Value |
|---|---|
SERPER_API_KEY |
Your Serper key |
LINKEDIN_USERNAME |
Secondary LinkedIn email |
LINKEDIN_PASSWORD |
Secondary LinkedIn password |
GEMINI_API_KEY |
Your Gemini key |
SENDER_EMAIL |
tanmay.kaper1401@gmail.com |
GMAIL_APP_PASSWORD |
16-char App Password |
OUTREACH_MODE |
internship (change to job for Phase 2) |
Repo → Actions tab → click "I understand my workflows, go ahead and enable them"
First automated run: next Monday at 04:30 UTC.
When you're ready to switch from internship to job search (Jan 2027):
- Go to
Settings → Secrets → Actions - Edit
OUTREACH_MODE→ changeinternshiptojob - That's it — all subsequent emails will be framed around full-time graduate roles
Or trigger a manual run with the override: Actions → Outbound Sniper → Run workflow → outreach_mode: job
Actions → Outbound Sniper → Run workflow
| Option | Use case |
|---|---|
action: source |
Manually kick off a sourcing run |
action: draft |
Draft emails for any un-drafted Pending rows (safe to re-run anytime) |
action: dispatch + dry_run: true |
Test dispatch without sending — logs what would go |
action: dispatch + force_window: true |
Send immediately regardless of timezone window |
After each run, GitHub automatically updates:
state/pipeline.csv— full pipeline (source of truth)state/pipeline.xlsx— formatted Excel for easy viewingstate/dispatch_log.jsonl— every send with timestamp, subject, recipientstate/weekly_count.json— weekly send counter
View the pipeline: go to your repo → state/pipeline.xlsx → click Download
outbound-sniper/
├── .github/
│ └── workflows/
│ └── outbound.yml GitHub Actions scheduler (4 dispatch runs/week)
├── modules/
│ ├── config.py Mode toggle, cadence, personas, rotation schedule
│ ├── module_a_sourcing.py Serper + LinkedIn sourcing, scoring, dedup
│ ├── module_b_spreadsheet.py Additive CSV manager + Excel export
│ ├── module_c_personalization.py Gemini Pro drafting, 7 frameworks
│ ├── module_d_dispatch.py Timezone-aware Gmail SMTP dispatch
│ └── orchestrator.py Single Actions entry point
├── state/
│ ├── pipeline.csv THE DATABASE — additive, never overwritten
│ ├── pipeline.xlsx Human-readable view, regenerated each run
│ ├── dispatch_log.jsonl Every send logged here
│ └── weekly_count.json Weekly cap tracker
├── .env.example Copy to .env for local testing
├── .gitignore
├── requirements.txt
└── README.md
pip install -r requirements.txt cp .env.example .env # Fill in your real keys cd modules # Test sourcing (writes to ../state/pipeline.csv) ACTION=source python orchestrator.py # Test drafting (fully independent — works any time) ACTION=draft python orchestrator.py # Test dispatch — dry run (logs but does NOT send) ACTION=dispatch DRY_RUN=true python orchestrator.py # Test dispatch — force window + dry run ACTION=dispatch DRY_RUN=true FORCE_WINDOW=true python orchestrator.py # Actually send ACTION=dispatch python orchestrator.py