Hi Indie Hackers,
I built LeadzTrak because I was frustrated with my own workflow.
Every day, I'd find prospects on LinkedIn, manually copy their name, title, company, and profile URL into a spreadsheet. Then I'd lose track of who I'd contacted, when to follow up, and what we discussed.
The spreadsheet always won. And I knew other salespeople and recruiters had the same problem.
So I built a Chrome extension that adds a panel inside LinkedIn. Open a profile, click Extract — it saves. Group leads, set follow-up reminders, draft messages — all without leaving the page.
What I learned:
Stack: TypeScript, Supabase, Stripe, Chrome Extensions API
Happy to answer questions about Chrome extension development, LinkedIn DOM scraping, or selling to sales teams.
I built a desktop client for Cloudflare R2 / S3. Just got $10k in Cloudflare credits. $0 marketing so far — here's where I actually am.
The LinkedIn SPA sync pain is so real. Their DOM changes like weekly and half the selectors break without warning. What did you end up using MutationObserver, or polling on URL changes?
One thing I'm curious about: beyond capture, are you doing any enrichment? The manual copy-paste problem is real but the bigger gap for most salespeople is knowing who to reach out to next and what to say. Capturing is step one: the real leverage is having the tool tell you "this person fits your ICP because X, Y, Z."
Also curious how you're handling LinkedIn's rate limiting on profile views. That's the wall most extensions hit eventually.
Great questions. A few thoughts:
On SPA sync: We use both, mutation observers for in-page changes and URL-based triggers for route transitions. The key was keeping a single source of truth for the current profile context so the panel stays in sync regardless of how LinkedIn navigates.
On enrichment: Completely agree, capture is table stakes. We do AI enrichment on extracted profiles (company info, role classification, seniority, intent signals). We surface a relevance score based on ICP fit so users know who to prioritize. The "what to say" part is handled through message templates linked to the profile context, so you're drafting based on what you just extracted, not a generic template.
On rate limits: Definitely the wall. We batch operations, throttle intelligently, and avoid patterns that trigger LinkedIn's bot detection. The extension is designed for human-speed workflows, not bulk scraping, which keeps it sustainable.
The real value isn't just capturing data, it's having a system that tells you what to do next with that data.