free-coding-models 0.3.66 → 0.3.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +111 -12
  2. package/bin/free-coding-models.js +1 -9
  3. package/changelog/v0.1.1.md +3 -0
  4. package/changelog/v0.1.10.md +3 -0
  5. package/changelog/v0.1.11.md +10 -0
  6. package/changelog/v0.1.12.md +16 -0
  7. package/changelog/v0.1.13.md +3 -0
  8. package/changelog/v0.1.14.md +3 -0
  9. package/changelog/v0.1.15.md +3 -0
  10. package/changelog/v0.1.16.md +13 -0
  11. package/changelog/v0.1.17.md +3 -0
  12. package/changelog/v0.1.18.md +3 -0
  13. package/changelog/v0.1.19.md +3 -0
  14. package/changelog/v0.1.2.md +3 -0
  15. package/changelog/v0.1.20.md +14 -0
  16. package/changelog/v0.1.21.md +12 -0
  17. package/changelog/v0.1.22.md +6 -0
  18. package/changelog/v0.1.23.md +16 -0
  19. package/changelog/v0.1.24.md +9 -0
  20. package/changelog/v0.1.25.md +13 -0
  21. package/changelog/v0.1.26.md +6 -0
  22. package/changelog/v0.1.27.md +6 -0
  23. package/changelog/v0.1.28.md +5 -0
  24. package/changelog/v0.1.29.md +5 -0
  25. package/changelog/v0.1.3.md +3 -0
  26. package/changelog/v0.1.31.md +10 -0
  27. package/changelog/v0.1.32.md +8 -0
  28. package/changelog/v0.1.33.md +5 -0
  29. package/changelog/v0.1.34.md +6 -0
  30. package/changelog/v0.1.35.md +5 -0
  31. package/changelog/v0.1.36.md +16 -0
  32. package/changelog/v0.1.37.md +5 -0
  33. package/changelog/v0.1.38.md +9 -0
  34. package/changelog/v0.1.39.md +3 -0
  35. package/changelog/v0.1.4.md +3 -0
  36. package/changelog/v0.1.40.md +3 -0
  37. package/changelog/v0.1.41.md +11 -0
  38. package/changelog/v0.1.42.md +3 -0
  39. package/changelog/v0.1.43.md +3 -0
  40. package/changelog/v0.1.44.md +17 -0
  41. package/changelog/v0.1.45.md +6 -0
  42. package/changelog/v0.1.46.md +9 -0
  43. package/changelog/v0.1.47.md +6 -0
  44. package/changelog/v0.1.48.md +11 -0
  45. package/changelog/v0.1.49.md +10 -0
  46. package/changelog/v0.1.5.md +3 -0
  47. package/changelog/v0.1.50.md +7 -0
  48. package/changelog/v0.1.51.md +4 -0
  49. package/changelog/v0.1.52.md +10 -0
  50. package/changelog/v0.1.54.md +41 -0
  51. package/changelog/v0.1.55.md +3 -0
  52. package/changelog/v0.1.56.md +11 -0
  53. package/changelog/v0.1.57.md +7 -0
  54. package/changelog/v0.1.58.md +7 -0
  55. package/changelog/v0.1.59.md +7 -0
  56. package/changelog/v0.1.6.md +3 -0
  57. package/changelog/v0.1.60.md +7 -0
  58. package/changelog/v0.1.61.md +9 -0
  59. package/changelog/v0.1.62.md +9 -0
  60. package/changelog/v0.1.63.md +15 -0
  61. package/changelog/v0.1.64.md +22 -0
  62. package/changelog/v0.1.65.md +15 -0
  63. package/changelog/v0.1.66.md +22 -0
  64. package/changelog/v0.1.67.md +40 -0
  65. package/changelog/v0.1.68.md +38 -0
  66. package/changelog/v0.1.69.md +3 -0
  67. package/changelog/v0.1.7.md +3 -0
  68. package/changelog/v0.1.70.md +7 -0
  69. package/changelog/v0.1.71.md +7 -0
  70. package/changelog/v0.1.72.md +7 -0
  71. package/changelog/v0.1.73.md +7 -0
  72. package/changelog/v0.1.74.md +3 -0
  73. package/changelog/v0.1.75.md +9 -0
  74. package/changelog/v0.1.76.md +13 -0
  75. package/changelog/v0.1.77.md +13 -0
  76. package/changelog/v0.1.78.md +7 -0
  77. package/changelog/v0.1.79.md +8 -0
  78. package/changelog/v0.1.8.md +3 -0
  79. package/changelog/v0.1.80.md +7 -0
  80. package/changelog/v0.1.81.md +19 -0
  81. package/changelog/v0.1.82.md +9 -0
  82. package/changelog/v0.1.83.md +22 -0
  83. package/changelog/v0.1.84.md +25 -0
  84. package/changelog/v0.1.85.md +19 -0
  85. package/changelog/v0.1.86.md +17 -0
  86. package/changelog/v0.1.87.md +7 -0
  87. package/changelog/v0.1.88.md +167 -0
  88. package/changelog/v0.1.89.md +22 -0
  89. package/changelog/v0.1.9.md +3 -0
  90. package/changelog/v0.2.0.md +30 -0
  91. package/changelog/v0.2.1.md +17 -0
  92. package/changelog/v0.2.10.md +7 -0
  93. package/changelog/v0.2.11.md +6 -0
  94. package/changelog/v0.2.12.md +16 -0
  95. package/changelog/v0.2.13.md +16 -0
  96. package/changelog/v0.2.14.md +6 -0
  97. package/changelog/v0.2.15.md +6 -0
  98. package/changelog/v0.2.17.md +14 -0
  99. package/changelog/v0.2.2.md +16 -0
  100. package/changelog/v0.2.3.md +7 -0
  101. package/changelog/v0.2.4.md +7 -0
  102. package/changelog/v0.2.5.md +12 -0
  103. package/changelog/v0.2.7.md +3 -0
  104. package/changelog/v0.2.8.md +107 -0
  105. package/changelog/v0.2.9.md +10 -0
  106. package/changelog/v0.3.0.md +30 -0
  107. package/changelog/v0.3.1.md +17 -0
  108. package/changelog/v0.3.11.md +20 -0
  109. package/changelog/v0.3.12.md +18 -0
  110. package/changelog/v0.3.13.md +4 -0
  111. package/changelog/v0.3.14.md +6 -0
  112. package/changelog/v0.3.15.md +4 -0
  113. package/changelog/v0.3.16.md +3 -0
  114. package/changelog/v0.3.17.md +4 -0
  115. package/changelog/v0.3.18.md +12 -0
  116. package/changelog/v0.3.19.md +12 -0
  117. package/changelog/v0.3.2.md +5 -0
  118. package/changelog/v0.3.21.md +13 -0
  119. package/changelog/v0.3.22.md +29 -0
  120. package/changelog/v0.3.23.md +12 -0
  121. package/changelog/v0.3.24.md +34 -0
  122. package/changelog/v0.3.25.md +40 -0
  123. package/changelog/v0.3.26.md +85 -0
  124. package/changelog/v0.3.28.md +3 -0
  125. package/changelog/v0.3.29.md +107 -0
  126. package/changelog/v0.3.3.md +11 -0
  127. package/changelog/v0.3.30.md +3 -0
  128. package/changelog/v0.3.31.md +113 -0
  129. package/changelog/v0.3.32.md +123 -0
  130. package/changelog/v0.3.33.md +129 -0
  131. package/changelog/v0.3.34.md +156 -0
  132. package/changelog/v0.3.35.md +173 -0
  133. package/changelog/v0.3.36.md +186 -0
  134. package/changelog/v0.3.37.md +182 -0
  135. package/changelog/v0.3.38.md +3 -0
  136. package/changelog/v0.3.39.md +3 -0
  137. package/changelog/v0.3.4.md +9 -0
  138. package/changelog/v0.3.40.md +18 -0
  139. package/changelog/v0.3.41.md +7 -0
  140. package/changelog/v0.3.42.md +9 -0
  141. package/changelog/v0.3.43.md +13 -0
  142. package/changelog/v0.3.44.md +10 -0
  143. package/changelog/v0.3.45.md +12 -0
  144. package/changelog/v0.3.46.md +5 -0
  145. package/changelog/v0.3.47.md +4 -0
  146. package/changelog/v0.3.48.md +10 -0
  147. package/changelog/v0.3.49.md +18 -0
  148. package/changelog/v0.3.5.md +5 -0
  149. package/changelog/v0.3.50.md +41 -0
  150. package/changelog/v0.3.51.md +37 -0
  151. package/changelog/v0.3.52.md +43 -0
  152. package/changelog/v0.3.54.md +55 -0
  153. package/changelog/v0.3.55.md +62 -0
  154. package/changelog/v0.3.56.md +53 -0
  155. package/changelog/v0.3.57.md +61 -0
  156. package/changelog/v0.3.58.md +10 -0
  157. package/changelog/v0.3.59.md +3 -0
  158. package/changelog/v0.3.6.md +12 -0
  159. package/changelog/v0.3.60.md +3 -0
  160. package/changelog/v0.3.61.md +3 -0
  161. package/changelog/v0.3.62.md +3 -0
  162. package/changelog/v0.3.63.md +20 -0
  163. package/changelog/v0.3.64.md +10 -0
  164. package/changelog/v0.3.65.md +10 -0
  165. package/{CHANGELOG.md → changelog/v0.3.66.md} +2 -0
  166. package/changelog/v0.3.67.md +45 -0
  167. package/changelog/v0.3.68.md +18 -0
  168. package/changelog/v0.3.9.md +10 -0
  169. package/package.json +3 -3
  170. package/sources.js +6 -8
  171. package/src/changelog-loader.js +41 -41
  172. package/src/cli-help.js +2 -3
  173. package/src/router-daemon.js +351 -15
  174. package/web/dist/assets/{index-BKwbbLPp.js → index-Cfy_uz7_.js} +1 -1
  175. package/web/dist/index.html +1 -1
