0.23.0 2026-06-06
Netclaw v0.23.0 — Beta channel, streaming-native chat, Docker improvements, and shell reliability fixes
Features
-
Opt-in beta release channel — Netclaw can now publish and install prereleases without ever touching a default install. The release manifest gained an additive
latestPrereleasepointer (newest of all releases) alongsidelatest(newest stable);--channel beta/-Channel betaand the rolling:betaDocker tag resolve to it, while stable clients structurally only ever readlatest. (#1314) -
Channel-aware, SemVer-correct update check — the binary update check now honors
Daemon.UpdateChannel(stabledefault, orbeta) and compares versions by SemVer 2.0.0 precedence. Beta testers are notified of the next prerelease and automatically roll onto a stable release once it supersedes their beta; stable users are never offered a prerelease. (#1315) -
Streaming-native chat-client stack with composable routing — the
IChatClientstack has been redesigned so the streaming-vs-non-streaming transport distinction no longer leaks into callers. Netclaw now issues only streaming requests across all 8 providers, eliminating the OpenAI Codex400 "Stream must be set to true"error and preventing reasoning content drops on some providers. Resilience and observability are compositional viaMicrosoft.Extensions.AI.ChatClientBuilder— each (provider, model) pipeline is assembled asLogging → Retry → VendorOptions → raw. ARoutingChatClientwalks ordered candidate lists for failover, andLoggingChatClientis now stateless with session-correlated log tags (SessionId). The transport-level retry policy is configurable viaSession:Tuning:StreamingRetryPolicy. (#1313) -
Bounded tool output with file spill — large tool outputs are now bounded and spilled to a file instead of flooding the session, keeping context lean while preserving the full output on disk. (#1305)
Bug Fixes
-
Shell approval patterns no longer match bare integers — fixed a bug where numeric argument patterns (e.g.,
1,42) were incorrectly matched as approval patterns for shell commands. (#1331) -
Shell pipe reads are bounded — pipe reads are now bounded to
MaxOutputCharsbefore truncating, preventing runaway memory on huge command output. (#1298) -
Shell verifies the working directory — Netclaw confirms the working directory exists before launching a process, surfacing a clear error instead of a cryptic failure. (#1299)
-
Docker self-dropping CLI launcher for root exec —
/usr/local/bin/netclawnow transparently re-execs as thenetclawuser when invoked as root, sodocker exec/kubectl exec -- netclawworks on any orchestrator withoutgosu/-uknowledge required. (#1322) -
Docker container no longer crash-loops on read-only
/toolsmount — the entrypoint now treats/toolsas best-effort and never recursively chowns it. (#1321) -
Non-root agent can install tools at runtime in Docker — the image now ships user-writable, on-
PATHinstall locations (~/.local/bin,~/.dotnet,~/.dotnet/tools, and a mounted/tools/bin) so runtime-installed tools resolve as bare commands. (#1321) -
Docker reaps orphaned subprocesses — the container now uses
tiniso orphaned subprocesses are reaped instead of accumulating as zombies. (#1306) -
Docker owns the daemon lifecycle — the container is now the sole owner of the daemon lifecycle, fixing conflicting restart behavior. (#1282)
-
Docker bind-mount ownership repaired — bind-mount ownership is corrected on startup so mounted data is writable. (#1281)
-
Provider modality probing fixed — Netclaw no longer persists guessed modalities, and the model-probe timeout and visibility issues are resolved. (#1311)
-
OpenAI Codex calls no longer hang — non-streaming Codex calls are now served via streaming under the hood, so they complete reliably. (#1289)
-
Zero context-window models ignored — models that report a zero context window are now ignored instead of breaking model selection. (#1285)
-
Init wizard readiness race fixed — init readiness is now gated on a daemon restart generation and a re-resolved endpoint, closing a race in the setup wizard. (#1307)
-
Standardized self-animating spinner across probe surfaces — replaced five hand-rolled, drifted probe/validation spinners with Termina's shared
SpinnerNodehelper. Fixes the frozen ModelManager spinner, the ~1fps crawl on provider validation/probe spinners, and inconsistent animation cadence. (#1312, #1327) -
Lighter daemon memory footprint —
netclawdnow uses Workstation GC, reducing baseline memory use. (#1295) -
Windows installer uses User-scope PATH — the Windows install instruction now updates the User-scope PATH so
netclawis found in new shells. (#1274) -
Corrected version split in Directory.Build.props — the version parsing logic that extracts major.minor.patch/prerelease segments was fixed to handle all version strings correctly. (#1339)
Dependency Updates
-
ModelContextProtocol.Core and ModelContextProtocol.AspNetCore bumped to 1.4.0 — pulls in upstream MCP SDK improvements, including better streaming support that enables the new chat-client stack. (#1329, #1330)
-
Aspire.Hosting.AppHost bumped to 13.4.2 — .NET Aspire host updates. (#1318)
-
CommunityToolkit.Aspire.Hosting.Ollama bumped to 13.4.0 — Ollama hosting support update. (#1320)
-
Grpc.Tools bumped to 2.81.0 — gRPC tooling update. (#1269)
-
Verify.XunitV3 bumped to 31.19.0 — test framework update. (#1270)
Documentation & Internal
-
Documented beta/stable release process — added documentation for the release workflow. (#1323)
-
Cited #648 at the chat-client routing seam — added documentation reference for provider routing behavior. (#1335)
-
Archived 8 completed OpenSpec changes — cleaned up completed specification work and synced delta specs. (#1325)
-
Added
.claude/worktreesto.gitignore— keeps Claude Code worktree artifacts out of version control. (#1336) -
Prepared v0.23.0-beta.5 release — release preparation commits for beta channel. (#1337)
-
Prepared v0.23.0-beta.4 release — release preparation commits for beta channel. (#1328)
-
Prepared v0.23.0-beta.1 release — release preparation commits for beta channel. (#1317)