Releases: netclaw-dev/netclaw
Netclaw 0.17.2
0.17.2 2026-05-06
Netclaw v0.17.2 — Session stability fixes, MCP reconnection, and schema packaging
Bug Fixes
-
Fixed binding actor stream crashes on shutdown — SignalR, Slack, and Discord binding actors now drain their Akka.Streams pipeline before stopping, eliminating
AbruptTerminationException/StreamDetachedExceptioncrash logs on graceful shutdown and idle timeout. (#895) -
Fixed thinking-only LLM responses being classified as empty — the empty response guard now checks
TextReasoningContentin addition toTextContent, so models that emit thinking tokens without text (e.g., Qwen 3) are no longer incorrectly retried with a nudge. (#895) -
Fixed dropped tool calls from llama.cpp-compatible providers —
OpenAiCompatibleChatClientnow emits accumulated tool calls whenfinish_reasonis"stop", not just"tool_calls", since llama.cpp often sends"stop"even when structured tool calls are present. (#895) -
Fixed
netclaw doctorschema validation failing onSearch.Backend— the config schema used PascalCase enum values but the wizard writes lowercase viaToWireValue(). Schema now matches wire format (duckduckgo,brave,searxng). (#894) -
Embedded config schema as assembly resource — the tar.gz/zip CLI archives only shipped the single-file binary, silently dropping the
Schemas/directory.netclaw doctornow always has access to the schema regardless of distribution format. (#894) -
Added
CursorAdvancedserialization bindings — replaced private nested cursor types in Slack and Discord binding actors with a shared, protobuf-serializableCursorAdvanced(string Cursor)record. Fixes persistence recovery failures when cursor state was written by the old unregistered type. Closes #887. (#890) -
MCP servers that become unreachable (DNS failure, server down) no longer stay permanently stuck in
Unreachablestate — a newMcpReconnectionServicepolls every 30 seconds with per-server exponential backoff (30s → 300s cap) and emits an operational alert on recovery. (#884)
Documentation
- Refocused README on end-user content — moved architecture, design goals, and build-from-source sections to CONTRIBUTING.md; added Docker quickstart, netclaw.dev documentation links, and Discord link. (#888)
Netclaw 0.17.1
0.17.1 2026-05-06
Netclaw v0.17.1 — First public release with Docker support, non-interactive approval, and open-source infrastructure
This is the first release of Netclaw published as an open-source project under netclaw-dev/netclaw. It includes the first official Docker image for netclawd, new agent autonomy features, and the infrastructure changes needed to support public distribution.
Docker
-
Official multi-arch Docker image for
netclawdis now published to GHCR (ghcr.io/netclaw-dev/netclaw) on every release, supporting bothlinux/amd64andlinux/arm64. (#858) -
The
netclawdDocker container now runs as a non-root user (netclaw, UID 1654) instead of root — the entrypoint creates the data directory with correct ownership andsu-execs into the unprivileged user. (#874) -
Schema files are now included in the Docker image so
netclaw doctorworks correctly inside containers. (#863) -
Exposure mode validation now accepts container and reverse-proxy deployments — the daemon no longer rejects
httpsexposure mode when bound to a loopback address, since TLS termination is handled externally in these topologies. (#862, #864)
Features
-
Non-interactive approval, sub-agent approval chaining, and shell trust zone enforcement — operators can now pre-approve tool categories in
netclaw.yamlso the daemon can execute tools without interactive confirmation. Sub-agents inherit their parent's approval grants. A new shell trust zone restricts which directories and commands the agent can use in autonomous mode. (#851) -
Improved ambient skill activation for small models — skill keyword matching now uses normalized scoring so smaller-context models (Haiku, Gemini Flash) trigger the right skills without requiring exact phrasing. (#856)
Bug Fixes
-
Fixed
cancel_reminderdeleting config files instead of disabling them — reminder cancellation now sets a disabled flag rather than removing the underlying file, so reminder metadata is preserved for audit and re-enable. (#848) -
Fixed provider-reported context window being ignored — the LLM session now uses the context window size reported by the provider instead of falling back to a hardcoded 32k default. (#865)
-
Fixed health check state not resetting on re-entry — the
netclaw initwizard's go-back-and-retry flow now resets health check state so a previously-failed check can succeed on retry without restarting the wizard. Closes #859. (#871) -
Fixed daemon bootstrap pairing in non-local modes — the daemon now preserves the bootstrap pairing token when running in container or remote exposure modes, fixing a regression where pairing failed after switching away from local mode. (#872)
-
Consolidated duplicated path utilities into a single
PathUtilityclass, eliminating three independent copies of home-directory and config-path resolution logic. Closes #852. (#873)
Open-Source Infrastructure
-
Migrated all repository references from
Aaronontheweb/netclawtonetclaw-dev/netclaw. (#838) -
Migrated CI from self-hosted ARC runners to GitHub-hosted runners. (#837)
-
Prepared README and documentation for open-source launch — added CONTRIBUTING.md with build instructions and smoke sandbox docs, clarified secrets encryption, and added netclaw.dev website links. (#843, #846, #847, #878)
Dependencies
Netclaw 0.16.2
0.16.2 2026-04-30
Netclaw v0.16.2 — Apache 2.0 license, security hardening, and stability fixes
License
- Migrated from AGPL v3.0 + Commons Clause to Apache License 2.0 — all source files now carry Petabridge LLC copyright headers, a new
scripts/Add-FileHeaders.ps1script manages header enforcement with a-Verifymode for CI, and the PR validation workflow includes acopyright-headersjob that fails builds missing headers. (#790)
Security
-
Fixed privilege escalation bypass in
ShellCommandPolicy—sudo,su, anddoascommands now receive a categorical deny regardless of what follows, closing a bypass where prependingsudoto any denied command evaded all deny patterns because matching only operated on the first token. Closes finding S4-20 from the 2026-04-29 audit. (#830) -
Moved
SecretOutputRedactortoDispatchingToolExecutorso all tool outputs are redacted before reaching the LLM — previously only shell and background job outputs were covered. Extended redaction patterns now cover AWS access keys (AKIA...), JWT tokens, and other structured secrets. Closes finding S5-01. (#830) -
Gated raw OAuth token values in the provider status endpoint to loopback connections only — remote paired devices now receive boolean flags instead of raw access and refresh token values. Closes finding S7-5.5. (#830)
-
Enforced
SubAgentToolPolicyat spawn time and auto-granted safe-list tools — user-facing subagents are now restricted to the safe-list (attach_file,file_read,web_fetch,web_search) at tool resolution time. Safe-list tools are auto-granted in non-interactive contexts instead of being denied by the approval gate, fixing subagents that had zero usable tools. Closes #831. (#830)
Bug Fixes
-
Fixed daemon crash logs from unobserved
AbruptTerminationExceptionon actor shutdown —SessionPipelineHandle.Dispose()was disposing the materializer inPostStopwhile stream stage actors (children of the materializer's actor context) had already been killed by Akka's child-first shutdown, producingAbruptTerminationExceptionas unobserved tasks that triggeredDaemonCrashMonitor. Output streams now useWatchTermination, andReminderExecutionActor/WebhookExecutionActorcall a newDrainAsync()before stopping so all stream stages complete gracefully while the parent actor is still alive. (#802) -
Fixed erratic navigation during
netclaw initcaused by duplicated channel picker subscriptions —ChannelPickerStepView.BuildContent()was adding newSubmittedsubscriptions on every re-render without disposing old ones, causing multipleAdvanceStep()calls per Enter key and erratic step navigation. Subscriptions are now cleared at the top ofBuildContent()and focus state is reset before sub-step delegation. Closes #792. (#797)
Dependencies
- Bumped
Akka.Persistence.Sql.Hostingfrom 1.5.62 to 1.5.67 (patch update). (#799)
Netclaw 0.16.1
0.16.1 2026-04-28
Netclaw v0.16.1 — Private skill feed sync, MCP permissions navigation fix, and dependency update
Features
- Added private skill server feed sync via
Netclaw.SkillClient— operators can now configure private skill-server instances underSkillFeeds.Feedsinnetclaw.yaml; a newServerFeedSkillSyncServicesyncs skills from those feeds at startup using the Cloudflare Agent Skills RFC discovery protocol, with per-feed error isolation, SHA-256 verification, and content security scanning. Skills follow three-tier precedence (native > server-feed > external) so server-feed skills can extend but never override built-in capabilities. A new "Skill Feeds" step in thenetclaw initwizard supports live probe validation and error recovery. Closes #532. (#785)
Bug Fixes
- Fixed MCP permissions page navigation — Up/Down now navigates all configurable rows (Audience, Server Enabled, Server Default, Tools) using a unified grid cursor, and Left/Right performs context-sensitive cycling per row. The footer is simplified to the six most common shortcuts; legacy shortcuts still work. The
*unsaved*indicator now clears reliably after saving. Closes #786. (#788)
Dependencies
- Bumped
Cronosfrom 0.8.4 to 0.12.0 — includes support for schedule jitter via theHcharacter, nullable reference type annotations, strong-named assembly signing, removal of the year 2499 limitation, and several bug fixes across the 0.9–0.12 release series. (#572)
Netclaw 0.16.0
0.16.0 2026-04-27
Netclaw v0.16.0 — Discord session continuity, public audience hardening, reminder expiration, and init wizard overhaul
Features
-
Added reminder expiration, self-cancellation guidance, and delivery timeout fix — recurring reminders now support an optional
ExpiresInparameter onset_reminder(also available as--expires-inin the CLI and REST API) that automatically disables the reminder after the specified duration. Recurring reminder prompts now include self-cancellation guidance telling the agent to callcancel_reminderwhen the task's purpose is permanently fulfilled (e.g., PR merged, deploy completed).DeliveryObservedTimeoutis aligned withExecutionTimeoutSeconds(300s) so delivery-required reminders are no longer marked as failed when the LLM turn legitimately takes longer than 30 seconds to complete. (#752) -
Added public audience security hardening — Public sessions are now fully amnesic (no memory read or write access by default), the startup tool index is filtered by effective audience so Public sessions do not see capabilities they cannot use, and the system prompt is rebuilt on the first inbound turn once the resolved channel audience is known. File-access denials no longer include root path hints for public sessions. Closes #755, #756. (#758)
-
Added Discord approval button clearing after decision — Discord approval prompt messages are now updated in-place after a user clicks an approval button or types a text response (A/B/C/D), replacing the buttons with a resolved status showing the tool name, action, decision, and who approved. This matches the existing Slack behavior. (#768)
-
Added configuration-driven channel statistics —
netclaw statsandnetclaw statusnow only display channel panels for channels that are actually enabled in configuration. A Discord-only deployment no longer shows an empty Slack section, and the underlying telemetry registry is now extensible per channel type viaChannelTelemetry.For(ChannelType). Closes #773. (#774) -
Streamed attachment downloads to disk instead of buffering in memory — attachment downloads from Slack and Discord no longer buffer entire files in managed heap memory. A shared
StreamingAttachmentDownloaderstreams HTTP responses directly to a temp file using a pooled 81 KB buffer and enforces the operator-configuredMaxFileBytesceiling mid-stream via Content-Length header check and byte-counting fallback. Content scanning reads only the first 64 bytes from disk. Closes #757. (#770) -
Added unified channel picker step for the init wizard — the
netclaw initwizard now presents a single "Communication Channels" checklist step replacing the previous sequential Slack (step 3) and Discord (step 4) steps. Users navigate with↑/↓, toggle channels withSpace, configure withEnter, and advance with[d]. Adding additional channel adapters in the future only requires implementingIChannelAdapterViewModel. Closes #742. (#763) -
Resolved Discord channel IDs to human-readable names in the init wizard — Discord channel entries in the Channels wizard step now display as
"GuildName / #channelName"instead of raw snowflake IDs. Channel resolution runs as a background task while the user completes other sub-steps, adding no blocking delay. Closes #743. (#762) -
Made
AllowedUserIdsan explicit allow/restrict choice in the init wizard — the plain textAllowedUserIdsinput in both Discord and Slack wizard steps is replaced with a two-phase flow: an explicit binary selection ("Restrict to specific users" vs "Allow anyone in allowed channels"), then conditionally a mandatory user ID text input. This prevents accidental open access from pressing Enter on a blank field, enforcing the default-deny security posture. Closes #760. (#778) -
Disabled
System.Objectserialization fallback —WithNetclawSerialization()now callsWithStrictSerialization()to disable the JSON fallback for unregistered types. Unregistered types now throw aSerializationExceptioninstead of silently producing JSON output, making serialization misconfigurations immediately visible. Closes #706. (#777) -
Blocked self-update in container deployments and hardened NSec initialization — a new
Daemon.DisableSelfUpdateconfig option (automatically set totruein the official Docker image viaNETCLAW_Daemon__DisableSelfUpdate=true) blocksnetclaw updatefrom replacing binaries in-place while keeping update availability checks running so operators know when a new image is available. All update notifications when self-update is disabled now advise pulling a newer container image instead. Also addedlibsodium23to the Dockerfile so NSec Ed25519 signature verification works correctly in Ubuntu 24.04 self-contained containers, and hardenedMinisignVerifier.Verify()to catch NSec platform initialization failures and returnPlatformUnavailableinstead of throwing. Closes #771, #772. (#776)
Bug Fixes
-
Fixed Discord thread sessions dropping messages after daemon restart — after a daemon restart, messages sent to an existing Discord thread were silently dropped unless the user @mentioned the bot again, because the in-memory session binding actor was lost and
threadExistswas false, matching theChannelMentionRequiredrouting policy path.DiscordRoutingPolicynow returnsStartOrContinuefor in-thread messages regardless of whether a binding actor exists, matching the existing Slack behavior and allowing Akka Persistence to recover prior session state seamlessly. (#779) -
Fixed dead
OwnerIdentitysub-step appearing in Slack init wizard — a no-longer-neededOwnerIdentitysub-step was still included in the Slack wizard's step sequence, causing an extra blank step to appear duringnetclaw init. Closes #761. (#764)
Netclaw 0.15.1
0.15.1 2026-04-24
Netclaw v0.15.1 — Project directory tracking and automatic context loading
Features
- Added
set_working_directorytool and project directory tracking — sessions now track a mutableProjectDirectoryinWorkingContextthat persists across crash and restart. When a project directory is set, the session automatically discovers and loads the project's identity file (.netclaw/AGENTS.md,CLAUDE.md,AGENTS.md, orCONTEXT.md— first match wins) into the system prompt alongside global identity layers. The loaded project context is stable across turns and benefits from prompt caching. Theset_working_directorytool validates that the target path exists and is within the audience's allowed file access roots; Public and Team audiences cannot use it by default. Also addssession_dirto the[session]context block so the agent knows its full session directory path. Closes #595, #596. (#734)
Dependencies
- Bumped
Microsoft.Extensions.AI.Abstractionsfrom 10.4.1 to 10.5.0. (#736)
Netclaw 0.15.0
0.15.0 2026-04-24
Netclaw v0.15.0 — Session crash recovery hardening, unified streaming timeout, and dependency security updates
Bug Fixes
-
Fixed session amnesia after daemon crash —
SlackThreadBindingActorwas advancing its persistence cursor (marking messages as "seen") at enqueue time viaPersistAsync, before the downstreamLlmSessionActordurably recorded the completed turn. On a crash between those two writes the message was permanently lost: the cursor said "seen" but no turn was recorded, and thread history hydration skipped it on restart. The cursor now advances only whenTurnCompleted(Completed)confirms the turn is durably persisted. Additionally, when identity files are missing on recovery, the last-known system prompt is retained as a fallback instead of being actively deleted. Fixes #733. (#733) -
Fixed false streaming timeout on GPU-contended inference servers — the two-phase watchdog (
FirstTokenTimeout600 s →StreamIdleTimeout120 s) was causing spurious timeouts on self-hosted inference servers where requests are preempted mid-stream by concurrent sessions, triggering the 120-second idle cutoff even while tokens were actively generating. The two timers are now unified into a singleFirstTokenTimeout(600 s) that resets on every streaming delta, eliminating false positives under load.StreamIdleTimeout/StreamIdleTimeoutSecondsare removed from config;netclaw doctor --fixauto-removes the stale key from existing configurations. Fixes #731. (#732)
Dependencies
-
Bumped OpenTelemetry packages from 1.13.1 to 1.15.3 — resolves three moderate-severity GitHub Security Advisories (GHSA-g94r-2vxg-569j, GHSA-mr8r-92fq-pj8p, GHSA-q834-8qmm-v933) affecting
OpenTelemetry.ApiandOpenTelemetry.Exporter.OpenTelemetryProtocol. Transitive pinning is enabled to override the older 1.9.0 pull from Akka.Hosting. (#737) -
Bumped Anthropic SDK from 12.13.0 to 12.16.0. (#724)
-
Bumped
Microsoft.AspNetCore.DataProtectionandSystem.Security.Cryptography.Xmlto 10.0.7 (routine patch update). (#725)
Netclaw 0.14.3
0.14.3 2026-04-22
Netclaw v0.14.3 — Webhooks CLI, scheduling audience gating, proactive check-back guidance, and security/reliability fixes
Features
-
Added
netclaw webhooksCLI command group for managing inbound webhook routes —webhooks list,webhooks show,webhooks set,webhooks delete, andwebhooks validatecommands provide full CRUD management of webhook route configuration from the terminal. Supports multiple secret input methods (--secret,--secret-file,--secret-env) to avoid shell history exposure,--dry-runpreview mode, and--create-only/--update-onlyflags for explicit upsert control. Closes #529. (#711) -
Added scheduling audience gating —
set_reminder,list_reminders,cancel_reminder, andget_reminder_historynow respect the session's audienceAllowedToolslist. Public and Team audiences no longer have scheduling access by default; only Personal sessions (withToolsMode=All) retain it. Operators can grant Team access by explicitly adding the tool names toAllowedTools. Closes #710. (#714) -
Added proactive check-back guidance to
AGENTS.mdtemplate — the agent now automatically schedulescurrent_sessionreminders when it kicks off async work (builds, CI pipelines, deployments) instead of waiting for the user to ask for status. New installations pick this up via the init wizard; existing users can copy the "Proactive Check-Back" block into~/.netclaw/identity/AGENTS.mdmanually. (#714)
Bug Fixes
-
Fixed false
StreamIdleTimeoutwhenToolCallTextFiltersuppresses SSE events — when the filter detects<tool_call>XML in streaming text it suppresses subsequent SSE updates, creating a watchdog blackout whereProcessingWatchdog.Refresh()is never called and the 120-second idle timeout fires even while the GPU is actively generating tokens. The fix yields a content-free keepaliveChatResponseUpdatewhen text is suppressed so the watchdog resets unconditionally. Fixes #717. (#720) -
Fixed skill index missing descriptions, causing skill auto-loading failures — the skill discovery index only showed file paths without context about when to load each skill, leaving the model unable to decide which skills were relevant.
GenerateIndex()now includes skill descriptions on each line, and AGENTS.md skill reference guidance uses action-oriented "BEFORE you..." language to improve auto-loading accuracy. Fixes #696. (#712) -
Fixed MIME type rejection for markdown files sent from Slack — Slack reports
.mdfiles with MIME typetext/plaininstead oftext/markdown, causing the content scanner to reject them. Extension-based MIME normalization now corrects known mismatches (.md/.markdown,.json,.yaml/.yml,.csv,.xml) before validation. Fixes #716. (#719) -
Fixed
*unsaved*indicator visibility innetclaw mcp permissionsTUI — the status message is now positioned above the tool list so it remains visible regardless of list length, and the unsaved indicator color is changed from gray to yellow for better contrast. (#709)
Netclaw 0.14.2
0.14.2 2026-04-21
Netclaw v0.14.2 — Structured reminder delivery, protobuf serialization, subagent robustness, and web-content-retrieval skill
Features
-
Added structured reminder delivery contract —
set_remindernow uses adeliveryobject with a requiredkindfield (current_session,channel, ornone) that directly selects the execution mode, replacing the previous implicit inference from optional fields. A newdeliveryRequiredboolean controls policy;deliveryInstructionscarries content guidance only. Transport-keyed resolver dispatch usesChannelType.ToWireValue()for reliable routing across Slack and future transports. Closes #690. (#692) -
Added protobuf-net serializer with stable manifests —
NetclawProtobufSerializeruses constant manifest strings (sid-v1,sum-v1,tr-v1, etc.) decoupled from .NET type names, enabling safe schema evolution without migration steps. TheWithNetclawSerialization()extension disables theSystem.ObjectJSON fallback so unregistered types fail loudly instead of silently falling back. Existing persisted events remain readable; new events use the more efficient binary format. (#705) -
Added
web-content-retrievalsystem skill — the agent now loads a built-in skill covering URL handling, browser automation guidance, and social media content retrieval so it can advise on web fetch workflows without requiring a custom skill. (#702) -
Made subagent tools optional — omitting the
toolsfield in a subagent's YAML frontmatter now causes the subagent to inherit all session tools, including MCP tools (Notion, GitHub, etc.). Previously the field was required and restricted to four built-in tools, making MCP-powered subagents impossible to define. Whentoolsis specified it acts as a whitelist; when omitted all session tools are available. (#703) -
Migrated webhook notification policy to
deliveryRequiredboolean — theNotifyPolicyenum onset_webhookand webhook config is replaced by adeliveryRequiredboolean that is consistent with the reminder delivery contract. (#704)
Bug Fixes
-
Fixed daemon crash on subagent timeout — the subagent cancellation callback was capturing
Selfat registration time instead of before registration, causing aNotSupportedExceptionwhen the callback fired on a thread-pool thread with no active actor context. The resulting unhandledAggregateExceptionterminated the entire daemon, killing all active sessions. The fix also converts the scheduling to theIWithTimerspattern per project conventions. (#707) -
Fixed
netclaw-operationsskill hidden from agent skill index — the skill had an incorrectdisable-model-invocation: trueflag that prevented it from appearing in the agent's skill discovery index, causing the agent to be unaware of operations guidance. (#702)
Netclaw 0.14.1
0.14.0 2026-04-15
Netclaw v0.14.0 — Skill-defined subagent routing, Mode B reminder session re-entry, fail-closed MCP add, and security patch
Features
-
Added
metadata.subagentrouting for skill-defined activations — skills can now declare asubagentfield in their YAML frontmatter to route activations to a named subagent instead of executing inline. The router fails loudly when the target subagent is missing or misconfigured, matching the project's no-silent-fallback policy. A newsubagent-authoringsystem skill documents the frontmatter contract and guides operators through defining file-based subagents. (#672) -
Added Mode B reminder session re-entry — reminders fired from Slack or SignalR sessions can now check back into the originating session when they fire instead of requiring a
report_to_channeltarget. Omittingreport_to_channelfromset_reminderenables session check-back; the reminder re-enters the session as if the user sent a follow-up message. Fixes #660. (#670) -
Added fail-closed
mcp add, server-default approval policy, andnetclaw mcp permissionsTUI —netclaw mcp addnow assigns empty grants and anApprovaldefault to every newly registered server, preventing new tools from executing without explicit operator authorization. The newnetclaw mcp permissionscommand provides a terminal UI for managing per-server and per-tool approval modes without editing config files directly. (#679)
Security
- Patched CVE-2026-26171 and CVE-2026-33116 —
System.Security.Cryptography.Xmlis pinned to 10.0.6 to address two vulnerabilities in XML cryptography handling. (#681)
Bug Fixes
-
Fixed false daemon crash alerts from SlackNet dispose race —
SlackNet'sReconnectingWebSocketcan throw aTaskCanceledExceptionduring disposal while the daemon is shutting down, which was being surfaced as a crash alert to operators. This exception is now swallowed on the shutdown path so config hot-reloads and daemon restarts no longer generate spurious alerts. (#680) -
Fixed Slack routing drops logging no reason — when the routing policy silently dropped a message, operators had no way to determine which policy rule caused the drop. Routing decisions now carry a structured
IgnoreReasonthat is surfaced in the structured log at the point of discard, making policy debugging actionable without source inspection. (#682)