package/README.md CHANGED
@@ -125,6 +125,94 @@ Use ⚡️ Command Palette! with **Ctrl+P**.
125
125
  <img src="https://img.shields.io/badge/USE_%E2%9A%A1%EF%B8%8F%20COMMAND%20PALETTE-CTRL%2BP-22c55e?style=for-the-badge" alt="Use ⚡️ Command Palette with Ctrl+P">
126
126
  </p>
127
127
 
128
+ ---
129
+
130
+ ## 🐳 Docker
131
+
132
+ Run FCM without installing Node.js using the official Docker image:
133
+
134
+ ```bash
135
+ # Quick start (daemon + web UI on port 19280)
136
+ docker run -p 19280:19280 ghcr.io/vava-nessa/free-coding-models:latest
137
+
138
+ # With an API key
139
+ docker run -p 19280:19280 -e OPENROUTER_API_KEY=your_key ghcr.io/vava-nessa/free-coding-models:latest
140
+ ```
141
+
142
+ Access the web dashboard at `http://localhost:19280/` and configure your coding tool to use `http://localhost:19280/v1` with model `fcm`.
143
+
144
+ ### Available Image Tags
145
+
146
+ | Tag | Description |
147
+ |-----|-------------|
148
+ | `latest` | Most recent release |
149
+ | `v{major}.{minor}.{patch}` | Specific version (e.g., `v0.3.70`) |
150
+ | `v{major}.{minor}` | Minor version (e.g., `v0.3`) |
151
+ | `v{major}` | Major version (e.g., `v0`) |
152
+
153
+ ### Environment Variables
154
+
155
+ | Variable | Default | Description |
156
+ |----------|---------|-------------|
157
+ | `FCM_HOST` | `0.0.0.0` | Host to bind to (set `127.0.0.1` for localhost-only) |
158
+ | `FCM_PORT` | `19280` | Port to listen on |
159
+ | `FREE_CODING_MODELS_TELEMETRY` | `0` | Disable telemetry |
160
+
161
+ Provider API keys (all optional):
162
+
163
+ ```bash
164
+ docker run -p 19280:19280 \
165
+ -e NVIDIA_API_KEY=your_key \
166
+ -e GROQ_API_KEY=your_key \
167
+ -e OPENROUTER_API_KEY=your_key \
168
+ ghcr.io/vava-nessa/free-coding-models:latest
169
+ ```
170
+
171
+ ### Docker Compose
172
+
173
+ Create a `docker-compose.yml`:
174
+
175
+ ```yaml
176
+ version: '3.8'
177
+ services:
178
+ fcm:
179
+ image: ghcr.io/vava-nessa/free-coding-models:latest
180
+ container_name: fcm
181
+ restart: unless-stopped
182
+ ports:
183
+ - "19280:19280"
184
+ environment:
185
+ FREE_CODING_MODELS_TELEMETRY: "0"
186
+ FCM_HOST: "0.0.0.0"
187
+ OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
188
+ volumes:
189
+ - fcm-data:/home/fcm
190
+ volumes:
191
+ fcm-data:
192
+ ```
193
+
194
+ Run with `docker-compose up -d`. API keys can be passed via a `.env` file or environment variables.
195
+
196
+ ### Troubleshooting
197
+
198
+ **Container won't start:**
199
+ - Check logs: `docker logs fcm`
200
+ - Verify port 19280 is not in use: `docker ps | grep 19280`
201
+
202
+ **Health check fails:**
203
+ - Wait 30s for initial probe cycle
204
+ - Verify API keys are valid: `docker exec fcm curl http://localhost:19280/health`
205
+
206
+ **Cannot connect from host:**
207
+ - Ensure `FCM_HOST=0.0.0.0` (default)
208
+ - Check firewall allows localhost connections
209
+
210
+ **Data persistence:**
211
+ - Config is stored in Docker volume `fcm-data`
212
+ - Recreate the volume with `docker-compose down -v` to reset
213
+
214
+ ---
215
+
128
216
  Need to fix contrast because your terminal theme is fighting the TUI? Press **`G`** at any time to cycle **Auto → Dark → Light**. The switch recolors the full interface live: table, Settings, Help, Smart Recommend, Feedback, and Changelog.
129
217
 
130
218
  **② Pick a model and launch your tool:**
@@ -148,17 +236,8 @@ If the active CLI tool is missing, FCM now catches it before launch, offers a ti
148
236
  ### Common scenarios
149
237
 
150
238
  ```bash
151
- # "I want the most reliable model right now"
152
- free-coding-models --fiable
153
-
154
- # "I want to configure Goose with an S-tier model"
155
- free-coding-models --goose --tier S
156
-
157
- # "I want NVIDIA's top models only"
158
- free-coding-models --origin nvidia --tier S
159
-
160
239
  # "I want the local web dashboard"
161
- free-coding-models --web
240
+ free-coding-models --daemon
162
241
 
163
242
  # "I want one local endpoint that fails over between free models"
164
243
  free-coding-models --daemon-bg
@@ -174,7 +253,14 @@ free-coding-models --tier S --json | jq -r '.[0].modelId'
174
253
  free-coding-models --openclaw --origin groq
175
254
  ```
176
255
 
177
- When launching the web dashboard, `free-coding-models` prefers `http://localhost:3333`. If that port is already used by another app, it now auto-picks the next free local port and prints the exact URL to open.
256
+ When launching the daemon (with `--daemon`), the web dashboard and router API are served from the same port. Configure tools with:
257
+
258
+ | Field | Value |
259
+ |-------|-------|
260
+ | Router Base URL | `http://localhost:19280/v1` |
261
+ | Dashboard URL | `http://localhost:19280/` |
262
+ | Model | `fcm` |
263
+ | API key | `fcm-local` |
178
264
 
179
265
  ### Smart Model Router
180
266
 
@@ -214,9 +300,20 @@ Router endpoints:
214
300
  | `GET /v1/models` | Return virtual models (`fcm`, `fcm:set-name`) |
215
301
  | `GET /health` | Daemon status JSON |
216
302
  | `GET /stats` | Routing, health, request log, and token stats |
217
- | `GET /stream/events` | Live SSE events for dashboard updates |
303
+ | `GET /stream/events` | Live SSE events for router updates |
218
304
  | `POST /daemon/probe-mode` | Set probe mode with `{ "probeMode": "eco" | "balanced" | "aggressive" }` |
219
305
 
306
+ **Web Dashboard endpoints** (served from the same port in `--daemon` mode):
307
+
308
+ | Endpoint | Purpose |
309
+ |----------|---------|
310
+ | `GET /` | Web dashboard HTML |
311
+ | `GET /api/models` | All model data with latency stats |
312
+ | `GET /api/config` | Provider config (keys masked) |
313
+ | `GET /api/events` | Live SSE events for dashboard |
314
+ | `GET /api/key/:provider` | Reveal full API key for provider |
315
+ | `POST /api/settings` | Save API keys and provider toggles |
316
+
220
317
  Routing behavior:
221
318
 
222
319
  - Priority order works immediately on cold start, then probes refine health scores over time.
@@ -505,6 +602,7 @@ Telemetry is enabled by default and can be disabled with any of the following:
505
602
  <td align="center" width="120"><a href="https://github.com/PhucTruong-ctrl"><img src="https://github.com/PhucTruong-ctrl.png?s=80" width="80" height="80" style="border-radius:50%" alt="PhucTruong-ctrl"></a></td>
506
603
  <td align="center" width="120"><a href="https://github.com/chindris-mihai-alexandru"><img src="https://avatars.githubusercontent.com/u/12643176?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="chindris-mihai-alexandru"></a></td>
507
604
  <td align="center" width="120"><a href="https://github.com/serajbaltu"><img src="https://avatars.githubusercontent.com/u/90699173?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="serajbaltu"></a></td>
605
+ <td align="center" width="120"><a href="https://github.com/stgreenb"><img src="https://avatars.githubusercontent.com/u/18483964?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="stgreenb"></a></td>
508
606
  </tr>
509
607
  <tr>
510
608
  <td align="center"><a href="https://github.com/vava-nessa"><sub><b>vava-nessa</b></sub></a></td>
@@ -514,6 +612,7 @@ Telemetry is enabled by default and can be disabled with any of the following:
514
612
  <td align="center"><a href="https://github.com/PhucTruong-ctrl"><sub><b>PhucTruong-ctrl</b></sub></a></td>
515
613
  <td align="center"><a href="https://github.com/chindris-mihai-alexandru"><sub><b>chindris-mihai-alexandru</b></sub></a></td>
516
614
  <td align="center"><a href="https://github.com/serajbaltu"><sub><b>serajbaltu</b></sub></a></td>
615
+ <td align="center"><a href="https://github.com/stgreenb"><sub><b>stgreenb</b></sub></a></td>
517
616
  </tr>
518
617
  </table>
519
618
 
@@ -92,15 +92,7 @@ async function main() {
92
92
  process.exit(1);
93
93
  }
94
94
 
