li-assist v0.1.0 — first public release
li-assist is a single-user, read-only command-line tool for hunting and researching jobs on LinkedIn. It drives your own signed-in Chromium session, reads jobs through LinkedIn's internal voyager API, caches what it sees locally, and can distill noisy job descriptions into structured insights with a local or hosted LLM. Everything goes through a jittered rate limiter with a daily cap — it never posts, messages, connects, or performs any write action.
This is the first public cut.
What's in it
Job search & tracking
jobs search <keywords…>— multi-word keywords with LinkedIn boolean operators (OR/AND/NOT/"phrases"),--location,--anywhere(worldwide),--limit, and repeatable--exclude-company/--exclude-titlefilters.jobs get <urn>— full posting detail (description, apply URL, company, location). Cache-first;--refreshto force a re-fetch.jobs sweep <keywords…>— runs a search, diffs it against a local cache, and prints only what's new since last run. Always writes a one-line audit (N new / M seen / K excluded) to stderr — never silent.
Warm intros (offline)
--introsonjobs get/jobs sweepcross-references your own LinkedIn Connections.csv export against each job's employer and surfaces who you already know there (name, profile URL, current title, connection date). 100% offline — zero extra network calls. Email is dropped at import; the export path is gitignored so it can't be committed.
LLM enrichment
--enrichturns a marketing-heavy description into structured insights (real summary, genuinely-required skills, salary, seniority, condensed description). Provider-agnostic with auto-detect: Ollama → OpenAI → Gemini → Anthropic. Local models keep everything on your machine. Insights are computed once per job and cached.
Setup & health
auth login/auth status(sessions treated as stale after 14 days),doctorhealth checks, andconfig locationto set a default search location once.
Built in
- Browser-resident transport (chromedp, in-page
fetch()— no cookie/header replay), jittered rate limiter + daily cap, a capped self-evicting JSONL cache, and a 5-layer Clean Architecture with a CI-enforced dependency-direction gate. - An agent skill (
skill/SKILL.md) so Claude Code / Codex can drive the tool while respecting the read-only and rate-limit constraints.
What it deliberately does not do
- Never writes. No posting, commenting, reacting, messaging, connecting, or applying — by design, not omission.
- Deferred (read surfaces LinkedIn moved behind Server-Driven UI): company search, people search, person profiles, reading post/article bodies, and browsing the feed. These have no clean
voyagerendpoint to parse. - Distance/radius job filtering: not available — LinkedIn removed distance from the clean jobs endpoint (it now lives only in the SDUI/AI search).
Install
Build from source (requires Go; a local Google Chrome / Chromium is needed at runtime):
go install github.com/kevin-burns/linkedin-assist/cmd/li-assist@v0.1.0
# or clone + `go build -o li-assist ./cmd/li-assist`Pre-built GoReleaser binaries and a Homebrew tap are planned. See the README for macOS quarantine notes.
A note on safety
li-assist uses LinkedIn's private internal API via your own logged-in browser session. Automated access is contrary to LinkedIn's User Agreement, which is exactly why this tool is single-user, read-only, and rate-limited. Use it for your own personal job hunt; the account risk is yours.
Credits
- The browser-resident transport and several
voyagerfacts were informed byeracle/linkedin-cli(MIT). - The offline Connections.csv warm-intro approach was inspired by NetPrune (ChronoCoders), which reached the same read-only-export conclusion.