-
-
One night's run: 446 documents → 5 leads to call, on NVIDIA Nemotron tiers, for 26 cents
-
Deployment: Nebius Token Factory, Tavily, Render API, GitHub Pages, Neon Postgres
-
A real lead: a UK importer added a new stone line, with the official import record behind it
-
The Station: five decisions today, not a database
-
Northvaine. Know first.
-
Pipeline: sources → claims checked against the source → buyer gate → skeptic → review → brief
Inspiration
Businesses that sell physical products to other businesses win by calling the right company at the right moment: a hotel about to be fitted out, a distributor opening a showroom, an importer starting a new product line. Those moments are public, in trade records, tenders, company registers and company websites, but scattered across countries and languages. "Intent data" tools exist for software companies tracking website clicks; nothing like that exists for manufacturers, exporters and distributors.
I chose one industry to prove the idea on: natural stone, a classic export trade (India to the UK, Europe, the US and the Gulf) with real buyers in public records. The product itself is industry-neutral; stone is the first test case. One stone exporter is already using it as our first client.
What it does
Northvaine is an AI sales agent for B2B manufacturers, exporters and distributors. You give it your website and a few answers (what you sell, who buys it, your markets). Every night it:
- reads official sources across your markets: UK import records, EU and UK tenders and awards, US contracts, company registers, company websites and project news (Tavily);
- turns every fact into a claim that code checks word for word against the stored source;
- throws out competitors and resellers of your own product before anything else (the buyer gate);
- argues against every lead (the skeptic), checks fit against the company's own site, ranks by opportunity, and has the strongest model ask "would this business call them today?";
- hands you five leads a day in plain words: who did what, why it matters to you, the source chain behind it, the evidence against, and one line to open with.
Leads are labelled Connected (several signals agree), Approach now (a project that needs your product), Build a relationship (a fitting distributor that is changing), Looking for it (already buys it, plus a fresh sign) or Watch list. A map shows your territory and trade lanes. You can add your own target accounts; they are checked like any other lead, never assumed to be buyers.
It never sends anything and never quotes prices: a person decides.
Why this is not "ask ChatGPT or Claude to search"
A chat assistant searches once, answers from whatever it found, and forgets. Northvaine is a system of record that runs every night:
- It remembers, in one canonical store. Everything goes into one Postgres schema:
- every page or record it read is snapshotted (
documents); - every fact is one
claimsrow with the exact quote, checked by code to appear in that snapshot; - every change becomes an
eventsrow in a generic, learned vocabulary (new product line, new owner, contract won); - every company is one row, matched by its identifiers, so an import record, a tender and the company's own website join into one company;
linksrecord who did what in which buying process;- each opportunity is one
casesrow that later nights update and never duplicate.
- every page or record it read is snapshotted (
Countries are stored as ISO codes and products as customs (HS) codes checked against the official tariff. Because of this, it can tell what is new since last month, which is the whole point of intent.
- No source, no claim. A chat answer can cite a page that doesn't say what it claims. Here nothing is shown, scored or used in a draft unless its quote was found word for word in the stored source.
- Official records, not just the web. UK import records, company registers, EU and UK tenders and awards, and US contracts are queried directly; Tavily covers the open web and news.
- It argues with itself. Competitors and resellers are rejected first; a skeptic writes the case against every lead; the strongest model reviews the top ten.
- It comes to you. Five decisions every morning, without being asked, for about $0.26 a run.
- It learns your business, which a chat session can't do.
How it learns
Every answer you give a lead (approach, not now, not a buyer, wrong fact) is saved with the exact searches, sources and country that found that lead. From these answers:
- each search, source and country keeps a running estimate of "how often what it finds is a good lead" (a Bayesian Beta posterior, pooled towards the source's and workspace's average while data is thin);
- the next night's searches are chosen by Thompson sampling: proven searches get more effort, and an exploration floor keeps new ones alive;
- one slot in every brief goes to a lead from just below the cut, so it also learns what it throws away;
- "not now" counts as timing, not fit; "wrong fact" lowers trust in that source only;
- weak searches are suggested for pausing, never deleted;
- every change is capped per night and saved as a new strategy version, so any version can be rolled back;
- it tells you in one sentence what each answer changed, and changes nothing until enough answers are in.
Tomorrow's radar is shaped by what you told it today.
How we built it
- NVIDIA Nemotron on Nebius Token Factory for every model call, by tier:
- Nemotron 3.5 Lightning: high-volume evidence extraction and claim support;
- Nemotron 3 Super: the buyer gate, the skeptic, company role and fit, onboarding;
- Nemotron 3 Ultra: the senior review of the top ten leads. All calls go through one module with schema-constrained JSON, Pydantic validation, retries, per-call and per-run budgets, and a log row per call. A full nightly run is about 300 calls, about $0.26, in about 30 minutes. Over the last week: 3,751 Nemotron calls, over 99% succeeded first time, the rest retried automatically.
- Tavily for intent searches per market, finding company websites, and investigating top leads.
- Python 3.12, FastAPI, Pydantic v2, Postgres + pgvector (Neon); React + Vite + TypeScript.
- Hosted on GitHub Pages (the published daily edition) and Render (the live API for "Build my radar").
- Built solo with Claude Code as the engineering team: plans, reviews and merges, with sub-agents building specified pieces; every change passes one gate (invariant checks, lint, 2,011 tests, a golden set, the frontend build). 143 design decisions are recorded with their reasons.
Challenges we ran into
- Lists are not intent. Early runs returned good-fit companies with no reason to call today. We rebuilt ranking around dated changes: a new product line in the import record, a new owner, a won contract, a new showroom.
- Competitors look like buyers. A stone importer and a stone exporter use the same words. The buyer gate and a role check on the company's own site (maker, reseller or user) run before anything is shown.
- Models over-trust. A senior review with cited facts holds weak leads back, with the reason.
- Nothing hardcoded per industry. Every search phrase and rule is generated from the client's answers; a build check fails if an industry word appears in the code.
- Prompt injection from the web. Fetched pages are data, never instructions; text aimed at AI systems is removed and can never raise a rank.
- Testing it like a judge. Running "Build my radar" on businesses outside stone exposed vague product words, article pages mistaken for companies and a prompt-order quirk that left a field empty. We fixed each one; an Indian tile exporter's first radar then found real UK importers with dated reasons (new finance, a change of owner).
Accomplishments that we're proud of
- Every fact on screen links to its source, and code (not a model) checked the quote.
- Real leads on real records for a real business, not a staged demo.
- It works for any B2B business: try "Build my radar" with your own website.
What we learned
- Model tiering matters: the small fast model does the volume, the big model makes the final call.
- Structured output plus code checks is what makes LLM output trustworthy enough for sales.
- The best "why now" signals are in boring official records.
What's next for Northvaine
- Following the chain from project to contractor to supplier.
- More markets with official trade and register data.
- Learning from which leads turn into meetings.
- Many clients, each with their own nightly edition.
Feedback on Nebius and NVIDIA tools
For a business tool like this, the Nemotron models did the job and stayed inside a small budget. The tiers made sense straight away: Lightning reads hundreds of pages cheaply, Super makes the buyer-or-competitor call, Ultra does only the final review. Our call log: Lightning 932 calls (1 timeout), Super 2,738 (24 "server busy", retried), Ultra 81 (0 failures); a full run is about $0.26. Structured JSON output made it usable in a product. What would help: documenting which JSON Schema keywords structured output honours; noting that the prompt's question order should match the schema (we saw Super leave a field empty when they differed); a Nemotron embedding model on Token Factory; consistent model ids; documented reasoning control for Ultra; published rate limits and a per-key usage view.
Built With
- fastapi
- github
- nebius
- nebius-token-factory
- neon
- nvidia-nemotron
- pgvector
- postgresql
- pydantic
- python
- react
- render
- tavily
- typescript
- vite
Log in or sign up for Devpost to join the conversation.