Inspiration
Most jobs come through people you know. One study found that 4 in 5 first generation students did not network. For first-generation students, networking is a hidden curriculum: nobody tells you who to ask, what to say, or how to keep a relationship going after the first coffee chat.
When I downloaded my own LinkedIn data, I noticed something surprising. Even with over 1,500 connections, I knew nobody at 14 of the 16 companies where I had saved jobs. If networking feels that hard with a big network, it's much harder for a first-gen student starting with 50 connections and no family contacts in their field. I wanted to build the tool I wish every first-gen student had.
What it does
CoffeeChatBot turns your LinkedIn connections into a plan for real career conversations.
- Upload your LinkedIn export. It's read in the browser, and the app auto-fills your goal, background, and target companies from your profile and saved jobs.
- See your network as a map. Claude ranks your connections against the job you want. The 60 most helpful people appear around you: closer means more relevant, colors show sectors, and solid lines mark people you've already talked to.
- Ask a question, find the right person. Type what you're wondering about ("How did you break into health data science?") and Claude highlights the 2 to 3 people best placed to answer.
- Prep every coffee chat. For any person, get what you have in common, tailored questions, what you can offer them, and a drafted LinkedIn note or email.
- Where I want to work. For each target company, see who you know there. If you know nobody, see who can still help.
- Track and keep in touch. Log outreach status and notes, see your reach-out and reply rates, draft thank-you notes, and get reminders to send a life update to anyone you haven't talked to in two months.
How I built it
- Frontend: Next.js and TypeScript, with an interactive network map built on
react-force-graph-2d. I used a fixed radial layout so the map reads like a radar instead of a jittery physics simulation. - Data: The LinkedIn export is parsed in the browser with JSZip and PapaParse. The app opens only the files it needs, and reads message metadata (who and when) to measure warmth, never message content.
- Two-stage ranking: A network of 1,500+ people is too big for one model call, so:
- Claude turns your goal into a target profile (titles, companies, field keywords).
- Code scores every connection locally, roughly $$s_i = \min\Big(100,\; T_i + F_i + 30\,\mathbb{1}[\text{target company}] + \min(15,\, 2m_i) + 5\,\mathbb{1}[\text{shared context}]\Big)$$ where $T_i$ and $F_i$ reward title and field matches and $m_i$ is the number of messages you've exchanged.
- Claude reranks the top 120 into the 60 most useful, with a reason, a cluster, and which of your questions each person can answer.
- Claude everywhere it matters: Four Claude calls (target profile, ranking, coffee chat prep, follow-ups) all use structured outputs, so every response is valid JSON that matches a schema.
- Privacy by design: Names are never sent to Claude, only IDs, titles, and companies. Claude writes
[First name]and the browser fills it in. Nothing is stored on a server. - Reliability: Every Claude call falls back to heuristics if it fails, and demo results are cached so the demo runs instantly, even offline.
Challenges I ran into
- LinkedIn data is thin. Each connection has only a name, current company, current title, and connection date: no schools or past jobs. I combined code-based matching, connection-date guesses (clearly labeled as guesses), and an optional "paste their profile" mode for a deeper prep.
- No LinkedIn API for messaging. LinkedIn doesn't let third-party apps read or send messages, and scraping breaks their terms. So I made outreach tracking manual and privacy-first rather than risky.
- Scale versus speed. Ranking 1,500 people in one call was slow and expensive, which led to the two-stage design.
- Building a believable demo without exposing real people. I generated a fictional first-gen student with 80 made-up connections in LinkedIn's exact export format.
Accomplishments that I'm proud of
- Question routing: no tool I found answers "who in my network should I ask this question?"
- A full relationship cycle, not just one message: find, prep, reach out, track, thank, and keep in touch.
- Privacy built in from the start, with names never leaving the browser.
- Built-in impact measurement: messages sent, reply rate, and coffee chats booked.
What I learned
- How to design LLM features around messy, limited real-world data, and to be honest in the UI about what the data can and can't tell you.
- That structured outputs and good fallbacks matter as much as good prompts when a live demo is on the line.
- That the hardest part of networking isn't writing the message. It's knowing who to talk to and staying in touch afterward.
What's next for CoffeeChatBot
- Pilot with first-gen students through campus career centers and student government, measuring reply rates and networking confidence before and after.
- Alumni directories and event lists as inputs, so students with small networks can still find warm paths.
- Fresh-export sync: upload a new LinkedIn export and statuses update automatically from new message dates.
- A first coffee chat guide covering how to ask, how long to talk, and how to follow up.
- Career center dashboard with anonymized, aggregate outcomes so schools can see what helps students most.
Built With
- anthropic
- canvas
- claude
- claude-api
- css3
- html5
- javascript
- jszip
- localstorage
- next.js
- node.js
- papaparse
- playwright
- python
- react
- react-force-graph
- structured-outputs
- typescript
Log in or sign up for Devpost to join the conversation.