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

wind-tunnel-cli

v0.2.4

Published

Generate and cluster synthetic opinions from hundreds of local AI personas — a CLI for testing messages before you publish

Readme

Wind Tunnel

CI npm license

Generate and cluster synthetic opinions from hundreds of local AI personas — a CLI for testing messages before you publish.

Status: alpha (0.x). It works end to end and is tested, but commands, output and artifact schemas may still change between minor versions.

Give it a draft (an ad, a post, an announcement). Wind Tunnel shows it to a demographically grounded persona pool, generates their reactions with a local LLM, and maps the crowd Pol.is-style — opinion groups, consensus, division and the minority view — fully local via Ollama, nothing leaves your machine.

$ wt-cli run "Introducing a 4-day work week. However, salaries will be reduced by 10%."

Backlash index  ████████████████████░░░░  85 / 100  HIGH
Voices          ████████████████████████  critical 83% (5) · neutral 17% · favorable 0%

Triggers
  1. "salaries will be reduced by 10%" (High) → employees in structured,
     mission-critical, or low-margin industries

◆ Pay-First Skeptics (4)  ████████████████
  They believe that reducing pay to shorten the work week is inherently
  disrespectful and fails to address the real issues workers face.
  「I don't like it at all—cutting pay just to work fewer days is plain
  foolish. You can't expect people to do more with less…」
    — 79 · not_in_workforce · Lincoln, AR
...

What you get

  • Backlash index & voice split — how hot it runs, at a glance
  • Triggers — which wording offends which segment
  • Opinion groups — the camps that form, each with its belief and real member voices, plus a minority report on what the majority overlooks (a unanimous crowd is honestly shown as one camp)
  • Rewrites — alternatives that keep your intent but defuse the heat
  • wt-cli detail — every voice in full and the proposition × group table
  • Plain artifacts per run (JSONL / JSON / CSV) for pandas, R, or Excel

How it works

  1. Sample — N personas are drawn from the demographic pool (country / region / age / sex filters).
  2. React — each persona answers in character (fast bulk model, parallel batches), framed by the situation: an anonymous board runs hotter than real-name social media.
  3. Score — every reaction is classified as stance × unsigned intensity and the signed score is composed in code, so a small model can never mis-sign a criticism as praise.
  4. Cluster — Pol.is-style opinion-space analysis with LLM-inferred votes: propositions are extracted from the corpus, every reaction votes agree/disagree on each, and the vote matrix goes through PCA + k-means. Consensus, divisive and minority views fall out of the group × proposition agreement rates — and a silhouette check collapses to one camp rather than inventing structure in a unanimous crowd.
  5. Verdict & rewrites — the analysis model reads the aggregate stats plus a stratified sample weighted toward both extremes for the backlash index and triggers; rewrites target those triggers specifically.

Every JSON hop is constrained-decoded (schemas shipped as Ollama's format), so an 8B model cannot break the pipeline with malformed output. The full reasoning lives in docs/DESIGN.md.

Setup

Requires Node >= 20 and Ollama:

brew install ollama && brew services start ollama   # macOS (or the desktop app)
ollama pull qwen3:8b && ollama pull qwen3:14b       # role models (one-time, ~15 GB)

Prefer LM Studio? Any role can use an lmstudio: model instead — see Using LM Studio.

Quickstart

npx wind-tunnel-cli doctor              # verifies the setup, tells you exactly what's missing
npx wind-tunnel-cli personas pull usa   # streams a persona pool from Hugging Face (~30 s)
npx wind-tunnel-cli run "draft copy..."

Installed globally (npm i -g wind-tunnel-cli) the command is wt-cli. Runs are resumable (wt-cli resume <run-id>) and every option — countries, audience filters, situations, model overrides — is in the command reference.

Persona pools cover 8 countries (USA, Japan, India, Brazil, France, Korea, Vietnam, Belgium), built on NVIDIA's Nemotron-Personas datasets (CC BY 4.0); custom pools plug in via --personas-file.

Documentation

| | | | --- | --- | | Commands & configuration | every command and option, config.toml, env vars, run artifacts | | Docker | Linux + NVIDIA compose setup, image usage | | Design | architecture and the decisions behind it | | Testing | the five-layer test strategy, coverage, what deliberately isn't automated | | Releasing | maintainer release checklist |

Development

pnpm install && pnpm test && pnpm build
node packages/cli/dist/index.js doctor        # or: cd packages/cli && npm link

Ollama-dependent tests skip themselves without a daemon; building first also enables the black-box E2E of the binary. Strategy: docs/testing.md.

License

Apache-2.0. Bundled third-party licenses: THIRD_PARTY_LICENSES.md. Persona datasets are CC BY 4.0 and fetched by users directly from Hugging Face, not redistributed here.