Changelog¶
Unreleased¶
- The plugin is now a single Rust binary (
herdr-nono) instead of Node scripts: actions, the in-pane bridge, theworktree.removedhook and the overlay are its subcommands, and Node.js is no longer needed at runtime. The build step,scripts/install-binary.sh, downloads the release binary that matches the plugin version (x86_64 or aarch64 Linux, static), checks its sha256 against the release'sSHA256SUMS, and builds from source withcargowhen there is no release.scripts/write-node-path.shandHERDR_NONO_NODEare gone;HERDR_NONO_BINARYpoints the shimbin/run.shat another binary (for example acargo build). - Upgrading keeps running agents: the mapping files and session names are unchanged, and a bridge that the Node version started is still recognised, stopped and cleaned up by the new binary.
doctor's escape probe runs asherdr-nono probefrom a copy of the binary inside its throwaway sandbox, so the profile no longer has to grant Node. Its result line reportsbinaryandbinaryVersionwhere it reportednode.- The overlay is rebuilt on ratatui: the same information and keys. Quitting
cancels the
nonoandherdrcalls in flight instead of waiting for them, and a startup error stays on screen until a key is pressed. scripts/run-action.shis a wrapper aroundherdr-nono run-action.- Releases are driven by release-please: it keeps a release pull request open that bumps the version
everywhere and updates this file, and merging it creates the tag and release, after which the same
workflow (
.github/workflows/release.yml) builds the binaries and attaches them withSHA256SUMS. -
Tests: the black-box suite in
test/drives the built binary; the modules have Rust unit tests, and the overlay has screen, key and pseudo-terminal tests. -
Sandboxes overlay:
itoggles a profiles view showing, for the selected agent (or the next launch), each sandbox's profile, where it comes from (shipped, a file, a nono user profile, built into nono), its file,extends, network, directory grants, socket mediation and description, plus the profiles the next launch uses and where to change them. - Docs: Profiles covers seeing the active profiles, extending a shipped profile with a registered nono user profile, and copying one; the README has a "Check the profiles" step.
-
Docs: Security explains, with a reproducible check, why
herdr pane runand the other Herdr socket commands cannot reach the host from either sandbox. -
Security: the server sandbox no longer allows every domain. nono's proxy forwards to any host the allowlist matches, localhost included, so
allow_domain: ["*"]let the agent's tools reach the unsandboxed OpenCode host service on127.0.0.1:4096. The shipped server profile (0.3.0) now allows GitHub Copilot (github.com,api.github.com,api.githubcopilot.com,*.githubcopilot.com) andmodels.opencode.aionly. start-agentandreconnectrefuse a server profile whose allowlist covers localhost ("*",localhost, IP addresses, single-label and.local/.internalnames, wildcard DNS services such asnip.io) even while no host service runs;doctorfails on them, and the overlay marks them+ LOCALHOST.doctor's escape probe listens on the host's127.0.0.1and tries that port directly and through nono's proxy under six loopback names (loopbackCanary,loopbackViaProxy).nonoArgsrejects network flags,--profileand--allow-cwd;agentEnvrejects theNONO_*variables nono reads as flags, and the plugin drops them from the environment it gives nono.test/integration-egress.test.mjs: integration tests against the real nono (skipped without it).-
test/integration-sandbox.test.mjs: real-nono tests for the rest of the confinement: host Unix sockets andherdr pane run, leaked variables,doctor's probe for both profiles, home directory writes, and the client/server port join, each with a control that removes the protection. -
Documentation site on GitHub Pages (MkDocs Material) with the page index in a left sidebar: eleven short pages, with dedicated pages for key bindings, the sandboxes overlay, changing the server and client profiles, and OpenCode's security model. The README links the site first and says early that the plugin is built for OpenCode.
justfilewithjust docs(live preview) andjust docs-build(strict build, as in CI).
0.5.0 (2026-10-10)¶
Features¶
0.4.1 (2026-10-10)¶
Bug Fixes¶
0.4.0 (2026-10-06)¶
Features¶
0.3.0 (2026-10-06)¶
Bug Fixes¶
0.2.0 (2026-10-06)¶
⚠ BREAKING CHANGES¶
- rust: HERDR_NONO_NODE and bin/node-path are gone; HERDR_NONO_BINARY points the shim at another binary. doctor reports binary and binaryVersion instead of node.
Features¶
- herdr plugin that runs OpenCode in nono sandboxes (c5ad6a2)
- interactive sandboxes overlay with client/server process view (e232515)
- profiles view in the overlay, profile docs, and real-nono socket confinement tests (#4) (1a2228c)
- rust: ship the plugin as a single Rust binary (#5) (4a0bbb6)
Bug Fixes¶
0.1.0 - 2026-09-29¶
Initial release.
- Actions:
doctor,install-keybindings,start-agent,reconnect,open-shell,stop,info,verify-sandbox,prune-mappings,sandboxes,list-sandboxes,forget-mapping. - OpenCode adapter that runs a private server per pane in one nono sandbox and the TUI client in
another, joined by a port and a password the plugin picks per launch, so every tool call runs
sandboxed and never in the host service;
reconnectresumes with--continue. profiles/herdr-opencode-server.json(egress only through nono's proxy, so no direct connects to localhost services such as the OpenCode host service) andprofiles/herdr-opencode-client.json(network blocked): thenolabs-ai/opencodepack plus pathname AF_UNIX mediation, stripped Herdr and socket variables, and no post-exit "grant denied paths" prompt.- Process-tree verification of every launch through
/proc, stopping sessions that fail it (onVerificationFailure), and on demand withverify-sandbox. - An escape probe in
doctorthat runs inside a sandbox with the configured profile. - Detection of the unsandboxed OpenCode host service. When a server profile leaves localhost
open, agents are not started while it runs (
hostServiceCheck: "refuse"), with a framed message in the pane and a toast, anddoctorfails;warnandoffare opt-outs. - An escape probe check that the tools cannot connect to the host service's port.
- Custom agents with their own command, nono profile and server pattern.
worktree.removedhook that stops the agents of a removed worktree and forgets their mappings.- An interactive
sandboxesoverlay (selectable table, details panel, keys to verify, stop and prune with confirmation), result marker line and stable error kinds for orchestration,scripts/run-action.shmatching its invocation bylog_id.