95
- // 📖 --web mode: launch the web dashboard instead of the TUI
96
- if (cliArgs.webMode) {
97
- const { startWebServer } = await import('../web/server.js')
98
- const port = parseInt(process.env.FCM_PORT || '3333', 10)
99
- await startWebServer(port, { open: true })
100
- return
101
- }
102
-
103
- // 📖 Load JSON config
95
+ // Load JSON config
104
96
  const config = loadConfig();
105
97
  ensureTelemetryConfig(config);
106
98
  ensureFavoritesConfig(config);
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.1 - 2026-02-21
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.10 - 2026-02-22
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,10 @@
1
+ # Changelog v0.1.11 - 2026-02-22
2
+
3
+ Add unit tests (59 tests), extract pure logic to lib/utils.js, fix GitHub Actions release workflow.
4
+
5
+ - Extract getAvg, getVerdict, getUptime, sortResults, filterByTier, findBestModel, parseArgs to lib/utils.js
6
+ - Add comprehensive test suite using node:test (sources integrity, core logic, CLI parsing, package sanity)
7
+ - Fix release.yml: remove broken npm version patch, add version detection via git tags, add GitHub Release creation
8
+ - Update AGENTS.md with test-first workflow instructions
9
+
10
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@@ -0,0 +1,16 @@
1
+ # Changelog v0.1.12 - 2026-02-22
2
+
3
+ ### Added
4
+ - Unit test suite: 59 tests across 11 suites using `node:test` (zero dependencies)
5
+ - Tests cover: sources data integrity, core logic (getAvg, getVerdict, getUptime, filterByTier, sortResults, findBestModel), CLI arg parsing, package.json sanity
6
+ - `lib/utils.js`: extracted pure logic functions from the monolithic CLI for testability
7
+ - `pnpm test` script in package.json
8
+
9
+ ### Fixed
10
+ - GitHub Actions release workflow: removed broken `npm version patch` loop, added version detection via git tags
11
+ - GitHub Actions now creates a GitHub Release with auto-generated notes for each new version
12
+
13
+ ### Changed
14
+ - AGENTS.md updated with test-first workflow: agents must run `pnpm test` before `pnpm start`
15
+
16
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.13 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the unit test suite addition (see [v0.1.12](../v0.1.12))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.14 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the unit test suite addition (see [v0.1.12](../v0.1.12))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.15 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the unit test suite addition (see [v0.1.12](../v0.1.12))._
@@ -0,0 +1,13 @@
1
+ # Changelog v0.1.16 - 2026-02-22
2
+
3
+ ### Added
4
+ - OpenCode Desktop support: new `--opencode-desktop` flag and menu option to set model & open the Desktop app
5
+ - "Read Changelogs" menu option when an update is available (opens GitHub releases page)
6
+ - `startOpenCodeDesktop()` function — same config logic as CLI, launches via `open -a OpenCode`
7
+
8
+ ### Changed
9
+ - Startup menu: "OpenCode" renamed to "OpenCode CLI", new "OpenCode Desktop" entry added
10
+ - TUI mode badge: shows `[💻 CLI]` or `[🖥 Desktop]` or `[🦞 OpenClaw]`
11
+ - Footer action hint adapts to desktop mode (`Enter→OpenDesktop`)
12
+
13
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.17 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the OpenCode Desktop iteration (see [v0.1.16](../v0.1.16))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.18 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the OpenCode Desktop iteration (see [v0.1.16](../v0.1.16))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.19 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the OpenCode Desktop iteration (see [v0.1.16](../v0.1.16))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.2 - 2026-02-22
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,14 @@
1
+ # Changelog v0.1.20 - 2026-02-22
2
+
3
+ ### Added
4
+ - **Dynamic tier filtering**: Use E/D keys to filter models by tier during runtime
5
+ - Tier filter badge shown in header (e.g., `[Tier S]`)
6
+ - E key elevates filter (show fewer, higher-tier models)
7
+ - D key descends filter (show more, lower-tier models)
8
+ - Preserves ping history when changing filters
9
+
10
+ ### Fixed
11
+ - **Error 401 with --tier flag**: Fixed issue where using `--tier` alone would show selection menu instead of proceeding directly to TUI
12
+ - Improved flag combination handling for better user experience
13
+
14
+ ---
@@ -0,0 +1,12 @@
1
+ # Changelog v0.1.21 - 2026-02-22
2
+
3
+ ### Refactored
4
+ - **Simplified tier filtering architecture**: Replaced complex object recreation with simple `hidden` flag system
5
+ - **Flags as shortcuts**: `--tier S` now just sets initial state instead of blocking dynamic filtering
6
+ - **Dynamic filtering preserved**: E/D keys work seamlessly even when starting with `--tier` flag
7
+
8
+ ### Fixed
9
+ - **Ping loop bug**: Fixed issue where filtered models weren't pinged due to using wrong results array
10
+ - **Initial ping bug**: Fixed issue where initial ping used wrong results array
11
+
12
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.22 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Local changelogs**: "Read Changelogs" menu option now opens local `CHANGELOG.md` file instead of GitHub releases
5
+
6
+ ---
@@ -0,0 +1,16 @@
1
+ # Changelog v0.1.23 - 2026-02-22
2
+
3
+ ### Refactored
4
+ - **Removed startup menu**: No more blocking mode selection menu at startup
5
+ - **Default to OpenCode CLI**: App starts directly in CLI mode when no flags given
6
+ - **Mode toggle in TUI**: Added Z key to cycle between CLI → Desktop → OpenClaw → CLI
7
+ - **GitHub changelogs**: "Read Changelogs" option now opens GitHub URL instead of local file
8
+ - **Auto-update by default**: When new version available without flags, auto-updates and relaunches
9
+ - **Centered update menu**: Update notification appears only when needed, with clean centered layout
10
+
11
+ ### Changed
12
+ - **Header display**: Shows `[💻 CLI] (Z to toggle)` with mode toggle hint
13
+ - **Footer instructions**: Added "M Mode" to key bindings
14
+ - **Update workflow**: Flags (`--opencode` etc.) still show update menu for compatibility
15
+
16
+ ---
@@ -0,0 +1,9 @@
1
+ # Changelog v0.1.24 - 2026-02-22
2
+
3
+ ## What's Changed
4
+ * fix: TUI viewport scrolling for Ghostty and narrow terminals by @whit3rabbit in https://github.com/vava-nessa/free-coding-models/pull/10
5
+
6
+ ## New Contributors
7
+ * @whit3rabbit made their first contribution in https://github.com/vava-nessa/free-coding-models/pull/10
8
+
9
+ **Full Changelog**: https://github.com/vava-nessa/free-coding-models/compare/v0.1.23...v0.1.24
@@ -0,0 +1,13 @@
1
+ # Changelog v0.1.25 - 2026-02-22
2
+
3
+ ### Added
4
+ - **Discord community link**: Added Discord invite to README and TUI footer
5
+ - **Enhanced footer layout**: Improved footer with multi-line layout showing GitHub repo and Discord links
6
+ - **Clickable author name**: "vava-nessa" is now clickable in terminal (opens GitHub profile)
7
+ - **Release notes automation**: GitHub Actions now uses CHANGELOG.md content for release notes instead of auto-generated notes
8
+ ### Changed
9
+ - **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
10
+ - **Footer text**: "Made with love by vava-nessa" with clickable links
11
+ ### Fixed
12
+ - **Release workflow**: GitHub Releases now display proper changelog content instead of generic commit summaries
13
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.26 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Footer improvements**: Replaced "Repository GitHub" with "GitHub", "love" with 💖 emoji, and simplified Discord text
5
+ - **README enhancement**: Added GitHub link section below Discord invite
6
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.27 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Footer redesign**: All links now on one line with clickable text: "Join our Discord!" and "Read the docs on GitHub"
5
+ - **Improved UX**: Links use same clickable format as author name for consistent user experience
6
+ ---
@@ -0,0 +1,5 @@
1
+ # Changelog v0.1.28 - 2026-02-22
2
+
3
+ ### Added
4
+ - **Footer emojis**: Added 💬 emoji before Discord link and ⭐ emoji before GitHub link for better visual appeal
5
+ ---
@@ -0,0 +1,5 @@
1
+ # Changelog v0.1.29 - 2026-02-22
2
+
3
+ ### Fixed
4
+ - **Discord link correction**: Updated all Discord invite URLs to use permanent link https://discord.gg/WKA3TwYVuZ
5
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.3 - 2026-02-22
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,10 @@
1
+ # Changelog v0.1.31 - 2026-02-22
2
+
3
+ ### Added
4
+ - **SWE-bench column**: Added new SWE-bench Verified score column showing coding performance for each model
5
+ - **Color-coded column headers**: First letter of each column header is now colored (yellow) to indicate keyboard shortcut for sorting
6
+ - **Keyboard shortcut improvements**: Changed P to L for latest ping sorting, added E for SWE-bench sorting
7
+ ### Changed
8
+ - **Source name simplification**: Renamed "NVIDIA NIM" to "NIM" throughout the codebase
9
+ - **Enhanced footer Discord link**: Discord link now displays in bright cyan color with "(link fixed)" indicator
10
+ ---
@@ -0,0 +1,8 @@
1
+ # Changelog v0.1.32 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Column header improvements**: Fixed column alignment issues for better visual appearance
5
+ - **Status renamed to Condition**: "Status" column renamed to "Condition" for clarity
6
+ - **Keyboard shortcut updates**: S key now sorts by SWE-bench score, C key sorts by Condition
7
+ - **Footer Discord text update**: Changed "Join our Discord!" to "Join Free-Coding-Models Discord!"
8
+ ---
@@ -0,0 +1,5 @@
1
+ # Changelog v0.1.33 - 2026-02-22
2
+
3
+ ### Fixed
4
+ - **Column header alignment**: Fixed column headers misalignment issue caused by ANSI color codes interfering with text padding
5
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.34 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Condition renamed to Health**: Renamed "Condition" column to "Health" for better clarity
5
+ - **Keyboard shortcut update**: H key now sorts by Health (instead of C for Condition)
6
+ ---
@@ -0,0 +1,5 @@
1
+ # Changelog v0.1.35 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **Column reorganization**: Reordered columns for better logical flow: Rank / Tier / SWE% / Model / Origin / Latest Ping / Avg Ping / Health / Verdict / Up%
5
+ ---
@@ -0,0 +1,16 @@
1
+ # Changelog v0.1.36 - 2026-02-22
2
+
3
+ ### Added
4
+ - **SWE-bench Verified column**: Shows real SWE-bench Verified scores for all 44 models from official benchmarks
5
+ - **Color-coded keyboard shortcuts**: First letter of each column header colored in yellow to indicate sorting key
6
+ - **Heart and Coffee in footer**: "Made with 💖 & ☕ by vava-nessa"
7
+ ### Changed
8
+ - **Column organization**: Reordered columns for better logical flow: Rank / Tier / SWE% / Model / Origin / Latest Ping / Avg Ping / Health / Verdict / Up%
9
+ - **Health column**: Renamed from "Status" to "Health" with H key for sorting
10
+ - **SWE-bench sorting**: S key now sorts by SWE-bench score
11
+ - **Latest ping shortcut**: L key (instead of P) for sorting by latest ping
12
+ - **Source name**: Simplified "NVIDIA NIM" to "NIM"
13
+ ### Fixed
14
+ - **Column header alignment**: Fixed misalignment caused by ANSI color codes in headers
15
+ - **Discord link**: Updated to permanent invite link https://discord.gg/WKA3TwYVuZ
16
+ ---
@@ -0,0 +1,5 @@
1
+ # Changelog v0.1.37 - 2026-02-22
2
+
3
+ ### Added
4
+ - **Auto-update with sudo fallback**: When npm update fails due to permissions, automatically retries with sudo to complete the update
5
+ ---
@@ -0,0 +1,9 @@
1
+ # Changelog v0.1.38 - 2026-02-22
2
+
3
+ ### Fixed
4
+ - **Cross-platform OpenCode integration**: Fixed OpenCode CLI and Desktop installation issues on Windows and Linux
5
+ - **Windows**: Fixed config path to use %APPDATA%\opencode\opencode.json with fallback to ~/.config
6
+ - **Linux**: Added support for snap, flatpak, and xdg-open to launch OpenCode Desktop
7
+ - **All platforms**: Properly detects OS and uses correct commands and paths
8
+ - **OpenCode Desktop**: Platform-specific launch commands (macOS: `open -a`, Windows: `start`, Linux: multiple methods)
9
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.39 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the cross-platform OpenCode fixes (see [v0.1.38](../v0.1.38))._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.4 - 2026-02-22
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.40 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the cross-platform OpenCode fixes (see [v0.1.38](../v0.1.38))._
@@ -0,0 +1,11 @@
1
+ # Changelog v0.1.41 - 2026-02-22
2
+
3
+ ### Changed
4
+ - **sources.js data audit** — verified and corrected SWE-bench scores, tiers, and context windows across all NIM models:
5
+ - Devstral 2 123B: `S, 62.0%, 128k` → `S+, 72.2%, 256k` (official Mistral announcement)
6
+ - Mistral Large 675B: ctx `128k` → `256k`
7
+ - QwQ 32B: ctx `32k` → `131k`
8
+ - Llama 4 Maverick: ctx `128k` → `1M` (NVIDIA NIM confirmed)
9
+ - Llama 4 Scout: ctx `128k` → `10M` (NVIDIA NIM confirmed)
10
+ - GPT OSS 20B: ctx `32k` → `128k`
11
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.42 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the multi-provider iteration (see [v0.1.44](../v0.1.44) for full changelog)._
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.43 - 2026-02-22
2
+
3
+ _Intermediate patch release — part of the multi-provider iteration (see [v0.1.44](../v0.1.44) for full changelog)._
@@ -0,0 +1,17 @@
1
+ # Changelog v0.1.44 - 2026-02-22
2
+
3
+ ### Added
4
+ - **Multi-provider support** — Groq (6 models) and Cerebras (3 models) added alongside NVIDIA NIM, for 53 total models
5
+ - **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
6
+ - **Settings screen (`P` key)** — New TUI overlay to manage API keys per provider, toggle providers on/off, and test keys with a live ping
7
+ - **`lib/config.js`** — New JSON config system (`~/.free-coding-models.json`) replacing the old plain-text file
8
+ - Auto-migrates old `~/.free-coding-models` (plain nvidia key) on first run
9
+ - Stores keys per provider + per-provider enabled/disabled state
10
+ - `NVIDIA_API_KEY`, `GROQ_API_KEY`, `CEREBRAS_API_KEY` env vars override config
11
+ - **Per-provider ping URLs** — `ping()` now accepts explicit endpoint URL; each provider has its own API endpoint in `sources.js`
12
+ - **Provider name in Origin column** — Shows `NIM` / `Groq` / `Cerebras` instead of always `NIM`
13
+ ### Changed
14
+ - `MODELS` flat array now includes `providerKey` as 6th element
15
+ - State init filters models from disabled providers; rebuilds on settings close
16
+ - Config file path changed from `~/.free-coding-models` to `~/.free-coding-models.json` (migration is automatic)
17
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.45 - 2026-02-22
2
+
3
+ ### Fixed
4
+ - **Discord notification**: Fixed GitHub Actions workflow crash (secrets context not allowed in step `if` conditions — now handled in the Node script directly)
5
+
6
+ ---
@@ -0,0 +1,9 @@
1
+ # Changelog v0.1.46 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **Discord notification**: Fixed ECONNRESET error — drain response body with `res.resume()` and call `process.exit(0)` immediately after success so the Node process closes cleanly
5
+
6
+ ### Changed
7
+ - **Discord link**: Updated invite URL to `https://discord.gg/5MbTnDC3Md` everywhere (README, TUI footer)
8
+
9
+ ---
@@ -0,0 +1,6 @@
1
+ # Changelog v0.1.47 - 2026-02-23
2
+
3
+ ### Changed
4
+ - Release test
5
+
6
+ ---
@@ -0,0 +1,11 @@
1
+ # Changelog v0.1.48 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **`--tier` CLI flag**: `parseArgs()` was never called in `main()`, so `--tier S` was silently ignored — now wired in and applied on TUI startup (thanks @whit3rabbit, PR #11)
5
+ - **`--tier` value leaking into `apiKey`**: `parseArgs()` for-loop was capturing the tier value as the API key — fixed by skipping the value arg after `--tier`
6
+ - **Ctrl+C not exiting**: sort key handler was intercepting all single-letter keypresses including ctrl-modified ones — added `!key.ctrl` guard so Ctrl+C reaches the exit handler (PR #11)
7
+
8
+ ### Added
9
+ - Test verifying `--tier` value does not leak into `apiKey` (63 tests total)
10
+
11
+ ---
@@ -0,0 +1,10 @@
1
+ # Changelog v0.1.49 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **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)
5
+ - **Settings: entering an API key had no immediate effect**: after saving a key and closing Settings (Escape), models previously in `noauth` state are now immediately re-pinged with the new key
6
+
7
+ ### Changed
8
+ - Ping without API key is now always attempted — a 401 response confirms the server is UP and shows real latency; `🔑 NO KEY` replaces the old `❌ 401` misleading error
9
+
10
+ ---
@@ -0,0 +1,3 @@
1
+ # Changelog v0.1.5 - 2026-02-22
2
+
3
+ _No release notes available for this version._
@@ -0,0 +1,7 @@
1
+ # Changelog v0.1.50 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **Groq/Cerebras models selected for OpenCode were launched as NVIDIA models**: `providerKey` was not passed in `userSelected` on Enter, causing all models to be prefixed with `nvidia/` regardless of their actual provider — now correctly uses `groq/model-id` and `cerebras/model-id`
5
+ - **`startOpenCode` and `startOpenCodeDesktop`**: both functions now handle all 3 providers; Groq and Cerebras use OpenCode's built-in provider support (no custom config block needed, just `GROQ_API_KEY`/`CEREBRAS_API_KEY` env vars); NVIDIA retains its existing custom provider config flow
6
+
7
+ ---
@@ -0,0 +1,4 @@
1
+ # Changelog v0.1.51 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **Groq/Cerebras models selected for OpenCode had no provider block**: even with the correct `groq/model-id` prefix, OpenCode couldn't use the model because no `provider.groq` block existed in `opencode.json` — now automatically creates the provider block (Groq: built-in with `apiKey: {env:GROQ_API_KEY}`; Cerebras: `@ai-sdk/openai-compatible` with baseURL) and registers the model in `provider.<key>.models`
@@ -0,0 +1,10 @@
1
+ # Changelog v0.1.52 - 2026-02-23
2
+
3
+ ### Fixed
4
+ - **OpenCode model handoff** (PR #14 by @whit3rabbit): API keys from `~/.free-coding-models.json` were 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 new `OPENCODE_MODEL_MAP`
5
+ - **OpenClaw nvidia provider missing models array** (PR #13 by @whit3rabbit): `startOpenClaw()` created the nvidia provider block without a `models` property, causing Zod schema validation to reject the config
6
+
7
+ ### Improved
8
+ - **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
9
+
10
+ ---