Skip to content
Career
Skill

/network-scan

Scan your LinkedIn contacts' companies for matching job openings

From plugin
proficiently
3177 skills
Install
$ npx -y skills add proficientlyjobs/proficiently-claude-skills --skill network-scan --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/network-scan

Context preview

The summary Claude sees to decide when to auto-load this skill.

Scan your LinkedIn contacts' companies for matching job openings

SKILL.md

network-scan.SKILL.md
name: network-scan
description: Scan your LinkedIn contacts' companies for matching job openings
argument-hint: "number of contacts (default 25) or 'all'"

Network Scan Skill

> **Priority hierarchy**: See `shared/references/priority-hierarchy.md` for conflict resolution.

Proactively check whether companies where you know someone are hiring for roles that match you. First run builds a cache of company careers page URLs. Subsequent runs reuse the cache, making weekly checks fast.

Quick Start

  • `/proficiently:network-scan` - Scan companies from your 25 most recent contacts
  • `/proficiently:network-scan 50` - Check the 50 most recent contacts
  • `/proficiently:network-scan all` - Check all contacts (can be slow with 1500+)

File Structure

scripts/
  resolve-careers.md     # Subagent for resolving a batch of company careers URLs
  evaluate-company.md    # Subagent for scanning a batch of companies' open roles

User data (stored at ~/.proficiently/):

~/.proficiently/
  resume/                # Your resume PDF/DOCX
  preferences.md         # Job matching rules
  profile.md             # Work history from interview
  linkedin-contacts.csv  # LinkedIn contacts export
  company-careers.json   # Cached company careers URLs
  network-scan-history.md # Running log of scan results
  jobs/                  # Per-job application folders

---

Workflow

Step 0: Check Prerequisites

Resolve the data directory, then check prerequisites per `shared/references/prerequisites.md`. Resume, preferences, and linkedin-contacts.csv are all required.

Load these files for use in later steps:

  • `DATA_DIR/preferences.md` (target roles, must-haves, dealbreakers, nice-to-haves)
  • `DATA_DIR/resume/*` (candidate profile)
  • `DATA_DIR/profile.md` (work history, if it exists)

Step 1: Select Contacts & Extract Companies

Parse `$ARGUMENTS`:

  • If a number (e.g., `50`): use that as the contact limit
  • If `all`: use all contacts (warn user this may be slow if > 200)
  • If empty/missing: default to 25

Read `~/.proficiently/linkedin-contacts.csv`. Sort by "Connected On" descending (most recent first). Take the first N contacts based on the limit.

Extract unique company names from the selected contacts. Skip companies with empty or blank names.

Group contacts by company into a lookup:

{
  "Google": [{"name": "Jane Smith", "position": "PM Director", "url": "https://linkedin.com/in/janesmith"}, ...],
  "Stripe": [{"name": "John Doe", "position": "Eng Manager", "url": "https://linkedin.com/in/johndoe"}]
}

Report to user: "Found X unique companies from Y contacts. Checking careers pages..."

Step 2: Resolve Careers Pages (Parallelized)

Load `~/.proficiently/company-careers.json` if it exists (the cache). If it doesn't exist, start with an empty object.

Split companies into three groups:

  • **Cached (fresh)**: `last_checked` within last 7 days - use as-is, no work needed
  • **Cached (stale)**: `last_checked` older than 7 days - needs re-verification
  • **Uncached**: not in cache, or `type` is `"not_found"` and stale - needs full resolution

Report: "X companies from cache, Y need resolution..."

**Parallel resolution using subagents:**

Take all companies needing resolution (stale + uncached) and split them into batches of 10. Spawn one subagent per batch using the Task tool (`subagent_type: "general-purpose"`). Run all batches in parallel.

Each subagent receives:

  • A batch of company names to resolve
  • Instructions from `scripts/resolve-careers.md`

Each subagent uses `WebSearch` (NOT the browser) to find careers pages: 1. Search: `"[Company Name]" careers jobs site:[company domain if known]` 2. From the search results, identify the careers/jobs page URL 3. Classify the URL type:

  • `"direct"` - company's own careers page (e.g., careers.google.com)
  • `"greenhouse"` - Greenhouse ATS (boards.greenhouse.io/company or company.greenhouse.io)
  • `"lever"` - Lever ATS (jobs.lever.co/company)
  • `"workday"` - Workday ATS (company.wd5.myworkdayjobs.com)
  • `"other_ats"` - other ATS platforms (Ashby, BambooHR, etc.)
  • `"not_found"` - no careers page could be found (set `careers_url` to null)

4. Return results for the batch

Collect results from all subagents and merge into the cache. Save `~/.proficiently/company-careers.json`. Format:

{
  "Company Name": {
    "careers_url": "https://careers.example.com",
    "type": "direct",
    "last_checked": "YYYY-MM-DD",
    "last_found_roles": 0
  }
}

Report progress: "Resolved X new careers pages, Y from cache, Z not found."

Step 3: Scan for Matching Jobs (Parallelized)

Take all companies with a valid `careers_url` (skip `not_found` and `ignored` entries). Split them into batches of 5 companies each.

**Spawn parallel subagents** using the Task tool (`subagent_type: "general-purpose"`). Run all batches in parallel (up to 5 concurrent subagents to avoid overwhelming the browser).

Each subagent receives:

  • A batch of companies (name, careers_url, ATS type, network contacts)
  • Candidate profile summary (from resume)
  • Preferences (target roles, must-haves, dealbreakers, nice-to-haves)
  • Instructions from `scripts/evaluate-company.md`

Each subagent: 1. Creates its own browser tab (`tabs_context_mcp` then `tabs_create_mcp`) 2. For each company in its batch: a. Navigate to the careers page b. Search/browse for roles matching target roles and keywords c. For ATS pages, use platform search/filter functionality:

  • **Greenhouse**: search box or department filters
  • **Lever**: search bar or team filter
  • **Workday**: keyword search field
  • **Direct/other**: browse the page, use any search, scan listed roles

d. Extract listings: title, location, URL e. Score each listing (High/Medium/Low/Skip per fit criteria) f. Return only High and Medium fits 3. Returns results for its entire batch

**Fit scoring criteria:** See `shared/references/fit-scoring.md` for the canonical definition

Read more
Ships withproficiently

A Claude Code plugin for AI-powered job searching, resume tailoring, and cover letter writing. Built by Proficiently. Want someone to handle your entire job search?

Get the whole plugin
Stats
333
Stars
61
Forks
Maintained
Maintenance
5mo ago
Last commit
6mo ago
Created

Repo: proficientlyjobs/proficiently-claude-skills