← DevelopersThe ilml LinkedIn plugin

Your LinkedIn —
mirrored, and yours.

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.

28commands, each labelled with its ban-risk0servers — your data is a folder on your disk20 / dayself-imposed connection cap1trusted device, not a new login every run
Not a bot that clicks blindly

Mirror it once. Then work the copy.

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.

1

Log in once, as yourself

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.

2

Mirror your world

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.

3

Decide offline, act under quota

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.

Same mirror, different job

Who runs it, and for what.

Job seekers

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=70

Founders & fundraisers

Turn 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 → quota

BD, sales & recruiters

See 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 → visit

Researchers & analysts

A 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> --json
Copy, paste, adapt

Five playbooks that do real work.

Each one is a sequence you can run today. Nothing here is pseudo-code — these are the actual commands, flags and defaults.

1

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.

$ ilml linkedin sync-all --max=40 # pull new & changed threads, classify each one
$ ilml linkedin today # who owes a reply, prioritised — no browser
# hand today's list to your assistant → it writes replies.json: [{ name, text }]
$ ilml linkedin messages --draft-batch @replies.json # drafts land inside the threads
$ ilml linkedin messages --review-drafts # approve / edit / reject, one by one
$ ilml linkedin messages --push-drafts # sends them all in one session
ResultAnswered inbox — and nothing sent over a conversation that moved while you were drafting: push-drafts re-syncs each thread first and parks the draft as “needs review” if a new message arrived.
2

The connect funnel: a list of names → accepted connections

Build a queue, review it, approve it, send it under your own cap — then find out who actually said yes.

$ ilml linkedin connect add investors.json --tag=investors --priority=high # dedupes, skips anyone already connected
$ ilml linkedin connect list # status, priority, title, mutuals, quota left
$ ilml linkedin connect note <url> "Saw your thesis on…" # notes are scarce — spend them deliberately
$ ilml linkedin connect approve --tag=investors # the human gate
$ ilml linkedin connect run --max=15 # sends highest priority first, under quota
# a day later
$ ilml linkedin sync-connections --max=100 # who accepted → flipped to connected
$ ilml linkedin quota # acceptance rate per tag
ResultYou stop guessing. Investors accept at one rate, recruiters at another — and next week’s quota goes where it converts.
3

When the curated list runs out: let it find people

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.

$ ilml plugin config linkedin set DISCOVERY_ENABLED true # off by default
$ ilml linkedin connect run # harvests as it works
$ ilml linkedin connect fill --from-discovered --sector=ai --min-fit=0.6 --dry-run # preview the ranked picks
$ ilml linkedin connect fill --from-discovered --max=20 # top up the queue
$ ilml linkedin connect approve --all && ilml linkedin connect run # same gate, same cap
ResultA flywheel: connecting to founders surfaces more founders. Staging only — discovery never sends anything on its own.
4

Job hunt: score the market before you spend applications

Scouting and applying are separate on purpose. Build the intel first, then drain only the top of it.

$ ilml linkedin scout --max=200 # descriptions, stack, salary, company, recruiter, applicants
$ ilml linkedin apply-queue --list # the scored queue — no browser
$ ilml linkedin apply-queue --max=15 --min-score=70 # Easy Apply, forms filled by Lifebot AI
$ ilml linkedin funnel --max=10 # connect to the recruiters behind those jobs
Resultmarket-research/ becomes a dataset you can query: who is hiring for what, at what salary, with which recruiter — long after the postings are gone.
5

Before a cold ask: get warm

Never open with “I came across your profile”. Everything here is a read, most of it offline.

$ ilml linkedin warm-scan --companies="Stripe,Ramp,Mercury" --min-seniority=director # who you already know there (offline)
$ ilml linkedin enrich-profile <url> --full # Experience, Skills, Recommendations, Certifications
$ ilml linkedin profile-history <url> # did they change role since you last spoke?
$ ilml linkedin read-post <post-url> --json # your AI reads the post + its comments
$ ilml linkedin messages --draft 'Jane Doe' "…" # one draft, still gated by review
ResultAn opener that references what they actually said this week — written by your AI on data you pulled two commands ago.
Or

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.

On screen

What it actually prints.

Three of the no-browser commands — the ones you’ll live in.

ilml linkedin today — the plan, without opening LinkedIn
$ ilml linkedin today
══════════════════════════════════════════════════════════
  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
ilml linkedin quota — which outreach actually converts
$ ilml linkedin quota
=== 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
ilml linkedin connect list — the queue, before anything is sent
$ ilml linkedin connect list
=== 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.

Built for an assistant to drive

Your AI writes. You approve. It sends.

The hand-off is a file, not an integration — so this works with whatever assistant you already use, today.

replies.json — what your assistant produces
[
  { "name": "Dana W.",
    "text": "Tuesday 3pm works — here's my calendar…" },
  { "name": "Marcus R.",
    "text": "Take-home is back with you, notes inline." }
]
…and what you run
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 thread
Agent

