Who do your best customers have in common, and who else looks like them?

ICP Lens is an open-source lead scorer for small B2B sales teams. Paste a list where your past deals are marked won or lost and your prospects are left blank. It learns what your wins share, ranks the prospects by lookalike fit with the reasons in plain words, and tells you how accurate the ranking really is before you trust it. Then it drafts a first email that you edit and send yourself.

1. Rank your prospects

No history yet? Describe your ideal customer as rules instead

2. Draft a first email (you review and send it)

Pick a prospect with its Draft button above. Without a key you get a plain template. With your own key the draft is written by the model; the key stays in this browser tab and only that prospect's name, the fit reasons and your offer line are sent to your provider.

To keep everything on your own computer, run a model locally with Ollama, LM Studio or llama.cpp and pick it below: no key, no cost per use, and the text goes only to your machine. Name a model you have downloaded (for Ollama, ollama list shows them). The local server must allow this page: start Ollama with OLLAMA_ORIGINS=https://duncan-haywood.github.io set, or switch on CORS in LM Studio's server settings. Your browser may ask whether this site may reach devices on your network.

No prospect chosen yet.

3. Use it in your own product or run your own copy

The engine is two dependency-free files that run in a browser and in Node 18+. Embed it in your own tool or put your name on a copy and sell it; it is MIT.

git clone https://github.com/Duncan-Haywood/oss-monorepo && cd oss-monorepo/ventures/icp-lens

import { analyze } from "./engine.mjs";
const r = analyze(csvText);            // r.validation.auc, r.profile, r.prospects[0].because
node cli.mjs leads.csv > ranked.json  // same thing from a terminal, CSV in, JSON out

Questions

How is this different from Apollo, ZoomInfo, Clay or Lusha?

Those sell you a database of other people's contact details and enrichment credits. ICP Lens does the step they leave to guesswork: working out what your best customers have in common, using your own won and lost list, and ranking the prospects you already have. It holds no contact database, buys nothing, scrapes nothing and never sends a message. Use it on a list you built from your own CRM, a trade-show export or a directory you are allowed to use.

How does the lookalike score work?

It is a naive Bayes model over the columns you give it. For each value (an industry, a size band, a lead source) it measures how much more common that value is among your wins than your losses, smooths it so one lucky account cannot dominate, and adds the evidence up per prospect. The result is a ranking, not a probability of closing. Each prospect shows the three facts that raised it and the two that lowered it.

How do I know the ranking is any good?

Before showing a ranking it re-scores every labelled row with that row held out (leave-one-out) and reports the AUC and how much more often the top fifth of rows were wins than average. An AUC of 0.50 means no better than a coin flip. If your columns do not separate wins from losses it says so and warns that the ranking is noise instead of presenting it.

How much data do I need?

At least 8 won and 8 lost rows to learn anything, and a few dozen of each before the profile is stable. With less, use the manual rules box: write your ideal customer as rules such as employees >= 20 and industry in saas, fintech and get a score that is the share of rules each prospect meets.

Does it send emails?

No. It writes a first draft that you read, edit and send yourself from your own mailbox. Every draft ends with your name, postal address and a plain opt-out line, and a checker flags missing identification, a missing opt-out, fake urgency, fake reply headers and absolute claims. It cannot tell whether you have a lawful basis to contact someone, so check CAN-SPAM, PECR, GDPR, CASL and TCPA for your recipients.

Where does my data go?

Nowhere. The lists are read in your browser tab and never uploaded. If you add your own API key for Anthropic, OpenAI, Gemini or any compatible endpoint and press Write with AI, the one prospect's name, the fit reasons and your offer line are sent to that provider from your browser, and the key stays in your browser. Without a key it uses a template and makes no request.