Skip to content

li-assist v0.1.0 — first public release

Choose a tag to compare

@kevin-burns kevin-burns released this 27 Jun 18:59
· 61 commits to main since this 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-title filters.
  • jobs get <urn> — full posting detail (description, apply URL, company, location). Cache-first; --refresh to 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)

  • --intros on jobs get / jobs sweep cross-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

  • --enrich turns 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), doctor health checks, and config location to 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 voyager endpoint 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 voyager facts were informed by eracle/linkedin-cli (MIT).
  • The offline Connections.csv warm-intro approach was inspired by NetPrune (ChronoCoders), which reached the same read-only-export conclusion.