Skip to content

RRYanng/makerlens

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MakerLens

An AI-powered cold outreach system that finds indie SaaS founders, analyzes their landing pages, and generates personalized emails that feel like a peer actually looked at their product — not a sales pitch.

Status Last Update Claude API Python

Part of a series exploring where AI augments human judgment (and where it shouldn't replace it). See also: Contract Analyser · Everyone 72


Table of Contents


📈 Live Metrics

This project is actively running. I'm updating these numbers ~weekly as the pipeline sends more emails.

Last updated: April 17, 2026

Metric Current Target (by Oct 2026)
Emails shipped 13 200+
Delivered 11 Match ship rate
Bounced 1 Keep under 5%
Avg quality score (shipped) 84/100 Maintain ≥ 80
Reply rate TBD (too small n) Report from email #50
PH candidates processed 100+ 1,500+
ICP pass rate 71% Maintain ≥ 65%
Email-discoverable rate 11% Improve to 30%+ (see Roadmap)
Bugs documented in memory.md 37 No bug repeats after documenting
Days of active development 8 (initial launch) Ongoing

👉 See docs/OUTREACH_LOG.md for weekly batch observations. 👉 Track progress in real-time: 📌 Weekly Ship Log Issue


What is MakerLens

An AI pipeline that finds indie SaaS founders, analyzes their landing pages, and generates personalized cold emails — each one referencing specific elements of their site that only someone who actually looked would notice.

The product promise: "Being seen." Not an SEO audit. Not a sales pitch. A peer founder sharing an observation that makes the recipient think "this person actually looked at my product."

Pricing model (early stage): $49/audit, 15-page PDF, 24-hour delivery. First 10 free in exchange for case studies.


Why This Exists

I wanted to understand how much of "founder taste" — the judgment that makes one cold email feel human and another feel automated — can be compressed into a pipeline, and where human judgment remains irreplaceable.

The answer so far is architectural: AI handles ~95% of the pipeline, but the last 5% (the moment of deciding "this hook genuinely sees the founder") is what makes it work. That 45-second human click before Send Now is not a limitation — it's the product.


The Pipeline (10 Scripts, 3 Anti-Hallucination Layers)

Find Targets  →  Find Email  →  Enrich Site  →  Analyze + Hook  →  Quality Gate  →  Ship
(PH GraphQL)    (web scrape)   (BS/Playwright)  (Claude API)      (3-layer)       (Gmail API)
     ↓               ↓              ↓                ↓                ↓               ↓
  100 products    Email found?   HTML + meta     Structured      Layer 1+2+3      Human clicks
  ICP filter      high/med/low   CTA mapping     claims + hook   Score ≥ 80       Send
  Enterprise      Block low      DOM tagging     LLM-as-judge    Auto-regen       45 sec/email
  detection                      Animation det.  Peer tone       Live verify

Why 3 Layers

LLMs hallucinate. In cold outreach, one wrong quote = you look like you never visited the site. So I built 3 layers of defense:

Layer What It Catches How It Works Day Built
Structured Claims Wrong DOM position (e.g., "CTA in nav" but it's in footer) 15 claim types with required/forbidden DOM sources. Pipeline rejects invalid claims before hook generation. Day 6
LLM-as-Judge Consultant tone, weak closing, generic advice Second Claude API call scores hook on 4 dimensions (warm_tone / structure / insight / closing, 100pt scale). Below 80 → auto-regenerate. Below 60 → human review. Day 6
Live Verification Quotes not on actual rendered page, animated content Playwright visits real site, Cmd+F every quoted string. Dual-snapshot animation detection. Day 3

Combined catch rate: ~95%. The remaining 5% requires human judgment — this is a design boundary, not a bug.


Key Product Decisions

1. "Being Seen" > Automation Speed

Could have fully automated sending. Chose to keep human-in-the-loop for the final click.

The product promise is that a real person looked at your product. Auto-send breaks that contract. Even if AI does 95% of the work, the founder's experience depends on that last 5% being human.

Trade-off: 45 seconds per email instead of 0 seconds. But each email carries the implicit guarantee: "I saw your site."

2. Quality Gate at 80/100, Not 70

Higher threshold = fewer emails per day, but each one lands better. The auto-regen loop (score 60–79 triggers regeneration, max 3 attempts; below 60 stops entirely) means the system self-improves without lowering standards.

Data: After implementing this gate, average shipped hook score went from ~59 to 84. The gate didn't slow us down — it eliminated the 40% of hooks that would have damaged credibility.

3. ICP Enterprise Detection

Day 6, I shipped an email to a fintech company whose hero said "Trusted by Fortune 500 and Global Enterprises." Their CTA was "Book a Demo." They weren't my ICP.

Response: Built a zero-cost, zero-LLM-call hard-rule classifier:

  • Scans hero/nav/body for enterprise positioning phrases
  • Checks if CTA is sales-only (no self-serve signup)
  • Auto-rejects before pipeline wastes resources

Result: 5/5 correct on regression test. Zero false positives on indie targets.

4. Kill Criterion — 300 Emails, 0 Paid = Stop

Defined upfront, not when things get hard. Three checkpoints:

  • 50 emails: If reply rate < 2%, stop. Hook or ICP is fundamentally broken.
  • 150 emails: If replies > 5 but paid = 0, pivot the offer/pricing, don't kill.
  • 300 emails: If paid = 0, stop entirely. 30-day cooldown before next project.

Every day, either the data says continue or it says stop. No emotional pivoting.


The Bug That Taught Me Most

Day 6, evening. Ran 5 fresh targets through the complete pipeline. All scored 55–59/100. Every. Single. One.

The pattern was identical: tone=12/25, closing=0–8/25, but insight=18–21/25 and structure=20–22/25. Good content, terrible delivery.

Root cause: The generation prompt said "You are a senior SEO and conversion optimization consultant." The judge prompt's warm_tone dimension penalized "consultant tone" — defined as scoring 0/25.

The generator was told to be a consultant. The judge was told to reject consultants. They were fighting each other. Auto-regen couldn't fix it because every regenerated hook came from the same consultant-voiced prompt.

Fix: Changed 2 lines in the generation prompt:

  • "senior SEO consultant" → "peer indie SaaS maker who builds your own products"
  • Added explicit instructions for warm opening and confident closing

Result: The first product we re-tested went from 59 → 84 (+25 points). Validated across 6 products — a previously high-scoring hook held steady at 86 (no regression). The fix was systematic, not lucky.

Lesson: When you have a generator and an evaluator, their instructions must be aligned. Sounds obvious. Wasn't obvious when debugging why "everything scores the same."


Technical Architecture

Stack

  • Python — 10 pipeline scripts, Flask dashboard
  • Claude API — Analysis, hook generation, LLM-as-judge scoring, ICP classification
  • Playwright — JS-rendered site enrichment, live quote verification, animation detection
  • BeautifulSoup — Static HTML parsing with encoding-aware fallback
  • Gmail API — OAuth2 draft creation, Send Now flow
  • Product Hunt GraphQL API — Candidate sourcing with pagination

Compound Engineering System

Every task deposits experience into containers that become the starting point for the next task. Four containers maintained throughout the project:

  • standards.md — What counts as quality (hook rules, security protocols, automation boundaries)
  • memory.md — 37 bugs, each with root cause, fix, and lesson. No bug repeated after being documented.
  • routing.md — 10 rules for what's automated vs. what needs human judgment
  • evaluation.md — How to verify quality without relying on feelings

📝 Development Log

Weekly observations, learnings, and pivots live in docs/OUTREACH_LOG.md.

The initial 8-day build is documented there as "Week 0". Subsequent entries track ongoing runs: how many new emails, what was learned, what rules were added to routing.md, what bugs were added to memory.md.


🗺️ Roadmap

Full roadmap in docs/ROADMAP.md. High-level summary:

Immediate (next 30 days)

  • Fix the 11% email-discoverable bottleneck (top priority — see Day 8 funnel analysis)
  • Ship 50+ emails at 80+ quality
  • First reply-rate data point

Medium-term (60–90 days)

  • Second email-discovery source to diversify beyond current method
  • Reply-rate analysis by hook type
  • Test pricing (free → $49)

Kill checkpoints: Evaluated at 50 / 150 / 300 emails per the decision criteria above.


Sample Hook (Anonymized)

"Really like how you're targeting a specific team with workflow automation features — that's a pain point most generic tools completely ignore. One thing that jumped out: your meta description leads with specific feature language, but your hero H1 says something much more abstract. Someone searching Google for the specific outcome might not immediately recognize your page as the solution. Curious if you've tested leading with the more specific language in the hero — feels like there might be some easy search traffic to capture there."

Why this works: Opens with genuine acknowledgment → specific observation with evidence → connects to business impact → closes with curiosity, not a sales pitch.

Score: 84/100 (tone=21, structure=23, insight=22, closing=18). All quoted strings Cmd+F verified on live site before shipping.

Note: This sample is anonymized. The original email referenced the target product's specific industry and features. I don't publish real hook content from shipped emails — the recipients didn't consent to their product critique being public, and the same structural insight comes across without naming anyone.


About Me

Ruiyi (Alan) Yang — UC Irvine Cognitive Science, exploring the intersection of AI product design and human judgment.

I built MakerLens to answer one question: how much of "founder taste" can AI compress, and where does human judgment remain irreplaceable? The answer turned out to be architectural: AI handles 95% of the pipeline, but the last 5% — the moment you decide "this hook genuinely sees the founder" — is what makes it work.

Other projects in this series:

Seeking: Summer 2026 AI product / engineering internships.

About

AI cold outreach pipeline with 3-layer anti-hallucination architecture — actively running, public metrics & roadmap

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors