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

keywords-cli

v0.1.0

Published

A TypeScript CLI for phrase research, opportunity scoring, clustering, and niche discovery.

Readme

keywords-cli [WIP]

keywords-cli is a TypeScript CLI for phrase research. You can use it for keywords, niche ideas, product ideas, customer-support topics, app-store terms, feature requests, research themes, or any phrase list with a positive metric and a friction metric.

Install and Run

From this folder during development:

npm install
npm run build
npm link
keywords-cli --help

After publishing to npm:

npx keywords-cli analyze keywords.csv --value-column "Search Volume" --friction-column "Ranking Difficulty"
npm i -g keywords-cli
keywords-cli analyze ideas.csv --text-column idea --value-column impact --friction-column effort

The package exposes the keywords-cli binary.

Commands

keywords-cli analyze <input>
keywords-cli extract <input>
keywords-cli cluster <input>
keywords-cli questions <input>
keywords-cli gap --mine mine.txt --competitor competitor.txt
keywords-cli train <input> --model model.json
keywords-cli predict <input> --model model.json
keywords-cli brief "topic" --related "phrase one,phrase two"
keywords-cli discover "broad domain" --ai

Inputs can be CSV, TSV, JSON, TXT, stdin (-), or raw newline-separated text. For structured files, the CLI auto-detects common phrase columns such as Keyword, query, term, idea, niche, title, and text. You can override this with --text-column.

Opportunity Scoring

The base opportunity target follows the original value/friction shape: normalize the positive metric, divide by normalized friction with a small epsilon, then add light text signals for specificity and intent:

keywords-cli analyze keywords.csv \
  --value-column "Search Volume" \
  --friction-column "Ranking Difficulty"

For non-SEO workflows, use your own metric names:

keywords-cli analyze product-ideas.csv \
  --text-column idea \
  --value-column impact \
  --friction-column effort

The model treats the value column as higher-is-better and the friction column as lower-is-better. If one or both columns are missing, it falls back to text-only proxy signals such as specificity, intent, and broadness.

Embeddings + LGBM Model

Train an embedding-backed LGBM-style boosted-tree model and use it against new phrase lists:

keywords-cli train historical-keywords.csv \
  --value-column "Search Volume" \
  --friction-column "Ranking Difficulty" \
  --embedding-provider openai \
  --model opportunity-model.json

keywords-cli predict new-keywords.txt --model opportunity-model.json

Use --embedding-provider openai with OPENAI_API_KEY for direct OpenAI embeddings. The offline default is --embedding-provider local, which creates deterministic local embeddings for tests and no-key workflows while keeping the saved model shape as embeddings plus LGBM-style trees.

AI-Assisted Commands

brief and discover are deterministic by default. Add --ai and set OPENAI_API_KEY to call OpenAI Chat Completions directly:

export OPENAI_API_KEY="..."
keywords-cli brief "ai coloring book prompts" --ai
keywords-cli discover "sustainable living products" --ai --count 20

No API key is saved by the CLI.

Output Formats

Most commands support:

--format table
--format json
--format csv
--format markdown
--out results.json