Inspiration

A solo founder can ship a product in a weekend, then spend the next month trying to find ten people who actually need it.

The process is painfully fragmented: search LinkedIn, read through comments, jump to GitHub, compare profiles, hunt for an email, write a message, and hope you found the right person.

But the right users are often already talking about the problem.

They complain in a LinkedIn comment. They describe a workaround in a post. They open a GitHub issue because something keeps breaking. The signal is public, but scattered across platforms.

That became the idea behind TRACTION:

If the same person appears through multiple independent signals, they are probably worth talking to.

Under the hood, that is a graph query. To a founder, it simply means fewer guesses and better conversations.

What We Built

You give TRACTION a GitHub repo, a short description of your product, and optionally one warm lead.

PlanCampaign uses by llm() to turn that into a searchable hypothesis: the likely ICP, keywords, pain phrases, synonyms, and negative signals.

Then five research lanes run in parallel using Jac’s flow and wait.

Three lanes search LinkedIn through real Chrome sessions. One mines comments from mid-sized practitioners, where people tend to speak more honestly. One looks for first-person posts. One searches different ways people might describe the same pain.

A fourth lane searches GitHub programmatically. The fifth deep-researches the warm lead.

The lanes then try to connect identities across platforms. LinkedIn-to-GitHub matching uses contact details, About sections, post history, and organization membership. GitHub-to-LinkedIn matching uses lighter signals such as company, headline, and bio.

We also built a strict email waterfall. TRACTION checks profile fields, global commits, repository commits, .patch headers, and personal websites. If someone cannot be reached, they are removed with a clear explanation.

The strongest prospects are the ones surfaced by more than one lane:

[p <-:Surfaced:<- [?:Lane]]

That single traversal lets the graph reward convergence.

ComposeOutreach then writes a personalized email using the prospect’s own words. Every quote must trace back to stored evidence before the message can be sent.

When someone replies, the agent can call them, answer questions using the graph during the conversation, and book a Google Meet on both calendars.

Challenges and What We Learned

The hardest part was identity resolution. Two profiles can look similar while belonging to completely different people, so we had to combine several weak signals instead of trusting one obvious match.

We also had to coordinate browser agents with programmatic agents, make every decision explainable, and keep generated outreach grounded in real evidence.

The biggest lesson: early distribution gets better when you stop searching for more people and start looking for stronger signals.

One clue is interesting. Several independent clues are traction.

Built With

  • agentmail
  • anthropic-claude
  • browserbase
  • byllm
  • chrome-devtools-protocol
  • cloudflare-tunnel
  • github-api
  • google-calendar-api
  • jac
  • jaseci
  • linkedin
  • object-spatial-programming
  • sqlite
  • twilio
  • vapi
  • websockets
Share this project:

Updates

Submission history