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

@bytonylee/free-router

v1.2.1

Published

Free model router — discover, ping, and configure free AI models for OpenCode / OpenClaw

Readme

English | 한국어

Version License: MIT License npm downloads CI

Free model router CLI - discover, ping, and configure free AI models for OpenCode / OpenClaw.

free-router-gif

Install

npx @bytonylee/free-router
# or
npm i -g @bytonylee/free-router
# or
bunx @bytonylee/free-router
# or
bun install -g @bytonylee/free-router

Run

free-router

On first run, a setup wizard prompts for API keys (ESC to skip any provider).

If you accept the in-app update prompt (Y), free-router now updates globally and restarts automatically, so you can continue without running free-router again.

Ways to use free-router

  1. First-run onboarding wizard Launch free-router, open provider websites in-browser from the wizard, paste keys, and start.
  2. Interactive model search + launch Use / to filter models, then Enter to update OpenCode config and open opencode.
  3. Quick API key rescue from main screen Press A (or R for expired/missing provider) to jump into key editing with auto browser opening for missing keys.
  4. Full settings workflow Press P to edit keys, toggle providers, run live key tests, and onboard missing keys provider-by-provider.
  5. Non-interactive best-model selection Run free-router --best to print the best responding model ID for scripts.

Providers

| Provider | Free key | | -------------- | ------------------------------------------------------------------------------------ | | NVIDIA NIM | build.nvidia.com - prefix nvapi- | | OpenRouter | openrouter.ai/settings/keys - prefix sk-or- |

API key priority: environment variable → ~/.free-router.json → keyless ping (latency still shown).

NVIDIA_API_KEY=nvapi-xxx free-router
OPENROUTER_API_KEY=sk-or-xxx free-router

# Optional: pause auto re-sorting while you scroll (milliseconds)
FREE_ROUTER_SCROLL_SORT_PAUSE_MS=2500 free-router

# Optional: disable rolling metrics cache and force legacy recompute path
FREE_ROUTER_METRICS_CACHE=0 free-router

TUI

The interactive TUI pings all models in parallel every 2 seconds and shows live latency, uptime, and verdict. The selected row uses a stable marker, and redraws are deferred while the terminal is unfocused to avoid background-tab blinking.

Columns

| Column | Description | | ---------- | -------------------------------------------------------------- | | # | Rank | | Tier | Capability tier derived from SWE-bench score (S+ → C) | | Provider | NIM or OpenRouter | | Model | Display name | | Ctx | Context window size | | AA | Arena Elo / intelligence score | | Avg | Rolling average latency (HTTP 200 only) | | Lat | Latest measured ping latency | | Up% | Uptime percentage this session | | Verdict | Condition summary (✓ Perfect / ✓ Normal / x Overloaded / …) |

Default ranking: availability first, then higher tier first (S+ → S → A+ …), then lower latency.

Search bar provider badges:

  • Name:✓ key exists and looks healthy
  • Name:✗ provider appears expired/no-auth
  • Name:○ key missing

The ? help overlay and A API-key editor use the same terminal header/footer chrome as the main list. Their mode tags stay left-aligned, and help body text uses the same foreground color as the table rows.

Keyboard shortcuts

Navigation

| Key | Action | | --------------- | -------------- | | / k | Move up | | / j | Move down | | PgUp / PgDn | Page up / down | | g | Jump to top | | G | Jump to bottom |

Actions

| Key | Action | | -------------- | ---------------------------------------------------------- | | Enter | Save config + open current model in opencode | | / | Search / filter models (Enter in search = open opencode) | | A | Quick API key add/change (opens key editor in Settings) | | R | Edit API key for likely expired/missing provider | | T | Cycle tier filter: All → S+ → S → A+ → … | | P | Settings screen (edit keys, toggle providers, test) | | W / X | Faster / slower ping interval | | ? | Help overlay | | q / Ctrl+C | Quit |

