◆  A. Lech Schiedam  51.92°N 4.39°E

Coldstart

Finds B2B leads overnight and drafts the first email, so the morning starts with a queue to review instead of a blank page.

The blank page is the expensive part

Cold outreach is grim work, and the grimmest part isn’t sending — it’s the blank page. Finding a company worth writing to, working out why they’d care this week rather than any other week, and then writing the first sentence. Do that thirty times and the day is gone.

Coldstart does the overnight half. It hunts while nobody is working, scores what it finds, and leaves a stack of drafted first emails waiting in the morning. Nothing sends by itself. Every draft waits for a person to approve it, rewrite it, or throw it away, and sending is handed off to the customer’s own inbox rather than blasted from a shared one.

Where the model isn’t

The decision I’d defend is about the parts that don’t use a language model. Harvesting, signal scoring and deduplication are all deterministic: signals are scored by rules I can read, and every lead carries a fingerprint so the same company can’t arrive twice wearing a different name.

Only once a lead survives that does the model get involved, and only for the two jobs it’s genuinely good at — judging whether the lead is a fit, and writing readable prose. It never chooses what to harvest and it never chooses what to send. So when it’s wrong, it’s wrong about a draft someone is about to read, not about a database nobody will ever audit.

The rest is unglamorous on purpose: hexagonal architecture so the domain doesn’t know what a database is, a signature-verified Stripe webhook rather than trusting a redirect, and a single-host Docker deployment I can reason about at midnight.

.NET 10 Razor Pages EF Core PostgreSQL 17 ASP.NET Identity Stripe Docker + Caddy

←  All work