npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

linkedin-industry-sleuth

v0.1.0

Published

Scaffold an agent skill that maps any industry from LinkedIn: tiered keyword map, practitioner roster, paid offerings, thought-leader cross-reference, and a takeaways brief.

Readme

LinkedIn Industry Sleuth Agent

Explores industry professionals by keyword — skills, titles, or any phrase people actually use on LinkedIn — and pulls the key information for industry exploration.

Point it at a category and it answers four questions: what does this field call itself, who works in it, who monetizes it, and who does both.

The category is configuration, not code. One YAML file is the only thing that changes between industries.

Install

npx linkedin-industry-sleuth init      # scaffold into the current directory
npx linkedin-industry-sleuth doctor    # check prerequisites
npx linkedin-industry-sleuth list      # preview what init writes

Then configure and run:

cp config/industry.example.yaml config/industry.yaml   # edit name + keywords

In Claude Code: /linkedin-industry-sleuth for all phases, or --step N for one.

Artifacts

A run writes four files into data/. They are not committed — the directory ships empty and you generate your own.

[KEYWORD_*] below is replaced by the industry.name in your config. Set it to Solar Finance and phase 2 writes data/Solar Finance Professionals.csv.

| File | What it holds | |---|---| | [KEYWORD_MAP].md | Tiered synonym map for the category, with sources | | [KEYWORD_PROFESSIONALS].csv | LinkedIn profiles positioning in the space | | [KEYWORD_OFFERINGS].csv | Courses, cohorts and certifications, links verified | | [KEYWORD_TAKEAWAYS].md | Synthesized brief: what the data says, and its limits |

Professional columns: first_name, last_name, profile_url, headline, bio, location, company, website_url, thought_leader — headline is the one-liner under someone's name, bio is their About section, empty for profiles that have none. thought_leader is marked x for anyone who also creates an offering in the offerings CSV. Phase 5 adds industry_function, role_type, seniority and region.

The professionals CSV only keeps profiles whose bio carries a tracked keyword. LinkedIn's search matches whole profiles, so roughly half of all search hits do not meet that bar; those land in data/raw/professionals_no_keyword_in_bio.csv alongside the other scrape checkpoints. Nothing excluded is deleted — the rejects are often the more interesting read.

The seven phases

| # | Phase | Cost | |---|---|---| | 1 | Keyword map | Web search only | | 2 | People discovery | LinkedIn quota + account risk | | 3 | Offerings | Web search + fetch | | 4 | Cross-reference | Local only | | 5 | Classification | Local + agent judgment | | 6 | Synthesis | Agent judgment | | 7 | Publishing | Local, optional |

Phases 1, 3, 4, 5 and 6 are cheap and safe to re-run. You should review phase 2 and make sure you're ok with the risks and costs. Everything about its design exists to make interruption cheap.

Manually:

.venv/bin/python scripts/browser.py                              # verify session
.venv/bin/python scripts/discover_people.py --limit 5 --pages 1  # phase 2 dry run
.venv/bin/python scripts/discover_people.py                      # phase 2
.venv/bin/python scripts/discover_offerings.py                   # phase 3
.venv/bin/python scripts/cross_reference.py                      # phase 4
.venv/bin/python scripts/classify.py                             # phase 5

LinkedIn access

Phase 2 drives a real headed Chromium against a persistent profile in .browser-profile/. You log in by hand on first run; nothing stores credentials.

Automated browsing is against LinkedIn's user agreement, so the scraper is deliberately conservative: randomized human-paced delays, a 150-profile-per-run cap, read-only page loads, and a hard stop on any captcha or commercial-use-limit page. Both scraped profiles and discovered URLs are checkpointed as it goes, so an aborted run resumes without re-spending search quota. The browser page is rebuilt every 35 profiles because Chromium's renderer reliably crashes under sustained LinkedIn use.

Every cap and delay lives in config/industry.yaml. Raise them only after a clean run, and only a little. Read .claude/skills/linkedin-industry-sleuth/references/ethics-and-limits.md before pointing this at LinkedIn.

Setup

brew install [email protected]
/opt/homebrew/bin/python3.12 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/playwright install chromium

Worked example

config/industry.example.yaml ships filled in with a real mapping of the agentic go-to-market category — the run this tool was extracted from. It's there because a working example is easier to adapt than an empty schema. Replace it with your own category; nothing in the pipeline is specific to that one.

License

Apache 2.0. Not affiliated with LinkedIn Corporation. See NOTICE for the binding terms on automated access and your responsibilities as an operator.