Sort (press to sort, press again to reverse)

| Key | Column | | --- | ------------------ | | 0 | Priority (default) | | 1 | Tier | | 2 | Provider | | 3 | Model name | | 4 | Avg latency | | 5 | Latest ping | | 6 | Uptime % | | 7 | Context window | | 8 | Verdict | | 9 | AA Intelligence |

OpenCode handoff

Pressing Enter on a model writes the OpenCode config and immediately opens opencode.

If OpenCode fallback remaps the provider (for example NIM Stepfun → OpenRouter) and the effective provider key is missing, free-router asks: Add API key now? (Y/n, default: Y).

If model metadata says the selected model is unsupported by the known target support list, free-router falls back to NVIDIA NIM deepseek-ai/deepseek-v4-pro as the default high-performance model.

Configs written:

  • OpenCode CLI~/.config/opencode/opencode.json
  • OpenClaw~/.openclaw/openclaw.json

Existing configs are backed up before writing.

When free-router launches OpenCode, it now sets OPENCODE_CLI_RUN_MODE=true by default (unless you already set it) to reduce startup log noise from plugin auto-update checks in the OpenCode TUI.

If you want OpenCode's default startup hook behavior instead, launch free-router with:

OPENCODE_CLI_RUN_MODE=false free-router

Settings screen (P)

Tip: press A from the main list to jump directly into API key editing. Tip: if a selected provider has no key, free-router auto-opens that provider key page in browser (once per provider per settings session), including when you move selection.

| Key | Action | | --------------------- | ---------------------------------- | | / / j / k | Navigate providers | | Enter | Edit API key inline | | Space | Toggle provider enabled / disabled | | T | Fire a live test ping | | D | Delete key for this provider | | ESC | Back to main list |

Flags

| Flag | Behavior | | --------------- | ------------------------------------------------------------- | | (none) | Interactive TUI | | --best | Non-interactive: ping 4 rounds, print best model ID to stdout | | --help / -h | Show help |

--best scripted usage

# Print best model ID after ~10 s analysis
free-router --best

# Capture in a variable
MODEL=$(free-router --best)
echo "Best model: $MODEL"

Requires at least one API key to be configured. Selection tri-key sort: status=up → lowest avg latency → highest uptime.

Config

Stored at ~/.free-router.json (permissions 0600).

{
  "apiKeys": {
    "nvidia": "nvapi-xxx",
    "openrouter": "sk-or-xxx"
  },
  "providers": {
    "nvidia": { "enabled": true },
    "openrouter": { "enabled": true }
  },
  "ui": {
    "scrollSortPauseMs": 1500
  }
}

ui.scrollSortPauseMs sets how long (ms) auto re-sorting stays paused after navigation input. FREE_ROUTER_SCROLL_SORT_PAUSE_MS overrides config. Set to 0 to disable pause.

Tier scale (SWE-bench Verified)

| Tier | Score | Description | | ------ | ------ | ------------------ | | S+ | ≥ 70% | Elite frontier | | S | 60–70% | Excellent | | A+ | 50–60% | Great | | A | 40–50% | Good | | A- | 35–40% | Decent | | B+ | 30–35% | Average | | B | 20–30% | Below average | | C | < 20% | Lightweight / edge |

Verdict legend

| Verdict | Trigger | | ------------ | ------------------------- | | x Overloaded | Last HTTP code = 429 | | x Unstable | Was up, now failing | | x Not Active | Never responded | | - Pending | Waiting for first success | | ✓ Perfect | Avg < 400 ms | | ✓ Normal | Avg < 1000 ms | | x Slow | Avg < 3000 ms | | x Very Slow | Avg < 5000 ms | | x Unusable | Avg ≥ 5000 ms |

Development notes

  • TypeScript source of truth: src/
  • ESLint config is TypeScript: eslint.config.ts
  • Runtime JS output is generated only in dist/ via npm run build

License

MIT License. See LICENSE.