Projects

Bringforth Studio: Automating Outreach

Founder & Product Manager

2025-04-01

PythonFastAPIDockerUbuntu

Context

I founded Bringforth Studio in 2025. The problem was one I'd experienced firsthand running B2B outreach. You start with a massive list of domains, and then the grind begins. Hours of clicking through half-broken About pages, trying to figure out if a company fits your ICP or just happens to use the right keywords in their meta tags. It's boring, error-prone, and a complete waste of skilled people.

I was the founder and product manager. The job was building a system that could do the scut work while keeping the strategic decisions in human hands.


Problem / Product Goal

Manual prospecting is the bottleneck in almost every B2B sales cycle. A human can evaluate maybe 50-100 companies per day before the quality drops. After the 400th website, you start missing details. That tiny mention of a specific tech stack. A niche service line buried in a case study. The signal gets lost in the noise.

The goal was straightforward: turn a raw list of domains into high-intent leads without human judgment at every step. Not fully automated — humans still make the final call — but the heavy lifting should be done by machines.


Thought Process

I started with simple scraping. BeautifulSoup, some regex patterns, keyword matching. It worked for the easy cases — companies that said "we are a SaaS company" in bold on their homepage. But it fell apart fast.

Modern websites are a mess. JavaScript-rendered content, pop-ups, bot detection. BeautifulSoup sees an empty page with a loading spinner. And keyword matching is brittle — you miss every company that describes what they do without using your exact search terms.

I pivoted to headless browsers. Dockerized Chrome instances that render the full page, JavaScript and all. This solved the scraping problem but introduced a new one: now I had too much data. A rendered page has thousands of words. I needed a way to extract signal from that noise.

That's where LLMs came in. Instead of keyword matching, I used the LLM to read the content and make a judgment. Does this company actually have the budget and pain points for our solution? It's the difference between a bot searching for text and a junior analyst performing cause-and-effect analysis on a business model.

The architecture came together as a three-layer pipeline: scrape with headless browsers, extract with LLMs, and present the results for human review. Each stage feeds into the next.

I built the backend on Python and FastAPI. When you're orchestrating multiple headless browsers alongside parallel LLM calls, you need a framework that handles concurrency natively. FastAPI's async support made this work — we could process a list of thousands of domains in minutes instead of weeks.


Solution

The system is a three-stage pipeline.

Stage one: scraping. Dockerized headless browsers render each target website. This handles JavaScript-heavy SPAs and bypasses basic bot detection. The output is clean, rendered HTML.

Stage two: qualification. An LLM reads the rendered content and evaluates the company against configurable criteria. Not keyword matching — actual reading comprehension. Does this company fit the ICP? What's their likely budget? What pain points would they care about?

Stage three: human review. The qualified leads are presented in a dashboard. A human reviews the AI's assessment and makes the final decision. The heavy lifting is done. The human provides strategic oversight.

The impact was measurable. Tasks that took an entire 8-hour workday now take a 15-minute human review. That's a 70% reduction in manual work, with better accuracy than a tired human on their 400th website of the day.


Takeaways

Keyword matching is a dead end for B2B qualification. The nuance matters. A company might be a perfect fit without ever saying your target keywords. LLM-based reading comprehension is dramatically more accurate, but it's also slower and more expensive. The trade-off is worth it when the alternative is missing high-value leads.

Headless browsers aren't optional anymore. The web has moved past static HTML. If your scraper can't run JavaScript, you're missing most of the content on modern sites. Dockerized Chrome is the baseline, not a luxury.

The human-in-the-loop is essential. Full automation would miss context that's obvious to a human — a recent funding announcement, a sudden pivot, a personal connection. The sweet spot is automating the grunt work while keeping the human in the decision loop.

What I'd do differently: I'd prototype the LLM qualification layer earlier. I spent too long trying to make keyword matching work, when the LLM approach was clearly better from the start.