Morning: from a cold inbox to sent replies
One pass, ~3 minutes of your attention. Your AI writes, you approve, the plugin sends — each thread re-checked a second before it goes out.
Not another auto-apply bot. ilml-plugin-linkedin keeps a local copy of your LinkedIn — inbox, contacts, jobs, connection funnel — in a database on your machine, and gives you a terminal to work it from: a daily plan with no browser, replies your AI drafts and you approve, outreach that stops at a cap you set.
The expensive, risky part — touching LinkedIn — happens rarely and under a cap. Everything else runs against your data, offline, as fast as you can think.
ilml linkedin login opens a real browser and you sign in — 2FA and all. The session becomes a persistent Chrome profile on your machine, so LinkedIn keeps seeing one trusted device instead of a fresh sign-in every run.
sync-all scans the inbox, opens what changed, and writes it to people.json and conversations.json — then classifies every thread (recruiter · hiring manager · founder · investor · coach), summarises it, and flags what needs an answer. sync-connections does the same for who accepted your requests. Unread badges stay bold in LinkedIn unless you ask otherwise.
Planning your day, drafting replies, ranking who to reach, scoring jobs — none of it opens a browser. When something finally has to touch LinkedIn, it goes one action at a time, verified, inside a daily and weekly cap that you set.
Score the market before you spend applications on it: what the roles pay, which stack, which recruiter, how many applicants — then drain only the top of the queue.
scout --max=200 → apply-queue --min-score=70Turn a curated list of investors into a reviewed, quota-gated outreach funnel — and find out which segment actually accepts before you burn the next hundred requests.
connect add investors.json → approve → run → quotaSee who you already know at a target company before the cold ask, keep the inbox from rotting, and show up in the “who viewed your profile” list of the people who matter.
warm-scan --companies="…" → today → visitA queryable dataset of who’s hiring for what, at what salary, plus posts and their comment threads handed to your AI as structured JSON.
scout → market-research/ → read-post <url> --jsonEach one is a sequence you can run today. Nothing here is pseudo-code — these are the actual commands, flags and defaults.
One pass, ~3 minutes of your attention. Your AI writes, you approve, the plugin sends — each thread re-checked a second before it goes out.
Build a queue, review it, approve it, send it under your own cap — then find out who actually said yes.
Opt-in discovery. While connect run already has a profile open, it reads LinkedIn’s “People also viewed” panel — no extra page loads — and builds a pool ranked by relevance to you.
Scouting and applying are separate on purpose. Build the intel first, then drain only the top of it.
Never open with “I came across your profile”. Everything here is a read, most of it offline.
One command for the whole day. ilml linkedin daily runs the pipeline in order — sync → apply → scout → funnel → visit → viewers → report — each phase respecting its own cap. --comms for the inbox half, --jobs for the job half.
Three of the no-browser commands — the ones you’ll live in.
══════════════════════════════════════════════════════════
TODAY'S PRIORITIES
══════════════════════════════════════════════════════════
═══ CONNECTION QUOTA & QUEUE ═════════
Today: 6/20 sent (14 remaining)
Week: 47/100 sent (53 remaining)
Queue: 38 profiles (12 new, 2 retry)
Funnel: 214 accepted, 63 pending
═════════════════════════════════════
UNREVIEWED — NEW MESSAGES (4):
1. [high] Dana W. [recruiter] — Staff FE role, asks for availability this week
2. [high] Alexey T. [founder] — Wants an intro to a design partner
3. [med] Marcus R. [hiring_manager] — Sent the take-home; deadline Tue
4. [low] Priya N. [coach] — Newsletter reply, no action needed
FOLLOW-UPS (1 due, 3 scheduled):
⚡ Alexey T. [due 2026-08-30] — send the intro to Nadia
📅 Dana W. [2026-09-02] — ping if no reply on the role=== LinkedIn Connection Quota === State Today: 6 / 20 (14 left) Week: 47 / 100 (53 left) — rolling 7 days Log: 612 requests recorded all-time Acceptance (all-time, unique profiles) Source Sent Accept Rate Await Stale>14d investors 84 41 48.8% 22 21 founders 132 77 58.3% 31 24 recruiters 301 96 31.9% 78 127 ─────────────────────────────────────────────────────────────── TOTAL 517 214 41.4% 131 172 (Accept = they connected · Await = still open · Stale>14d = likely won't) Feeder pool — high-value people not yet connected founder 58 investor 21 hiring_manager 34 TOTAL 113
=== Connect Queue === (quota left: 14/20 today, 53/100 week)
Status: queued=22 approved=9 sent=41 skipped=3
[approved] high 📝 Jane D. — Partner at Northstar Ventures · 3 mutual
https://www.linkedin.com/in/… (tag=investors)
[approved] high Sam O. — Founder & CEO at Latch · 1 mutual
https://www.linkedin.com/in/… (tag=investors)
[queued ] normal Ana L. — Head of Talent · 7 mutual
https://www.linkedin.com/in/… (tag=recruiters)
1 pending entry has a saved note — sent only with `connect run --with-notes`.Real output format — names and numbers are illustrative.
The hand-off is a file, not an integration — so this works with whatever assistant you already use, today.
[
{ "name": "Dana W.",
"text": "Tuesday 3pm works — here's my calendar…" },
{ "name": "Marcus R.",
"text": "Take-home is back with you, notes inline." }
]ilml linkedin today # who needs an answer
ilml linkedin messages \
--draft-batch @replies.json # stage the drafts
ilml linkedin messages \
--review-drafts # approve / edit / reject
ilml linkedin messages \
--push-drafts # send, re-checked per threadThe manifest is the documentation. Every command ships its usage, flags, when to use it and its ban-risk in ilml-plugin.json — so an agent can pick the right tool instead of guessing, and ilml linkedin help <cmd> prints the same thing for you. Read paths have machine modes too: quota --json, read-post --json. Over MCP, your assistant reaches the plugin and your graph in the same breath.
Give the automation its own account. Run ilml login --local inside the plugin’s folder to sign that project into a separate account — your personal graph stays untouched while the bot works. One CLI, many accounts. More on accounts →
Speed is the easy part. Not getting your account limited is the product.
Caps you set, under the ones you can’t see. LinkedIn’s real limit is dynamic and undisclosed, so the plugin keeps its own: CONNECT_MAX_DAILY 20 and CONNECT_MAX_WEEKLY 100 over a rolling 7 days — enforced across every path that can send a request. Raise them deliberately, or leave them alone.
Nothing goes out unapproved. The queue moves queued → approved → sent, and only approved entries are sent. Same for messages: draft, review, then push. --yes exists so a scheduler can run an already-approved batch — not so approval can be skipped.
A click is not proof of a send. Sends are confirmed before they’re counted. Replies pass a salutation guard (it refuses “Hi Dan” under Alexey’s thread) and a pre-send freshness re-check. connect run stops itself after 3 failures in a row — usually LinkedIn’s own invite limit — and saves exactly what LinkedIn showed to connect-diagnostics/.
Every command tells you its ban-risk. It’s in the manifest, so ilml linkedin help enrich-profiles prints HIGH and why (visiting profiles with no follow-up action is exactly the pattern LinkedIn flags). Meanwhile today, quota, enrich, warm-scan, connect list and report never open a browser at all.
A persistent profile, not a fresh login every run. You sign in yourself, once — the session lives as a real Chrome profile on your machine, so LinkedIn keeps seeing one trusted device instead of a new sign-in each time. A hard-killed run recovers its browser on the next launch instead of stranding a locked profile.
Point DATA_DIR anywhere you like — the mirror survives plugin updates, logouts and re-installs, and syncs with your cloud drive if you want it to.
| In your DATA_DIR | What’s in it |
|---|---|
people.json | Everyone you know of — connections and not: title, company, About, category, mutuals, enrichment. |
conversations.json | Every thread: messages, status, category, summary, auto-tags, action needed, drafts, follow-ups. |
quota.json | Every connection request you ever sent, with dates and source — the basis for acceptance analytics. |
market-research/ | Scouted jobs with scores, discovered people, companies, the visit log, profile viewers. |
connect-diagnostics/ | Exactly what LinkedIn showed when a send failed — so a stop is debuggable, not mysterious. |
ISO-8601 timestamps, plain JSON, no server. Because it’s just a folder, you can point DATA_DIR at a git repository of your own — separate from the plugin — for a full, versioned history of your network; the plugin never touches git, it’s your folder to manage. And when you want it in the graph, it goes there too — applications, session reports and captured posts land as nodes you can query, tag and automate on.
The plugin installs into your ilml CLI and runs as ilml linkedin <command>. Run ilml linkedin help <command> for usage, flags, defaults and the reasoning behind each risk level.
Node 18+ and a LinkedIn account. Configure the rest — search URLs, caps, your name, graph nodes — with ilml plugin config linkedin.
npm install -g @ilivemylife/graph-sdk # the ilml CLI
ilml plugin install linkedin # add the plugin
ilml linkedin login # you sign in once, session saved
ilml linkedin sync-all # mirror your inbox locally
ilml linkedin today # your plan, no browser neededNo. The mirror is a folder of JSON files at your DATA_DIR. The network traffic is LinkedIn itself, in the browser on your desk. What reaches your iLiveMyLife graph is only what you point at it: the application-tracking node, optional end-of-session reports, and read-post --save-to-graph=<node> — which saves nothing unless you pass the flag.
ilml linkedin login opens a browser and you sign in — including 2FA. The session is then stored beside your data as a persistent Chrome profile. The optional login/password config fields only pre-fill that form locally; nothing is transmitted anywhere.
Nobody can honestly promise otherwise — LinkedIn’s limits are dynamic and undisclosed. What the plugin does about it: caps well under the platform’s (20/day, 100 per rolling week), one action at a time from a single trusted device, a labelled ban-risk on every command, a hard stop after three consecutive failures, and a preference for actions with a purpose (connect, message, apply) over the pattern LinkedIn actually flags — visiting strangers’ profiles with no follow-up.
Whichever you already use. The messaging interface is a JSON file — [{ name, text }] — so any assistant that can write a file can drive it, and --json output modes make the read side machine-parseable. Because the plugin lives inside the ilml CLI, an agent can also reach it (and your graph) over MCP. Lifebot fills in the job-application forms.
Yes — the plugin installs into the ilml CLI, and the apply pipeline logs into graph nodes you own. The mirror, the planning, the drafting and the queue are plain local files either way. More on the CLI →
Recommended for automation. Run ilml login --local inside the plugin’s folder to sign that project into its own account — your personal graph stays untouched while the bot works. One CLI, many accounts.
ilml linkedin daily runs the whole pipeline once a day (--jobs / --comms for one half), and connect run --yes skips the confirm prompt so a cron job can ship a batch you approved earlier. Point NODE_RUN_REPORTS at a node with notifications on and each run tells you how it went.
Node 18+, a real Chrome (driven by Puppeteer) and a LinkedIn account. Works on macOS, Linux and Windows. npm install -g @ilivemylife/graph-sdk, then ilml plugin install linkedin.
A local mirror, your AI, and one CLI — LinkedIn on your terms.
Get the plugin →An independent open tool. Not affiliated with, endorsed by, or connected to LinkedIn Corporation. It drives your own browser, with your own account, at a pace you set — you stay responsible for how you use it and for LinkedIn’s terms.