- Stability Score — new composite 0–100 metric combining p95 latency (30%), jitter/σ (30%), spike rate (20%), and uptime (20%). Displayed as a color-coded column in the TUI (green ≥80, cyan ≥60, yellow ≥40, red <40).
- p95 latency (
getP95) — 95th percentile latency from successful pings. Answers "95% of requests are faster than X ms." - Jitter (
getJitter) — standard deviation of latency. Low jitter = predictable, high jitter = erratic/spiky. - "Spiky" verdict — new verdict that catches models with good average latency but terrible tail latency (p95 spikes). A model with avg 250ms but p95 6000ms now gets flagged as "Spiky 📈" instead of "Perfect 🚀".
- Stability sorting — press
Bto sort by stability score. Most stable models rise to the top.Bkey now listed in the footer bar sort keys. - 24 new unit tests covering p95, jitter, stability score, Spiky verdict, and stability sorting.
- README: TUI Columns reference table — full 12-column table documenting every column (Rank, Tier, SWE%, Model, Origin, Latest, Avg, Health, Verdict, Stability, Context, Up%).
- README: Stability Score section — documents the formula, weights, color thresholds, and an example calculation.
- README: Verdict values table — lists all 7 verdict categories with their emoji, meaning, and criteria.
- "Stab" column renamed to "Stability" — column header widened from 6 to 11 characters; header text now reads
StaBilitywith theBsort-key letter in uppercase bold yellow. - SWE% column: 8-band color gradient — replaced the old 3-band color scheme (green ≥50, yellow ≥30, dim otherwise) with an 8-band gradient matching
TIER_COLOR: ≥70% bright neon green, ≥60% green, ≥50% yellow-green, ≥40% yellow, ≥35% amber, ≥30% orange-red, ≥20% red, <20% dark red. getVerdict()is now stability-aware: models in "Perfect" or "Normal" avg range get downgraded to "Spiky" when p95 shows extreme tail latency (requires ≥3 pings to avoid false positives).findBestModel()now uses a 4-key sort: status → avg latency → stability score → uptime (was 3-key: status → avg → uptime).sortResults()supports new'stability'column.VERDICT_ORDERupdated to include "Spiky" between "Slow" and "Very Slow".- README: keyboard shortcuts updated to include
Bfor Stability sort; "How it works" diagram updated. - Default ping interval → 3 seconds (was 2s) for a calmer default pace; still adjustable with W/X keys.
- Verdict colors unified with TIER_COLOR gradient — Perfect (cyan-green) → Normal (lime) → Spiky (yellow-green) → Slow (orange) → Very Slow (red-orange) → Overloaded (red) → Unstable (dark red) → Unusable (darkest red). Best→worst ordering in code.
- Footer cleanup — Removed the BETA TUI warning line. Renamed "Join our Discord" to just "Discord" and placed it next to Contributors on the "Made with love" line.
- Footer link colors — Star on GitHub: yellow, Contributors: orange, Discord: light purple. Ctrl+C Exit moved to end of "Made with love" line.
- Discord plain URL — Shows
Discord → https://discord.gg/5MbTnDC3Mdso terminals without OSC 8 link support can still see the URL. - K Help styling — Changed from green background badge to neon green text (
rgb(0,255,80)) with no background. - Z Mode styling — Red-orange color (
rgb(255,100,50)) matching OpenClaw branding. - Selection row styling — Darker backgrounds: favorite rows
bgRgb(35,20,0), cursor rowsbgRgb(50,0,60). Model name and Origin rendered in white bold when selected. - README — Updated all ping interval references from 2s to 3s; removed BETA warning line.
- Column alignment: Health/Status emoji width — Health column used
.padEnd()which miscounted emoji width (✅, 🔥, ⏳ etc. are 2 terminal columns but counted as fewer). Switched topadEndDisplay()so Verdict, Stability, and Up% columns now align correctly. - Verdict emojis moved to end of text — emojis now appear after the word (e.g.,
Perfect 🚀instead of🚀 Perfect) for cleaner left-alignment. - Empty cell placeholders — changed from single
—to———in Latest Ping, Avg Ping, and Stability columns so empty cells have more visual weight and don't look like blank space.
- Added 4 new providers: SiliconFlow, Together AI, Cloudflare Workers AI, and Perplexity API.
- Added 23 provider models across these new integrations (OpenAI-compatible endpoints + settings onboarding metadata).
- Added Cloudflare-specific setup guidance in Settings, including explicit
CLOUDFLARE_ACCOUNT_IDrequirement.
- Extended provider/env support in config and runtime (
SILICONFLOW_API_KEY,TOGETHER_API_KEY,CLOUDFLARE_API_TOKEN/CLOUDFLARE_API_KEY,PERPLEXITY_API_KEY/PPLX_API_KEY). - Extended OpenCode Desktop provider auto-configuration for SiliconFlow, Together AI, Cloudflare Workers AI, and Perplexity API.
- Updated README to reflect current provider/model totals (17 providers / 134 models) and expanded key setup + env variable documentation.
- Updated
P(Settings) andK(Help) overlays with dedicated dark background panels (distinct from the main table) for clearer visual separation.
- Fixed model list scrolling and favorite toggle UX regression introduced after
0.1.65(cursor/scroll stability when unpinning favorites, last rows reachable). - Fixed overlay usability on small terminals:
K(Help) andP(Settings) now use viewport scrolling so all content and top rows remain reachable. - Fixed main table keyboard navigation to wrap around: pressing Up on the first row jumps to the last row, and pressing Down on the last row jumps to the first row.
- Added persistent model favorites with
Fkey toggle, star marker in Model column, dark-orange favorite highlighting, and pinned-at-top behavior. - Added manual update maintenance flow in Settings (
P): check npm updates on demand and install directly from the settings screen. - Expanded
Khelp overlay with complete keybindings (main TUI + settings) and CLI flags usage examples.
- Favorites now remain visible and pinned regardless of active sort or tier/origin filters.
- Extended config schema (
~/.free-coding-models.json) with a persistedfavoritesarray (providerKey/modelIdentries). - Updated README documentation for favorites, manual updates, settings shortcuts, and config structure.
- Added 4 new free providers: Hugging Face Inference, Replicate, DeepInfra, and Fireworks AI (models, key handling, healthchecks, Settings integration).
- Added richer Settings (
P) provider rows with inline rate-limit summary and live API key test status.
- OpenCode launch now detects
tmuxand auto-injects--port(OPENCODE_PORTif free, otherwise first available4096-5095) so sub-agent panes work reliably. - Updated OpenRouter free model set to include
qwen/qwen3-coder:480b-free,mistralai/devstral-2-free, andmimo-v2-flash-free. - Added SambaNova
Llama3-Groqcoding-tuned entry. - Updated setup/config docs and env var support for new providers (
HUGGINGFACE_API_KEY/HF_TOKEN,REPLICATE_API_TOKEN,DEEPINFRA_API_KEY/DEEPINFRA_TOKEN). - Replicate pings now use
/v1/predictionsrequest format; OpenCode launch for Replicate is guarded with a clear monitor-only message. - Settings bottom panel now shows provider onboarding steps (signup URL + key creation/test flow) instead of model list details.
- Documented in
AGENTS.mdthat top changelog entries must stay clean for direct reuse in GitHub Release notes.
- Settings/onboarding disabled state now uses an explicit red cross (
❌) instead of a gray square glyph for better terminal font compatibility.
- Replaced webhook telemetry with PostHog capture API (
/i/v0/e/) and kept explicit consent +--no-telemetryopt-out. - Added persistent anonymous telemetry identity in config (
telemetry.anonymousId) for stable anonymous usage counts. - Added telemetry consent screen UX: custom ASCII onboarding, explicit privacy messaging, and “Accept & Continue” default action.
- Added telemetry toggle in Settings (
P) and documented env controls:FREE_CODING_MODELS_TELEMETRY,FREE_CODING_MODELS_POSTHOG_KEY,FREE_CODING_MODELS_POSTHOG_HOST. - Added telemetry metadata fields:
app_version,system(macOS/Windows/Linux), andterminal(Terminal.app/iTerm2/kitty/etc. with fallback). - Added telemetry debug mode with
FREE_CODING_MODELS_TELEMETRY_DEBUG=1(stderr traces for sent/skip/error states). - Hardened telemetry safety behavior: analytics failures stay non-blocking and non-TTY runs no longer overwrite stored consent.
- Fixed consent renderer to avoid full-screen clear side effects and preserve header visibility across terminals.
- Updated TUI footer contributors link to point to the repository contributors graph.
- "Made with" line is now pink: the entire "Made with 💖 & ☕ by vava-nessa" sentence is now rendered in soft pink (
chalk.rgb(255,150,200)) including the clickable author name link, making it visually distinct from the rest of the footer K Helpbadge is now ultra-visible: changed from plain green background to bright green (bgGreenBright) with black bold text — high contrast, stands out immediately at a glance in the footer hint linePkey closes Settings: pressingPagain while inside the Settings screen now closes it (same behavior asEsc). Previously onlyEscworked. Both keys now trigger the same close + provider rebuild logic
- Discord URL now shown in plain text: after the clickable "Join our Discord" hyperlink, the raw URL
https://discord.gg/5MbTnDC3Mdis now printed in cyan, separated by→. This helps users on terminals that don't support OSC 8 clickable links to still see and copy-paste the URL.
K Helpbadge in footer is now bright green: previously plain text, now rendered aschalk.bgGreen.black.bold(' K Help ')so it's immediately visible in the footer hint line
- Timeout emoji updated: replaced
⏱with⏳everywhere in the TUI (ping timeout display)
- Discord link text shortened: "Join our Discord" replaces the longer previous label — cleaner footer, same clickable OSC 8 hyperlink
- Footer cleaned up and restructured: removed duplicate/messy lines left by the 0.1.54 agent; consolidated into two clean footer lines:
- Line 1:
Made with 💖 & ☕ by vava-nessa • ⭐ Star on GitHub(clickable links) - Line 2:
💬 Join our Discord • ⚠ BETA TUI — might crash or have problems
- Line 1:
- BETA warning added to TUI footer:
⚠ BETA TUIbadge in yellow with a plain-text disclaimer, always visible at the bottom of the TUI app - Discord invite in TUI footer: clickable OSC 8 hyperlink added directly in the footer (was only in README before)
- README updated for 9 providers / 101 models: badges, provider list, Support section, and Requirements section all updated to reflect the new state after 0.1.54
- Discord header block reformatted: replaced the join banner with a plain
💬 Let's talk about the project on Discordlink - BETA warning added to README: inline
⚠️ free-coding-models is a BETA TUI — expect rough edges and occasional crashesadded to the docs link line in the Support section
5 new providers (9 total, 101 models):
- OpenRouter — 8 free coding models via the
:freequota tier (20 req/min, 50 req/day shared). Includes Qwen3 Coder, Step 3.5 Flash, DeepSeek R1 0528, GPT OSS 120B/20B, Nemotron Nano 30B, Llama 3.3 70B. Key prefix:sk-or- - Mistral Codestral — dedicated coding endpoint (
codestral.mistral.ai),codestral-latestmodel, 30 req/min / 2 000 req/day. Separate API key from the main Mistral platform. Key prefix:csk- - Hyperbolic — $1 free trial credits. 10 models: Qwen3 Coder 480B, DeepSeek R1 0528, Kimi K2, GPT OSS 120B, Qwen3 235B, Qwen3 80B Instruct, DeepSeek V3 0324, Qwen2.5 Coder 32B, Llama 3.3 70B, Llama 3.1 405B. Key prefix:
eyJ - Scaleway — 1 million free tokens. 7 models: Devstral 2 123B, Qwen3 235B, GPT OSS 120B, Qwen3 Coder 30B, Llama 3.3 70B, R1 Distill 70B, Mistral Small 3.2. Key prefix:
scw- - Google AI Studio — free Gemma 3 models (14 400 req/day, 30 req/min). Gemma 3 27B / 12B / 4B via the OpenAI-compatible
generativelanguage.googleapis.com/v1beta/openaiendpoint. Key prefix:AIza
New models in existing providers:
- Groq: GPT OSS 120B (
openai/gpt-oss-120b), GPT OSS 20B (openai/gpt-oss-20b), Qwen3 32B (qwen/qwen3-32b) - Cerebras: GLM 4.6 (
glm-4.6) from Z.ai — 10 req/min, 100 req/day - SambaNova: DeepSeek V3.1 Terminus (
deepseek-ai/DeepSeek-V3.1-Terminus, S tier 68.4%)
Nkey — Origin/provider filter: cycles through All → NIM → Groq → Cerebras → SambaNova → OpenRouter → Codestral → Hyperbolic → Scaleway → Google AI → All, mirroring howTcycles tiers. The active provider is shown as a badge in the header. The Origin column header now readsOrigin(N)and highlights in blue when a filter is active.Ckey — Sort by context window: the context-window sort was previously onN; moved toC(mnemonic: Context) to free upNfor the origin filter.Kkey — Help overlay: pressK(orEsc) to open/close a full keyboard shortcut reference listing every key and what it does, rendered in the alt-screen buffer without leaving the TUI.Esccloses help and settings: pressing Escape now dismisses both theKhelp overlay and thePsettings screen. The help overlay intercepts Esc before the settings handler so there is no key conflict.
- Provider count badge updated: 4 → 9 providers
- Model count badge updated: 67 → 101 models
- Requirements section lists all 9 providers with their signup URLs
- Discord header block replaced with a plain
💬 Let's talk about the project on Discordlink - Support section reformatted: GitHub issues link + Discord link on separate lines + docs link with inline BETA warning (
⚠️ free-coding-models is a BETA TUI — expect rough edges and occasional crashes) - Footer hint line updated:
T Tier • N Origin • … Creplaces oldNin sort hint;K Helpadded
sources.js: 5 new named exports;sourcesobject extended to 9 entries;@exportsJSDoc updatedlib/config.js:ENV_VARSextended withopenrouter,codestral,hyperbolic,scaleway,googleai; JSDoc config structure comment updatedbin/free-coding-models.js: first-run wizard extended to 9 providers;ENV_VAR_NAMESextended; OpenCode/OpenCode-Desktop provider blocks added for all 5 new providers (all use@ai-sdk/openai-compatible+ baseURL);ORIGIN_CYCLE+originFilterModestate;renderTablesignature gainsoriginFilterModeparameter;renderHelp()function added; allrenderTablecall sites updated
- SambaNova Cloud as a new provider ($5 free trial, 3 months). 10 coding models: Qwen3 235B, DeepSeek R1 0528, DeepSeek V3.1, DeepSeek V3 0324, Llama 4 Maverick, GPT OSS 120B, Qwen3 32B, R1 Distill 70B, Llama 3.3 70B, Llama 3.1 8B. OpenAI-compatible endpoint at
api.sambanova.ai. Key prefix:sn- - Cerebras: Qwen3 235B (
qwen-3-235b-a22b), GPT OSS 120B (gpt-oss-120b), Llama 3.1 8B (llama3.1-8b) - Groq: Llama 3.1 8B (
llama-3.1-8b-instant, 14 400 req/day) - Full OpenCode + OpenCode Desktop integration for SambaNova (
@ai-sdk/openai-compatibleprovider block injected automatically on model select) - SambaNova added to first-run API key wizard and Settings screen (
Pkey)
- OpenCode model handoff (PR #14 by @whit3rabbit): API keys from
~/.free-coding-models.jsonwere not passed to the OpenCode child process, causing silent fallback to the previous model. Also fixes Groq model ID mismatches (e.g.kimi-k2-instruct→kimi-k2-instruct-0905) via a newOPENCODE_MODEL_MAP - OpenClaw nvidia provider missing models array (PR #13 by @whit3rabbit):
startOpenClaw()created the nvidia provider block without amodelsproperty, causing Zod schema validation to reject the config
- Discord link in TUI footer: the invite URL is now displayed in plain text on a separate line so it's visible and copiable on terminals that don't support clickable links
- Groq/Cerebras models selected for OpenCode had no provider block: even with the correct
groq/model-idprefix, OpenCode couldn't use the model because noprovider.groqblock existed inopencode.json— now automatically creates the provider block (Groq: built-in withapiKey: {env:GROQ_API_KEY}; Cerebras:@ai-sdk/openai-compatiblewith baseURL) and registers the model inprovider.<key>.models
- Groq/Cerebras models selected for OpenCode were launched as NVIDIA models:
providerKeywas not passed inuserSelectedon Enter, causing all models to be prefixed withnvidia/regardless of their actual provider — now correctly usesgroq/model-idandcerebras/model-id startOpenCodeandstartOpenCodeDesktop: both functions now handle all 3 providers; Groq and Cerebras use OpenCode's built-in provider support (no custom config block needed, justGROQ_API_KEY/CEREBRAS_API_KEYenv vars); NVIDIA retains its existing custom provider config flow
- Cerebras / Groq without API key: models were being pinged with the fallback NVIDIA key, causing misleading
❌ 401— now pings without auth header; 401 is treated as🔑 NO KEY(server reachable, latency shown dimly) - Settings: entering an API key had no immediate effect: after saving a key and closing Settings (Escape), models previously in
noauthstate are now immediately re-pinged with the new key
- Ping without API key is now always attempted — a 401 response confirms the server is UP and shows real latency;
🔑 NO KEYreplaces the old❌ 401misleading error
--tierCLI flag:parseArgs()was never called inmain(), so--tier Swas silently ignored — now wired in and applied on TUI startup (thanks @whit3rabbit, PR #11)--tiervalue leaking intoapiKey:parseArgs()for-loop was capturing the tier value as the API key — fixed by skipping the value arg after--tier- Ctrl+C not exiting: sort key handler was intercepting all single-letter keypresses including ctrl-modified ones — added
!key.ctrlguard so Ctrl+C reaches the exit handler (PR #11)
- Test verifying
--tiervalue does not leak intoapiKey(63 tests total)
--tierCLI flag:parseArgs()was never called inmain(), so--tier Swas silently ignored — now wired in and applied on TUI startup (thanks @whit3rabbit, PR #11)--tiervalue leaking intoapiKey:parseArgs()for-loop was capturing the tier value as the API key — fixed by skipping the value arg after--tier- Ctrl+C not exiting: sort key handler was intercepting all single-letter keypresses including ctrl-modified ones — added
!key.ctrlguard so Ctrl+C reaches the exit handler (PR #11)
- Test verifying
--tiervalue does not leak intoapiKey(63 tests total)
- Discord notification: Fixed ECONNRESET error — drain response body with
res.resume()and callprocess.exit(0)immediately after success so the Node process closes cleanly
- Discord link: Updated invite URL to
https://discord.gg/5MbTnDC3Mdeverywhere (README, TUI footer)
- Discord notification: Fixed GitHub Actions workflow crash (secrets context not allowed in step
ifconditions — now handled in the Node script directly)
- Multi-provider support — Groq (6 models) and Cerebras (3 models) added alongside NVIDIA NIM, for 53 total models
- Multi-provider first-run wizard — Steps through all 3 providers (NIM, Groq, Cerebras) on first launch; each is optional, Enter to skip; requires at least one key
- Settings screen (
Pkey) — New TUI overlay to manage API keys per provider, toggle providers on/off, and test keys with a live ping lib/config.js— New JSON config system (~/.free-coding-models.json) replacing the old plain-text file- Auto-migrates old
~/.free-coding-models(plain nvidia key) on first run - Stores keys per provider + per-provider enabled/disabled state
NVIDIA_API_KEY,GROQ_API_KEY,CEREBRAS_API_KEYenv vars override config
- Auto-migrates old
- Per-provider ping URLs —
ping()now accepts explicit endpoint URL; each provider has its own API endpoint insources.js - Provider name in Origin column — Shows
NIM/Groq/Cerebrasinstead of alwaysNIM
MODELSflat array now includesproviderKeyas 6th element- State init filters models from disabled providers; rebuilds on settings close
- Config file path changed from
~/.free-coding-modelsto~/.free-coding-models.json(migration is automatic)
- sources.js data audit — verified and corrected SWE-bench scores, tiers, and context windows across all NIM models:
- Devstral 2 123B:
S, 62.0%, 128k→S+, 72.2%, 256k(official Mistral announcement) - Mistral Large 675B: ctx
128k→256k - QwQ 32B: ctx
32k→131k - Llama 4 Maverick: ctx
128k→1M(NVIDIA NIM confirmed) - Llama 4 Scout: ctx
128k→10M(NVIDIA NIM confirmed) - GPT OSS 20B: ctx
32k→128k
- Devstral 2 123B:
- Cross-platform OpenCode integration: Fixed OpenCode CLI and Desktop installation issues on Windows and Linux
- Windows: Fixed config path to use %APPDATA%\opencode\opencode.json with fallback to ~/.config
- Linux: Added support for snap, flatpak, and xdg-open to launch OpenCode Desktop
- All platforms: Properly detects OS and uses correct commands and paths
- OpenCode Desktop: Platform-specific launch commands (macOS:
open -a, Windows:start, Linux: multiple methods)
- Auto-update with sudo fallback: When npm update fails due to permissions, automatically retries with sudo to complete the update
- SWE-bench Verified column: Shows real SWE-bench Verified scores for all 44 models from official benchmarks
- Color-coded keyboard shortcuts: First letter of each column header colored in yellow to indicate sorting key
- Heart and Coffee in footer: "Made with 💖 & ☕ by vava-nessa"
- Column organization: Reordered columns for better logical flow: Rank / Tier / SWE% / Model / Origin / Latest Ping / Avg Ping / Health / Verdict / Up%
- Health column: Renamed from "Status" to "Health" with H key for sorting
- SWE-bench sorting: S key now sorts by SWE-bench score
- Latest ping shortcut: L key (instead of P) for sorting by latest ping
- Source name: Simplified "NVIDIA NIM" to "NIM"
- Column header alignment: Fixed misalignment caused by ANSI color codes in headers
- Discord link: Updated to permanent invite link https://discord.gg/WKA3TwYVuZ
- Column reorganization: Reordered columns for better logical flow: Rank / Tier / SWE% / Model / Origin / Latest Ping / Avg Ping / Health / Verdict / Up%
- Condition renamed to Health: Renamed "Condition" column to "Health" for better clarity
- Keyboard shortcut update: H key now sorts by Health (instead of C for Condition)
- Column header alignment: Fixed column headers misalignment issue caused by ANSI color codes interfering with text padding
- Column header improvements: Fixed column alignment issues for better visual appearance
- Status renamed to Condition: "Status" column renamed to "Condition" for clarity
- Keyboard shortcut updates: S key now sorts by SWE-bench score, C key sorts by Condition
- Footer Discord text update: Changed "Join our Discord!" to "Join Free-Coding-Models Discord!"
- SWE-bench column: Added new SWE-bench Verified score column showing coding performance for each model
- Color-coded column headers: First letter of each column header is now colored (yellow) to indicate keyboard shortcut for sorting
- Keyboard shortcut improvements: Changed P to L for latest ping sorting, added E for SWE-bench sorting
- Source name simplification: Renamed "NVIDIA NIM" to "NIM" throughout the codebase
- Enhanced footer Discord link: Discord link now displays in bright cyan color with "(link fixed)" indicator
- Discord link correction: Updated all Discord invite URLs to use permanent link https://discord.gg/WKA3TwYVuZ
- Footer emojis: Added 💬 emoji before Discord link and ⭐ emoji before GitHub link for better visual appeal
- Footer redesign: All links now on one line with clickable text: "Join our Discord!" and "Read the docs on GitHub"
- Improved UX: Links use same clickable format as author name for consistent user experience
- Footer improvements: Replaced "Repository GitHub" with "GitHub", "love" with 💖 emoji, and simplified Discord text
- README enhancement: Added GitHub link section below Discord invite
- Discord community link: Added Discord invite to README and TUI footer
- Enhanced footer layout: Improved footer with multi-line layout showing GitHub repo and Discord links
- Clickable author name: "vava-nessa" is now clickable in terminal (opens GitHub profile)
- Release notes automation: GitHub Actions now uses CHANGELOG.md content for release notes instead of auto-generated notes
- Tier filtering system: Replaced E/D keys with T key that cycles through tier filters: all → S+/S → A+/A/A- → B+/B → C → all
- Footer text: "Made with love by vava-nessa" with clickable links
- Release workflow: GitHub Releases now display proper changelog content instead of generic commit summaries
- Viewport scrolling for TUI overflow: Fixed Ghostty and narrow terminal issues where content would scroll past alternate screen
- Terminal wrapping: Wide rows now clip at terminal edge instead of wrapping to next line
- Scrollback pollution: Replaced
\x1b[2Jwith\x1b[H+ per-line\x1b[Kto avoid Ghostty scrollback issues - Viewport calculation: Added smart scrolling with "N more above/below" indicators when models exceed screen height
- Scroll offset adjustment: Cursor stays within visible window during navigation and terminal resize
- DECAWM off: Disabled auto-wrap in alternate screen to prevent row height doubling
- Terminal resize handling: Viewport automatically adjusts when terminal size changes
- Removed startup menu: No more blocking mode selection menu at startup
- Default to OpenCode CLI: App starts directly in CLI mode when no flags given
- Mode toggle in TUI: Added Z key to cycle between CLI → Desktop → OpenClaw → CLI
- GitHub changelogs: "Read Changelogs" option now opens GitHub URL instead of local file
- Auto-update by default: When new version available without flags, auto-updates and relaunches
- Centered update menu: Update notification appears only when needed, with clean centered layout
- Header display: Shows
[💻 CLI] (Z to toggle)with mode toggle hint - Footer instructions: Added "M Mode" to key bindings
- Update workflow: Flags (
--opencodeetc.) still show update menu for compatibility
- Local changelogs: "Read Changelogs" menu option now opens local
CHANGELOG.mdfile instead of GitHub releases
- Simplified tier filtering architecture: Replaced complex object recreation with simple
hiddenflag system - Flags as shortcuts:
--tier Snow just sets initial state instead of blocking dynamic filtering - Dynamic filtering preserved: E/D keys work seamlessly even when starting with
--tierflag
- Ping loop bug: Fixed issue where filtered models weren't pinged due to using wrong results array
- Initial ping bug: Fixed issue where initial ping used wrong results array
- Dynamic tier filtering: Use E/D keys to filter models by tier during runtime
- Tier filter badge shown in header (e.g.,
[Tier S]) - E key elevates filter (show fewer, higher-tier models)
- D key descends filter (show more, lower-tier models)
- Preserves ping history when changing filters
- Error 401 with --tier flag: Fixed issue where using
--tieralone would show selection menu instead of proceeding directly to TUI - Improved flag combination handling for better user experience
- OpenCode Desktop support: new
--opencode-desktopflag and menu option to set model & open the Desktop app - "Read Changelogs" menu option when an update is available (opens GitHub releases page)
startOpenCodeDesktop()function — same config logic as CLI, launches viaopen -a OpenCode
- Startup menu: "OpenCode" renamed to "OpenCode CLI", new "OpenCode Desktop" entry added
- TUI mode badge: shows
[💻 CLI]or[🖥 Desktop]or[🦞 OpenClaw] - Footer action hint adapts to desktop mode (
Enter→OpenDesktop)
- Unit test suite: 59 tests across 11 suites using
node:test(zero dependencies) - Tests cover: sources data integrity, core logic (getAvg, getVerdict, getUptime, filterByTier, sortResults, findBestModel), CLI arg parsing, package.json sanity
lib/utils.js: extracted pure logic functions from the monolithic CLI for testabilitypnpm testscript in package.json
- GitHub Actions release workflow: removed broken
npm version patchloop, added version detection via git tags - GitHub Actions now creates a GitHub Release with auto-generated notes for each new version
- AGENTS.md updated with test-first workflow: agents must run
pnpm testbeforepnpm start
- OpenCode spawn ENOENT: Use
shell: truewhen spawningopencodeso the command resolves correctly on Windows (.cmd/.batwrappers). Added friendly error message whenopencodeis not installed.
- Update available warning: red message shown above selection menu when a new npm version exists
- "Update now" menu choice in startup mode selection to install the latest version
- OpenClaw config structure:
providerswas incorrectly written at the config root. Moved tomodels.providersper official OpenClaw docs (docs.openclaw.ai/providers/nvidia). - OpenClaw API key storage: Removed
apiKeyfrom provider block (not a recognized field). API key is now stored underenv.NVIDIA_API_KEYin the config. - OpenClaw models array: Removed the
models: []array from the provider block (OpenCode format, not valid in OpenClaw). openclaw restartCLI command doesn't exist: Replaced hint with correct commands —openclaw models set/openclaw configure. Gateway auto-reloads on config file changes.- OpenClaw model not allowed: Model must be explicitly listed in
agents.defaults.modelsallowlist — without this, OpenClaw rejects the model with "not allowed" even when set as primary. - README: Updated OpenClaw integration section with correct JSON structure and correct CLI commands.
- OpenClaw integration: set selected NIM model as default provider in
~/.openclaw/openclaw.json - Startup mode menu (no flags needed): interactive choice between OpenCode and OpenClaw at launch
--openclawflag: skip menu, go straight to OpenClaw mode--tierflag: filter models by tier letter (S, A, B, C)- Tier badges shown next to model names in the TUI
- 44 models listed, ranked by Aider Polyglot benchmark
- CI permissions for git push in release workflow
--fiableflag: analyze 10 seconds, output the single most reliable model asprovider/model_id--bestflag: show only top-tier models (A+, S, S+)--opencodeflag: explicit OpenCode mode- Refactored CLI entry point, cleaner flag handling
- Updated release workflow
- Continuous monitoring mode: re-pings all models every 2 seconds forever
- Rolling averages calculated from all successful pings since start
- Uptime percentage tracking per model
- Dynamic ping interval: W key to speed up, X key to slow down
- Sortable columns: R/T/O/M/P/A/S/V/U keys
- Verdict column with quality rating per model
- Interactive model selection with arrow keys + Enter
- OpenCode integration: auto-detects NIM setup, sets model as default, launches OpenCode
sources.js: extensible architecture for adding new providers- Demo GIF added to README
- Renamed CLI to
free-coding-models
- Initial release as
nimpingthen renamed tofree-coding-models - Parallel pings of NVIDIA NIM coding models via native
fetch - Real-time terminal table with latency display
- Alternate screen buffer (no scrollback pollution)
- Top 3 fastest models highlighted with medals 🥇🥈🥉
- ASCII banner and clean UI
- OpenCode installer and interactive model selector
- npm publish workflow via GitHub Actions