Community release: 3 issues fixed, 5 pull requests merged (4 new contributors), 1 declined with reason. The catalog moves to 25 providers / 259 models with the addition of onomeo and 2 Mistral coding models, minus 6 Pollinations models that silently left the free tier.
Added
- 🇨🇳 Simplified Chinese localization (PR #193 by @Mavlan): the TUI and the Web Dashboard now share one i18n layer, English stays the default and
zh-CNis one setting away. The language preference is persisted in the shared config and exposed through the web Settings API. CLI help, settings, router, install, search and command-palette text are all localized, and CJK display-width handling is reused for TUI columns and overlay clipping. - onomeo provider (PR #187 by @Owaid0723666, who also disclosed operating the service): 9 free coding models behind a daily check-in credit system (50k credits on day 1, up to 200k/day with a streak, no card). Wired end to end: env var
ONOMEO_API_KEY, key test againstGET /v1/models, quota badgelimited, theme colors, Docker env passthrough and provider card on the website. Model ids verified live against the public catalog; premium models deliberately not listed. - Mistral coding model aliases (PR #192 by @MrTodone):
mistral-code-latestandmistral-code-fim-latestjoin the Mistral provider (both live-verified aliases of codestral-2508, 256k context), handy for clients that address themistral-code-*family directly.
Fixed
- Daemon dashboard "[object Object]" toast on every open (issue #189): the daemon's embedded dashboard only stubbed
GET /api/tool-mode, so the frontend's POST (URL write-back of?toolMode=) fell through to the OpenAI-style 404 catch-all. The daemon now handles GET and POST likeweb/server.js: GET returns the persistedsettings.preferredToolModeinstead of a hardcodedopencode, POST validates and persists the mode, and the frontend hook extracts nestederror.messageso any future failure reads as a sentence, not[object Object]. Covered by 4 new integration tests. - "Unrecognized flag: --model" when launching OpenCode v2 (issue #194): OpenCode v2 rejects flags its entry points don't know, and
opencode webnever accepted--modelat all. FCM already wrote your pick intoopencode.json(config.model) before every launch, so the flag was redundant: all launch paths (CLI, Web, Desktop, snap/flatpak) now spawn bare and let the config default apply. Works identically on OpenCode v1 and v2. - 6 Pollinations models that quietly became paid (issue #190, reported by @holakoyad):
minimax-m2.7,qwen/qwen3.8-max,google/gemini-3.1-pro-preview,nvidia/nemotron-3-ultra,qwen/qwen3-coder-nextandgemma-4-31banswer HTTP 200 with the error text embedded in the completion content on free keys, so status-code probes saw them as healthy. All 6 are removed (free alternatives remain on their original providers), and probes now sniff pollinations completions for the paid-Pollen message and report402instead of a fake200. Covered by 4 new unit tests. - Router v2 failover settings wiped on restart (PR #191 by @MrTodone):
lastResortModel,bodyReadTimeoutMs,totalBudgetMsandcontentValidationwere silently stripped by the config normalizer on everyload() → save()round-trip. Unknown failover keys now survive normalization (the daemon still sanitizes them at read time), with round-trip regression tests. - Web Settings API key deletion could resurrect itself (PR #195 by @ming076):
/api/settingssaved keys with a plainsaveConfig()whose on-disk merge could restore a just-deleted key. Key add/update/delete now goes through the provider-scopedpersistApiKeysForProvider()helper, and persistence failures return a real error instead of a fake success.
Changed
- Provider counts: 24 → 25 providers, 254 → 259 models (minus 6 paid Pollinations, plus 9 onomeo, plus 2 Mistral aliases).
docs/providers.mdregenerated fromsources.js, README counts and Top-8 table refreshed, website catalog mirror synced. - Declined the chalk 5 → 6 dependabot bump (PR #183): chalk 6 requires Node 22 while FCM supports Node 18+ and CI tests Node 20. It will be revisited when the minimum Node version moves to 22.