TMLS Agentic Hackathon · live demo

Stop working
for LinkedIn.
Make it work for you.

A Chrome extension + AI agent that audits your LinkedIn profile and feed, then tells you what to fix, who to engage, and what to post next. Your OpenAI key and data stay in your browser — only the prompts go to OpenAI.

5days to build
477unit tests
34test suites
0backend cost
SSI 73
+8 vs last week
AI rewrite ready
headline · 2 variants
3 actions today
biased to weakest pillar
Streak · 4 wks
full quota
linkmate · popup
TodaySSIProfileSettings
73
SSI · this week Top 5% of industry ↑ +8 vs last week
Current position
PASS
Skills ≥ 5
12
!
About ≥ 50 chars
28
Connections ≥ 50
812
!
Posts last 30d ≥ 4
1
Comments last 30d ≥ 8
14
where's the agent

How LinkMate works as an agent.

A four‑stage loop, not a chatbot. Each click closes the loop — yesterday's outcome shapes tomorrow's prompt.

01 · perception

Perception

Scrapes SSI score + your profile + feed posts from LinkedIn DOM.
WhatContent scripts on /in/*, /sales/ssi, /feed/*. SW writes to chrome.storage + IndexedDB.
02 · planner

Planner

Parallel LLM calls via Promise.allSettled — copy editor + SSI strategist.
Why parallelPartial success allowed: one prompt failing never blocks the other. Each result dedup'd by checkId.
03 · actuator

Actuator

Paste‑ready replies, headlines, posts. Human always in the loop.
Why humanLinkedIn ToS forbids auto‑submit. We pre‑fill the composer; you press send. No background tabs, no polling.
04 · reflection

Reflection

Lazy outcome scanner reads engagement on yesterday's comments → tomorrow's prompt.
Why lazyPiggy‑backs on natural revisits — no extra navigation, no scheduled polling. Outcomes feed avoidStems + concept rotation.
what it does

An AI agent for the platform that never tells you why.

LinkedIn's SSI ranks you 0–100 across four pillars — Brand, Find People, Engage, Build Relationships — but never tells you which lever to pull. LinkMate translates the score into paste‑ready actions.

📊

Reads your SSI

Daily scrape of /sales/ssi. Total + 4 pillar gauges + week‑over‑week trendline. 90‑day ring buffer in chrome.storage.

🩺

Audits your profile

6 LinkedIn All‑Star checks + 4 activity signals. Pure deterministic rule engine — instant, free, no API call.

Generates rewrites

Two parallel LLM calls: a copy editor (headline/about/experience) and an SSI strategist (pillar action + engagement angle). Paste‑ready, regeneratable.

🎯

Daily quotas

Weekly cadence mapped to each SSI pillar (1 post / 5 invites / 3 comments / 2 thread replies). Streak counter makes it visceral.

💬

Drafts replies in your voice

✨ Reply button on every post · uses captured profile context + topic distribution + reading the thread comments.

🔁

Closes the loop

Lazy outcome scanner reads likes/replies on your comments next time you revisit. Yesterday's outcome shapes tomorrow's prompt.

3‑minute demo

How to drive it.

Eight clicks from Load unpacked to LinkMate ranking your feed and drafting your posts.

AI rewrite · live
Headline rewrite

Two prompts. One click.

When you press Get AI rewrites, LinkMate fires two parallel calls via Promise.allSettled:

  • 📝 Copy editor — headline, about, experience, photo banner, openToWork.
  • 🧭 SSI strategist — weakest‑pillar action + engagement angle + network growth tactic.
  • 🧠 Concept rotation — each click stores {checkId, stem}; regenerate avoids repeating ideas.
  • 🛡️ Partial success allowed — one prompt failing never blocks the other.
01

setup

Load unpacked, paste your OpenAI API key in Settings. BYOK — never leaves your machine.

02

/in/<you>

Open your own profile → click Capture Profile. Parser extracts headline / about / skills / themes → AI synthesizes a 2‑sentence positioning summary.

03

audit

Popup shows progress bar of 6 essentials + activity signals (SSI, posts/30d, comments/30d, network). Instant. Zero API calls.

04

✨ rewrites

Click Get AI rewrites for N gaps. Paste‑ready copy lands under each failed check + SSI tactical action + engagement angle. Each card has a Copy button.

05

/sales/ssi

Refresh now → total score + 4 pillar gauges + donut chart populate. Daily alarm captures it automatically going forward.

06

/feed/

✨ Reply on every post · sidebar Engagement Queue ranks the feed by relevance to your profile (topic 40% / tier 20% / degree 15% / recency 10% / engagement 10% / diversity 5%).

07

today

Popup → Today: 3 AI cards biased to weakest pillar + cadence bars + streak. Each card opens the right LinkedIn page in one click.

08

post

Click Suggest a post → modal with 3 distinct drafts (story / hot take / lesson) tuned to your underweight topics.

under the hood

Zero backend. Three storage layers, by data shape.

MV3 service worker as sole writer. Content scripts only message. chrome.storage.local for hot state · chrome.storage.sync for settings · IndexedDB for the action ledger.

LinkedIn tabs                Extension SW                 Popup UI
─────────────               ──────────────               ──────────
linkedin.com/*       ─┐
linkedin.com/in/*    ─┼─► content scripts ─► background.ts ─► popup.html
linkedin.com/feed/*  ─┘   (scrape + inject)  (orchestrator)    (Today / SSI /
                               │                  │             Profile / Settings)
                               │                  │
                               ▼                  ▼
                       chrome.storage.local    OpenAI API
                       (profile, settings,     (BYOK · gpt‑4o‑mini)
                        SSI snapshots)
                               +
                           IndexedDB
                          (action log, outcomes)
⚙️ Chrome MV3 · TypeScript
🤖 OpenAI gpt‑4o‑mini · BYOK
🗃️ IndexedDB action ledger
📦 Parcel · no SDK · raw fetch
🧪 477 Jest tests · CI on every push
📈 Chart.js tree‑shaken (566 KB gz)
🚀 Tag‑push → GH Release zip
🔐 Key + data in browser · no server

Ready to demo?

Clone, build, load unpacked, paste your key. ~60 seconds.

$ git clone https://github.com/mrviduus/linkmate.git
$ cd linkmate
$ npm install && npm run build

# chrome://extensions → Developer mode → Load unpacked → pick dist/
# Click LinkMate icon → paste your OpenAI key → Save