The 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.

Pro

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 →

The part most tools skip

Restraint, wired in.

Speed is the easy part. Not getting your account limited is the product.

Your cap

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.

Human gate

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.

Verified

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/.

Labelled

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.

One device

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.

Where it all lives

Five files. On your disk.

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_DIRWhat’s in it
people.jsonEveryone you know of — connections and not: title, company, About, category, mutuals, enrichment.
conversations.jsonEvery thread: messages, status, category, summary, auto-tags, action needed, drafts, follow-ups.
quota.jsonEvery 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.

In your terminal

Every command, with its risk on the label.

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.

no browser reads your local copy — zero risklow normal browsing patternsmedium purposeful actions, cappedhigh flagged pattern — capped hard, use sparingly
ilml linkedin — command reference (v1.20.21)
# Set up
$ ilml plugin install linkedinno browser# add the plugin from npm
$ ilml linkedin loginlow# you sign in once; the session is saved locally
$ ilml plugin config linkedinno browser# your name, search URLs, caps, graph nodes
$ ilml linkedin help <cmd>no browser# usage, flags, ban-risk, when to use it
$ ilml linkedin versionno browser# confirm an update actually landed
# Mirror & read
$ ilml linkedin sync-alllow# inbox → local DB, then classify & summarise (--full · --max=N · --report)
$ ilml linkedin sync-connectionslow# who accepted your requests; import new connections
$ ilml linkedin todayno browser# prioritised action plan from the local copy
$ ilml linkedin enrichno browser# re-classify every conversation & contact, offline
$ ilml linkedin reportno browser# last sync session + inbox stats
# Reply — with your AI
$ ilml linkedin messages --draft-batch @replies.jsonno browser# your assistant hands over [{name, text}]
$ ilml linkedin messages --review-draftsno browser# approve / edit / reject each one
$ ilml linkedin messages --push-draftslow# send, with a per-thread freshness re-check
$ ilml linkedin messages --send 'Name' 'text'low# one message, recipient verified first
$ ilml linkedin messages --follow-up 'Name' 'note' 'date'no browser# set a reminder on a conversation
# Connections & outreach
$ ilml linkedin connect add <file.json>no browser# queue a curated list (--tag=X · --priority=high)
$ ilml linkedin connect fill --category=founder,investorno browser# queue from your own contacts (--valuable · --max=N)
$ ilml linkedin connect fill --from-discoveredno browser# queue from the discovery pool, best fit first
$ ilml linkedin connect listno browser# the queue: status, priority, notes, quota left
$ ilml linkedin connect approve --tag=Xno browser# the gate (also --all · note · no-note · skip · priority)
$ ilml linkedin connect runmedium# send approved, under quota (--max=N · --with-notes · --dry-run · --yes)
$ ilml linkedin quotano browser# quota left + acceptance rate per source
$ ilml linkedin funnelmedium# auto-queue recruiters from the apply pipeline
$ ilml linkedin warm-scan --companies="X,Y"no browser# your 1st-degree connections at target companies
# Presence & profiles
$ ilml linkedin visithigh# appear in their “who viewed your profile” (--source · --max=N)
$ ilml linkedin viewerslow# pull who viewed you
$ ilml linkedin enrich-profile <url> --fulllow# deep-read one profile into your contacts
$ ilml linkedin enrich-profileshigh# batch backfill — capped at 10/session, ban-risky
$ ilml linkedin profile-history <url>no browser# how their profile changed over time
$ ilml linkedin read-post <url> --jsonlow# post + comments as structured JSON (--save-to-graph=<node>)
$ ilml linkedin verify-aboutlow# smoke-test the extractor on your own profile
# Jobs & the full run
$ ilml linkedin scoutlow# score jobs from your search URLs, without applying (--max=N · --url)
$ ilml linkedin apply-queuemedium# apply to the top-scored queue (--min-score=N · --list)
$ ilml linkedin applymedium# Easy Apply on your saved search, forms filled by AI
$ ilml linkedin dailymedium# sync → apply → scout → funnel → visit → viewers → report
# Your data
$ ilml linkedin migrate-statusno browser# schema version vs. what the plugin expects
$ ilml linkedin data-cleanupno browser# de-duplicate, prune stubs, fix derived fields
$ ilml linkedin rollback-datadestructive# restore the pre-migration backup
Get started

Five lines to your first plan.

Node 18+ and a LinkedIn account. Configure the rest — search URLs, caps, your name, graph nodes — with ilml plugin config linkedin.

install, log in, first mirror
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 needed
Straight answers

The questions people actually ask.

Does my data leave my machine?

No. 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.

Do you need my LinkedIn password?

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.

Will this get my account banned?

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.

Which AI does it use?

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.

Do I need an iLiveMyLife account?

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 →

Can I run it on a separate account?

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.

Can I schedule it?

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.

What do I need to install it?

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.

Own your network.

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.