๐ Features
โ Home
Feature 1 โ Connection Automation
Tab: Live Feed (left panel โ Execute button)
Finds decision makers at target companies and sends personalized connection requests.
How it works
- Enter target company names (one per line) in the left panel
- Click Execute
- Chrome opens, searches LinkedIn for people at each company
- Each profile is scored (AI or keyword matching)
- Connection request sent with an AI-written note
- Logged to
connections.csv
Controls
| Control | Purpose |
|---|---|
| Action Delay slider | DEMO / FAST / NORMAL / SAFE โ controls time between actions |
| Pause button | Suspends after current action |
| Stop button | Cancels run cleanly |
| Test AI button | Verifies Ollama/Gemini is reachable |
Caps & Limits
WEEKLY_CAP=100โ tracked in the ring widget- Configurable via
.env - No daily cap โ removed
Ring Widget
Three concentric arcs show:
- Outer ring โ weekly connections (vs 100 cap)
- Middle ring โ today's connections (display only, no daily cap)
- Inner ring โ connections sent with a message note
Feature 2 โ First Message (Msg Prospect)
Tab: Msg Prospect
Sends AI-personalized first messages to new connections who haven't been messaged yet.
How it works
- Click the Msg Prospect tab
- Set Messages per Run slider (1โ10)
- Click Send Messages
- Chrome opens, navigates to connections page
- Scrapes visible connection cards via JavaScript DOM evaluation
- Filters out anyone already in
messages.csv - For each new connection:
- Navigates directly to their compose URL
- Ollama generates a warm, non-salesy first message
- Types message and clicks Send
- Logs to
messages.csv - Seeds
followups.csvwithstatus=pending
Message Prompt Design
Write a short, friendly LinkedIn first message to {first_name},
who just connected with me. Their role is: {role}.
Rules:
- 2-3 sentences max
- Warm and genuine, not salesy
- Reference their role if known
- Do NOT mention jobs, recruiting, or opportunities
- Start with 'Hi {first_name}'
- Return ONLY the message text
Dedup Logic
- Primary: normalized
profile_urlmatch againstmessages.csv - Fallback: lowercased
namematch (for manually-added rows)
Feature 3 โ Follow-Up Sequence with Reply Detection
Tab: Follow Up
Sends a single gentle follow-up to connections who haven't replied after a set number of days.
How it works
- Click the Follow Up tab
- Set Wait before follow-up slider (0 = test mode, 1โ14 days)
- Set Follow-ups per Run slider (1โ10)
- Click Send Follow-Ups
followups.csvis seeded frommessages.csv(idempotent โ safe to run repeatedly)- Filters to:
status = pendingANDfirst_msg_sent_at โค now - wait_days - For each candidate:
- Navigates to their LinkedIn profile page
- Clicks the Message button directly on the profile
- Compose overlay opens on top of the profile (no page jump)
- Checks last message bubble class to detect reply
- If replied โ marks
status=replied, moves on - If not replied โ Ollama generates follow-up โ types โ Send
- Updates
followups.csvโstatus=followed_up
Reply Detection
DOM selectors checked inside the open compose overlay:
.msg-s-event-listitem--other โ they sent last โ replied โ
.msg-s-event-listitem--self โ we sent last โ no reply
(none found) โ unknown โ treat as no reply
Status Values in followups.csv
| Status | Meaning |
|---|---|
pending | First message sent, no follow-up yet |
replied | They replied โ no follow-up needed |
followed_up | Follow-up sent |
done | Reserved for future use |
Follow-Up Prompt Design
Write a short, gentle follow-up LinkedIn message to {first_name},
a {role}, who hasn't replied yet.
My original message was: "{original_message[:120]}"
Rules:
- 1-2 sentences max
- Warm, not pushy
- Do NOT mention jobs, recruiting, or opportunities
- Do NOT repeat the original message verbatim
- Start with 'Hi {first_name}'
- Return ONLY the message text
NOTE โ One Follow-Up Only The system sends exactly one follow-up per connection. Once
status=followed_up, that person is never contacted again automatically.
Common Behaviors Across All Features
5-Second Send Countdown
Before every send (first message or follow-up), the live feed shows:
Sending in 5s โ click Stop to cancel...
This gives you a window to abort any individual message.
CAPTCHA Detection
If LinkedIn shows a CAPTCHA at any point, the run pauses and logs a warning. You solve it manually, then restart.
Speed Modes
| Mode | Delay between actions |
|---|---|
| DEMO | ~1s (high risk) |
| FAST | ~3โ5s |
| NORMAL | ~5โ8s |
| SAFE | 8โ15s (recommended) |
AI Quote Stripping
Both message generators apply .strip().strip('"').strip("'") to remove any quote characters the AI wraps around its output.