Back to Work
Lead-Prospecting Platform2026Solo build

Pulse

A personal acquisition workspace for reviewing leads from twelve different sources in one queue. It combines source-specific collection, email verification, saved searches, and outreach sequences around a keyword library tuned to the work I actually pursue.

Pulse inbox — live leads from 4 source scrapers (HN, YC, ProductHunt, IndieHackers) with quick filters and per-source category tabs

The inbox after a fresh scan — leads from HN hiring, YC W26 companies, ProductHunt launches, and IndieHackers founders consolidated in one queue with quick filters and matched-skill highlighting.

12

live data sources

1,832

curated keywords

42

industry/role bundles

4-stage

email verifier

The Problem

Lead-gen SaaS isn't built for freelance devs

I needed one review queue for remote contracts, product roles, recently funded companies, and local businesses. The existing tools I tried were built around different acquisition workflows:

  • Apollo, Hunter, Lemlist — optimised for SDR teams working from established company lists. My search starts earlier, with roles, funding events, product launches, and founder activity.
  • LinkedIn / Wellfound — auth-walled, anti-scraping, and most listings filter out international candidates without surfacing the filter upfront.
  • HN "Who is hiring?" threads — gold-standard signal but lives in monthly comment threads with hundreds of posts. No filtering, no dedup, no structured data.
  • Local SMBs (cold outreach) — phone numbers and websites scattered across Google Maps, Yelp, Yellow Pages, Manta, BBB. Nothing consolidates them with verified contact emails.

So I built the tool I wished existed: a personal lead engine that pulls from twelve sources in parallel, filters by a keyword library tuned for fullstack work (including French/Tunisian variants for local job boards), verifies emails before they land in the inbox, and surfaces everything in a keyboard-first triage UI.

Lead pipeline

Signal enters messy. Opportunity leaves structured.

Pulse treats prospecting as a pipeline, not a list of scraped links. Each stage removes noise or adds context until a lead is useful enough to review, contact, and track.

01Collect

Source-aware acquisition

Twelve connectors share one lead contract while each source keeps its own fetch strategy, rate limit, retry behavior, and hydration rules.

02Verify

Contact confidence

Syntax, MX, SMTP, and catch-all checks filter weak addresses before outreach and prefer contacts that match the company domain.

03Qualify

Opportunity model

Keywords, bundles, source context, and saved-search criteria turn raw posts into comparable opportunities in one inbox.

04Act

Outreach workflow

Reviewed leads move into sequenced contact and reply tracking without losing the source evidence that made them relevant.

Saved Searches

Run scans on your schedule

Each saved search picks its sources, keywords, locations, and frequency. Hourly, daily, weekly, or on-demand. The background scheduler dispatches scans, persists results to Supabase, and updates the inbox. Saved searches auto-pause if a source rate-limits.

Pulse sources page — list of saved searches with run status, frequency, and per-search source counts
Pulse saved-search editor — Direct vs Cold mode with keyword chips and bundle picker

Editor

Direct vs Cold mode

Two distinct flows in one editor. Direct mode (jobs you apply to) takes keyword chips. Cold mode (businesses to sell to) takes location autocomplete + niche bundles. Switching modes resets sources to sensible defaults so a Cold scan never accidentally runs against LinkedIn.

Bundle Picker

42 quick-add bundles

Each chip toggles a whole bundle of keywords on or off in a single click. State is computed: a chip is "active" when every keyword from that bundle is selected, "partial" when only some are. Tap an active or partial chip to remove only that bundle's keywords; manually-added ones stay.

🚀 Founding eng🤝 Contract🤖 AI/ML/LLM💸 Fintech⚡ Modern Jamstack🇹🇳 French/Tunisian
Pulse bundle picker — 42 categorized chips for one-click multi-keyword selection
Pulse Cmd+K command palette — fuzzy search across pages and opportunities

Power UX

Cmd+K palette · J/K nav · A/R triage

Built for the kind of triage where you process 50 leads in 10 minutes. Cmd+K opens a fuzzy palette across every page and opportunity. J/K navigates the inbox, A applies/contacts, R rejects, V marks viewing, O / Enter opens the original posting in a new tab. Every action is reachable from the home row.

Engineering Challenges

The hard parts I had to solve

Scraping 12 sites with 12 different defenses

HN runs on plain HTML. YC ships everything via a public Algolia search index. Google Maps requires Playwright with stable data-item-id attribute selectors that survive UI redesigns. ProductHunt and IndieHackers are React SPAs behind Cloudflare and need a Camoufox-backed stealth fetcher with wait_selector to pause for client-side hydration. I built a singleScraperEngine that picks the right fetcher tier per source, applies per-source rate limits, retries with exponential backoff, and exposes one uniform DirectLead contract upstream.

Stopping email contamination

Naive email extraction returns garbage: Stripe checkout buttons leave @stripe.com, Sentry trackers leave 32-char-hex pixel addresses, Intercom widgets leak support emails. The verifier I built runs four stages — syntax → DNS MX → SMTP handshake → catch-all probe — and ranks results by domain match against the company's own website. A 25-suffix blocklist filters known third-party CDNs and tracking subdomains, so what reaches the inbox is the actual founder/recruiter email, not a payment-widget side-effect.

Async pipeline that doesn't feel stuck

Sequential email extraction made the dock progress bar freeze at 20% for two minutes. I rewrote the pipeline around asyncio.Semaphore-bounded concurrency: 8 parallel email-extraction workers, 4 parallel detail-page fetches, with live progress callbacks emitting after every lead. A 20-lead scan went from ~200s to ~30s and the user always sees forward motion.

Internationalised keyword matching

Tunisian job boards (Tanit) post in French. Two-letter tech stems like ai, ts, qa false-positive on words like Anglais and Carts. I built a word-boundary regex matcher that treats ., +, and # as word characters (so next.js, c++, c# match cleanly), normalises French accents (NFKD + diacritic strip), and applies negative-match guards (commercial, vendeur, femme de ménage) to keep software-only results clean.

Inbox triage UX

150 leads/scan needs a UX you can fly through. Cmd+K opens a fuzzy palette across every page and opportunity. J/K navigates, A applies/contacts, R rejects, V marks viewing, O / Enter opens the original posting in a new tab and auto-flips the stage. Quick-filter chips show live counts before you click them, so you know exactly how many leads "Has email" or "Founding eng" will surface. Matched keywords are highlighted inline in each description so the relevant signal jumps off the page.

System architecture

Interactive product above. Long-running work below.

The architecture separates the fast review experience from source-specific collection and verification jobs, while one shared record model keeps the entire prospecting workflow coherent.

Pulse saved searches and source pipeline interface
01Product

Next.js workspace

React, TypeScript, TanStack Query, and reusable interface primitives power fast triage, filters, editors, and command-driven navigation.

02Jobs

FastAPI workers

Python, asyncio, Pydantic, and source adapters handle scheduled acquisition and verification outside the interactive request path.

03Records

Supabase data layer

PostgreSQL, authentication, and row-level rules provide one durable home for saved searches, leads, contacts, and outreach state.

04Acquisition

Tiered fetch system

Direct APIs, HTTP parsing, Scrapling, and browser automation are selected per source instead of forcing every target through one brittle scraper.

Need a system like this for your team?

I build production scrapers, workflow automation, and full-stack internal tools end-to-end. Available for senior remote contracts.