LK Mission Radar — Features
Detection
- Auto-scan — MutationObserver on LinkedIn Messaging: detects new messages in real time without page reload
- Manual scan — “Scan current conversation” button to force-scan the active thread on demand
- AI classification — Each message is sent to Claude (via custom LLM router) and scored 1–10 based on relevance to the user profile
- Score threshold — Configurable minimum score (default: 5/10); offers below the threshold are silently ignored
- Date cutoff — Configurable start date for parsing; messages older than the cutoff are skipped
- Deduplication — Three-layer system: in-memory lock (
inFlight Set) + local cache (processedThreadIds) + Notion query by ThreadId
AI Reply Drafting
- Interested reply — One-click generation of a professional interest message, tailored to the detected offer and user profile
- Decline reply — One-click generation of a polite refusal, leaving the door open for future opportunities
- Reformat — Rewrites the user’s own draft already typed in the LinkedIn input, preserving intent while improving style and clarity
- Floating bar — Injected directly above the LinkedIn reply input when a detected offer is open; disappears after injection
Reply Injection
- Safe injection — Uses
execCommand('insertText') to place the draft in the LinkedIn input without triggering auto-send
- Manual send — The user always reviews and sends the message themselves
- Templates — Predefined or custom message templates; copyable to clipboard or injectable into the LinkedIn input
Storage — Notion
- Auto-sync toggle — Enable/disable automatic Notion sync per detected offer (default: on)
- Full offer record — Each offer stored with: role, company, type, score, location, remote, salary, sender, summary, LinkedIn URL, DetectedAt, DetectedBy
- Status tracking — New / Interested / Pending / Declined synced to a Notion select field
- Per-user label — Each entry tagged with
Firstname #uuid6 to identify which instance detected the offer (multi-user support)
- Archive on ignore — Ignoring a recruiter soft-deletes their offer in Notion (
archived: true)
- Full reset — “Local + Notion” reset archives all Notion pages in one operation
Notifications — Discord
- Auto-share toggle — Enable/disable automatic Discord post per detected offer (default: off)
- Manual share —
📢 button on each offer card to share individually to the Discord channel
- Send all — “Send all to Discord” bulk action shares all unshared offers in one click
- Rich embed — Color-coded by contract type (CDI / Freelance / CDD / Stage), includes score emoji, fields for company, location, salary, sender, and detected-by
- Clickable link — Embed links directly to the LinkedIn conversation
- Retention — Discord messages older than 30 days are automatically deleted via webhook;
DiscordMessageId cleared in Notion to prevent re-deletion
Dashboard & History
- Local history — Last 50 detected offers cached in
chrome.storage.local
- Stats — Today’s count / total / pending offers shown at a glance
- Badge counter — Extension icon badge shows the number of offers detected today; resets at midnight
- Filters — Filter the Offers tab by status or contract type
- Status update — Change offer status directly from the popup; synced to Notion in real time
Recruiter Blacklist
- Add from offer card — “Ignore” on any offer card blacklists the recruiter and archives the offer
- Manage in settings — Add or remove recruiters manually from the Settings page
- Persistent — Stored in
chrome.storage.sync (shared across devices)
Settings & Profile
- User profile — First name, job types, tech stack, minimum daily rate / salary, remote preference, location, availability, notes — used by Claude for scoring and drafting
- Unique identifier — 6-char hex UUID generated once per install, displayed as
Firstname #uuid in Settings, Notion, and Discord
- Score threshold — Adjustable minimum score for offer capture
- Date cutoff — Adjustable start date for message parsing
- Notion / Discord toggles — Available in both the popup dashboard and the Settings page
Resilience & UX
- Budget alert — System notification + popup banner when the Claude API budget is exceeded; dismissible
- Extension context guard — All
chrome.runtime calls guarded against context invalidation after extension reload
- LinkedIn SPA support — URL change watcher + MutationObserver re-attach on navigation
- Onboarding — First-run page to set the date cutoff and first name before using the extension