Changelog
Notable user-facing changes to the noBGP router and agent. Router and agent are versioned independently — a router version and an agent version that share a number are unrelated.
Agent 0.4.36 — July 2026
Configuration file
- An upgraded node now tidies its config file on the first restart. 0.4.35 changed the file to record choices rather than defaults, but only rewrote it the next time the agent had something of its own to record — the mount point, a learned QUIC value, the local MCP port. On a settled node none of those fire again, so a node upgraded to 0.4.35 kept its pre-upgrade file: every default still frozen in as an explicit setting, retired keys still present. The agent sweeps the file when it starts now. No effective setting changes either way. See Configuration File.
- The file is touched only when its contents would differ. A rewrite that would produce the same bytes is skipped, so on a node whose config is already correct — the usual case once it has been swept — startup changes nothing, not even the file's timestamp. Removing retired keys is atomic too, closing the same truncate-then-write window 0.4.35 closed for the main write path.
Router 0.4.35 — July 2026
File search
fs_grepis on MCP. It had been reachable only over REST — registered, working, and in no client's tool list. AI clients can now search a node's files with an RE2 regex directly. Reconnect your MCP client after the upgrade so it picks the tool up.- Results arrive one of two ways, and you choose. Send no
progressTokenand the response carries every hit inmatches[]. Send one — which is how a client declares it consumes notifications — and each match arrives as anotifications/progressmessage as the walk finds it, with the response settingstreamed_as_progress: trueand omittingmatches[]rather than sending everything twice. Either waycount,scanned_files,truncatedandduration_msare populated, so readcount, not the length ofmatches, to know whether a search found anything. Seefs_grep. fs_grepworks from a node's own local server too, at theobservetier, where it is always synchronous: that endpoint has no channel for a mid-call push, so it ignores aprogressTokenand returns the complete result — the same thing a caller that sent no token gets. The two surfaces differ by authority, never by transport.
Event bus
- New tool:
fs_grep_subscribe— the same RE2 walk across a whole cohort, delivered through the event bus instead of one big response. It returns immediately with asubscription_id; matches arrive as events attributed bysource_idto the node each one is on, read withevent_tailand ended withevent_unsubscribe. Like a command dispatch it always ends: every node reports once, andoutstanding: 0inevent_tail's progress block means the search is complete. Available at theobservetier on a node's own server, and the only way to read search results incrementally there. See Searching a fleet. event_subscriptionsnow reportsgrepas a fourth subscription kind, alongsidefs,commandandpresence.
Agent 0.4.35 — July 2026
Configuration file
- The config file records choices, not defaults. A key is written only when its value differs from the default; everything else appears as a commented
# key: valueline under a short block explaining that uncommenting one pins it. Older agents froze every default into the file the first timenobgp configran, so a node carried explicit values nobody chose — and a later change of default could never reach it. A 0.4.35 agent tidies that on its next write, with no change to any effective setting. The file is agent-generated: hand-written comments do not survive a rewrite, and keys the agent no longer reads are swept out with a note naming their successor (event-sources→allow-tools,event-watch-roots→allow-roots). See Configuration File. - The file is replaced atomically. It now holds things a node cannot re-derive — the overlay slice, the local MCP port and token, the learned QUIC endpoint — and the old write truncated before it wrote. An upgrade restart or a power cut inside that window brought the node back without them, re-minting an MCP token every
nobgp mcp installregistration had frozen into a client config, and re-picking an overlay slice.
File search
fs_grepworks again on nodes with a configureduser. Agent 0.4.34 moved file work onto a privilege-dropped worker and refused the incremental (streaming) form offs_grepthere, which is most nodes — registration setsuserto the installing account. The call now falls back to returning the whole result in one response instead of being refused; the only difference from a search that runs as the node's own identity is that matches arrive when the walk finishes rather than as they are found.
Agent 0.4.34 — July 2026
Execution identity
- This is the agent release that implements the two identities. The
adminflag oncommand,command_subscribe,fileand published terminals shipped router-side in 0.4.33; a node has to be on agent 0.4.34 for it to mean anything. An older agent ignores it and runs the work as its configured user — soadmin: trueagainst a node you have not upgraded does not elevate, it just fails to. The skew is safe in both directions: neither side ever elevates on its own. - File operations really do drop privilege now. The agent changes identity before it opens the file, so ownership and permissions are the ones that account would get, and the atomic rename that finalises a write is checked against it too — a caller cannot create bytes as one account and land them somewhere only another could write. Until this release the file tools ran as the agent itself and merely checked whether the account could have done it, which is why a path readable through
fs_readcould be denied throughcommandon the same node. - An agent that is not running as root cannot act as
user. Assuming another account is a superuser privilege. On a node where the agent runs unprivileged — a foregroundnobgp agentstarted by an ordinary user — a file operation that would run asuseris now refused, naming the reason, instead of running as the agent's own account. Either run the agent as root or clearuser. Command sessions already behaved this way, and service installs are unaffected.
Node access control
- The file tools never serve the agent's own directory. Every path inside
/etc/nobgp(/usr/local/etc/nobgpon macOS,C:\ProgramData\nobgpon Windows) is refused to thefstools and fs watches, with symlinks resolved first. Noallow-rootsvalue opens it and neither doesadmin: true. That directory holds the node's network key, its JWT and the config the capability keys are read from — with the permissive defaults, all of it was onefs_readaway, and a caller holdingfscould edit away the veto meant to confine it.commandis unchanged: a session running as an account that can read those files still can. See Node Access Control. allow-admin: falsenow refuses the two cases it always claimed to. The setting is documented as refusing anything that resolves to uid 0, but a request that asked for no particular privilege was still served as root on the nodes where that is the fallback — a container, a bare-root install — and so was work on a node whose configureduseris itself a superuser account. Both are refused now. If you have such a node carryingallow-admin: false, remote execution on it stops working on upgrade, which is what the setting has been describing all along; give the veto somewhere to land withsudo nobgp config --user=<account>first.- Windows:
allow-admin: falsenow covers file operations too. Since 0.4.33 it refused commands and terminal sessions there, but every file operation was still served as LocalSystem. It is one answer for all of them now. - The lockout warnings say what is actually true. The
nobgp configwarning and theallow.warningfield innobgp statusused to claim a published terminal service was unaffected by these keys. It has not been since 0.4.33; both now state plainly that terminal services are refused along with the tools and that the way back in is on-device.
Router 0.4.33 — July 2026
Command execution
- One boolean now decides who work runs as.
usernameis gone fromcommand,command_subscribe,service_publishandservice_update, replaced byadmin: a node offers exactly two identities and this picks between them. Omitted orfalseruns as the account the node's owner configured;trueruns as the node's ambient identity, which a node set toallow-admin: falserefuses rather than downgrades. Calls that still passusernameare rejected withinvalid_args— replaceusername: "root"withadmin: true, and drop the field everywhere else. Reconnect your MCP client after the upgrade so it refetches the schemas. See Execution identity. - Why the account name went away. It never meant one thing:
rootcould be a spelling or a user id, and on Windows the agent ignored the name entirely and ran as LocalSystem — so a session asking for another account had never once run as it. Two identities is also what makes Windows parity reachable. To run as some third account, usesuorrunasinside the command itself. - File operations now run as that identity too, and
filetakesadmin. The agent drops privilege before opening the file, so ownership and permissions are the ones that account would get — a file written withadmin: falseis owned by the node's configured user, not by root. Previously the file tools always ran as the agent's own account, which is why a path readable throughfs_readcould be denied throughcommandon the same node. The per-opfs_*tools carry noadminand always act as the configured user; usefilewhen an operation needs elevation.
Published terminals
- Terminal services that named an account have moved to one of the two identities. A terminal published with
username: "root"now carriesadmin: trueand behaves exactly as before. Every other named account now runs as its node's configured user — less privileged than what it asked for, which is the safe direction, and on Windows the direction it was already running in. Terminals that named no account are unaffected. If one of yours needs elevation, setadmin: truewithservice_update.
Discovery
network_directoryreports whatadminwill mean on each node. Each node'sinfoblock now carriesuser— the account unelevated work runs as, empty when none is configured, which is the case worth noticing becauseadmin: falsethen resolves to root — andallow_admin,falsewhen the node's owner refused elevation outright. Both are set on the node only, and both are absent on agents too old to report them; absent is not the same claim as empty orfalse. See network_directory.
Agent 0.4.33 — July 2026
Node access control
- A node's capability settings now govern published terminal services too.
allow-toolsandallow-adminpreviously bounded only the MCP tools and event-bus sources; a terminal service published to run as root therefore handed out root on a node whose owner had setallow-admin: false. One rule applies to every execution surface now: a node that no longer serves thecommanddomain refuses the browser terminal, and an elevated terminal is refused rather than quietly run as another account. If you narrow a node behind CGNAT, plan for on-device access first — see Node Access Control. allow-admin: falseis honoured on Windows. Windows has no unprivileged identity to drop to, so earlier agents logged that they could not apply the setting and kept admin enabled. It is now honoured as the only answer the platform can give: remote execution on that node is refused entirely. Existing Windows nodes carryingallow-admin: falsein their config will stop serving remote execution on upgrade.nobgp configchecks the two identity settings before it writes them.--usernaming an account that does not exist is refused at the point of setting, instead of failing at every session later; on Windows--useris refused outright, since there is nothing to switch to.--allow-admin=falsesays what it costs — with auserconfigured it states that sessions will run as that account, and where it turns remote execution off entirely it asks for confirmation (a scripted run proceeds with a warning in the log).- The
--userhelp text said the opposite of what the agent does. It described--useras a restriction that only applies underallow-admin: false. It is the default account for command sessions, dispatched bus commands and file operations whenever the caller names none — registration sets it to the installing account, so an ordinarysudoinstall has never run sessions as root.allow-admin: falseadditionally pins work to it. The CLI reference has the corrected description.
Two user-facing messages shipped in this release still describing the old scope — the nobgp config warning and the allow.warning field in nobgp status both said a published terminal service was unaffected. Corrected in agent 0.4.34; on 0.4.33 treat on-device access as the way back.
Router 0.4.32 — July 2026
Command execution
- One field now decides who a command runs as. The
adminoption is gone fromcommandandcommand_subscribe; naming the superuser (username: "root") is how you ask for elevation. The pair existed because "Administrator is not a user" on Windows — a distinction the agent already enforces by refusing ausernamethere outright, so it did not need to reach every caller. Calls that still passadminare rejected withinvalid_args— replaceadmin: truewithusername: "root". Everything else is unchanged: the default is still the node's configured user (not root), andallow-admin: falsestill refuses an elevated request rather than downgrading it. See Execution identity.
Landing pages
- Opening an API host in a browser now lands on the documentation instead of a 404.
https://mcp.nobgp.com/mcp— an MCP endpoint, not a web page — sends a browser to the MCP section, as does the baremcp.nobgp.com; other API hosts send it to the docs home. Only requests that ask for HTML are redirected, so MCP clients and API callers are untouched.
Agent 0.4.32 — July 2026
Command-line privileges
nobgp service logsnow requires root, like the rest ofnobgp service. Run unprivileged, it asked the systemd journal for logs as the calling user — which returns only that user's own messages, so the agent's lines were missing with nothing to say they were missing rather than absent. On Linux and macOS the command re-executes itself undersudo; on Windows run it from an Administrator terminal. The full rule, and which commands need root, is now written down in Root privileges.- Windows privilege refusals now say what to do. Commands that need Administrator rights on Windows do not self-elevate — a console cannot raise its own privileges, and a UAC re-launch would move the output and the exit code to another window. The refusal now names the exact command to repeat from an Administrator terminal and points at the local MCP server's
statustool for read-only state without privileges. Windows installs are unchanged: the installer still requests UAC elevation for you. nobgp listno longer reports a configured node as having no profiles. When the profile directory cannot be read, the command now fails naming the directory and the reason instead of printingNo profiles found.
Agent 0.4.31 — July 2026
Installation
- Fixed:
brew install nobgp/tap/nobgpfailed on macOS. The formula pointed at a download path that is no longer published, so every Homebrew install failed to fetch the binary. Re-run the install command — nothing needs cleaning up first. Installs through the install script were unaffected. - The floating
latestdownload path is retired. Every installer andnobgp upgradealready resolves the version to install from the router's release channel, so nothing changes for a current agent. Agents older than 0.3.80 used the retired path for manual upgrades and will now fail with a download error — reinstall those hosts with the install script.
Diagnosing interference from other software
- Certificate errors now name what caused them. When antivirus HTTPS scanning or a corporate proxy re-signs a connection, the install scripts and the agent report the certificate's owner — products identify themselves there — and point at the new Security software and VPNs guide, instead of failing with a bare validation error.
nobgp statusreports interference it can see from the box.router.tls_interceptednames anything re-signing the control channel, and a newenvironmentblock lists other products' active VPN adapters (tunnels) and third-party antivirus/firewall software (security_products). Both are deviation-only: on a clean machine nothing is added to the output.
Fixes
- Windows: the network drive no longer disconnects and remaps every 30 seconds. Drive mappings belong to the logon session that created them, so the agent's health check could not see its own mapping once it moved into the desktop session and tore down a perfectly healthy mount, over and over. The check now runs in the session that owns the mapping, and
fs.mountedinnobgp statusreports the real state. - Linux: applications with strict DNS resolvers no longer fail on public names. On hosts where the agent has to sit as the first nameserver in
/etc/resolv.conf, non-overlay lookups are now forwarded to the machine's own nameservers instead of being refused. Resolvers that treat a refusal as fatal (Node.js, Bun) could not resolve anything on those hosts. See DNS & hostname resolution. - Fewer false alarms in the new environment diagnostics. A DSL or mobile-broadband uplink and the Windows Teredo/ISATAP pseudo-adapters are no longer reported as third-party tunnels, and
nobgp statusno longer waits on the operating system's security-product query, which could stall the whole command on an unhealthy Windows host.
Router 0.4.31 — July 2026
Reliability
- A single message the router can't act on no longer drops a node's control channel. A malformed request, or a message type a newer agent sends that an older router doesn't handle yet, is now logged and skipped instead of ending the connection. Only a channel that genuinely can't do its job — a read failure, or a write the router can't complete — disconnects a node.
- Router-side disconnects are no longer shaped like credential rejections. When the router closes a connection for an operational reason, the agent receives it as a normal close that still carries the reason into the agent's local log, so a routine disconnect can't be misread as a deleted node or a revoked key and stop the agent from reconnecting. Genuine rejections — revoked credentials, an unsupported agent version, and the duplicate-instance flap guard — are unchanged and still reported as rejections.
Agent 0.4.28 – 0.4.30 · Router 0.4.28 – 0.4.30 — July 2026
Node access control
- Fixed: a whole-filesystem
allow-rootsentry matched nothing on Windows. - Node grants no longer carry an expiry — a grant stands until it is revoked.
Installation
- Fixed: the Windows installer failed before downloading anything. Any install that didn't pin
NOBGP_VERSIONstopped while looking up the version to install, after printing the banner and the detected architecture. Re-run the one-line installer — no cleanup needed. - One published command, every shell. The single
powershell -NoProfile -Command "irm ... | iex"line is the only Windows installer; it runs as-is in Command Prompt, PowerShell 5.1 and PowerShell 7. The separateinstall.cmdvariant is retired — update any bookmarked command that still points at it. - RPM-based installs now prefer
dnfwhen available.
Reliability
- Fixed: one offline peer could disrupt other nodes' control channels on the same router.
Agent 0.4.19 – 0.4.27 · Router 0.4.24 – 0.4.27 — July 2026
Node access control
Three settings let a node's owner narrow what the node serves remotely, enforced on the box itself. See Node Access Control for the full model.
allow-tools— which capability domains the node serves (fs,command). Replaces the earlierevent-sourceskey, which governed only the event bus; the new setting governs the MCP file and command tools as well, so one answer covers every programmatic caller. Existingevent-sourcesvalues are migrated automatically, and the migration can only preserve or widen access — never narrow it.allow-roots— which filesystem roots thefstools and fs event source may touch. Replacesevent-watch-roots, with the same migration behavior.allow-admin(new) — whether work may run as root / Administrator. When false, execution drops to the account named by--user, and an explicit request for root is refused rather than silently downgraded. On Windows, where the service runs as LocalSystem with no unprivileged account configured,allow-admin: falseis refused at startup with an error and admin stays enabled — use the router-side node grant to restrict access instead.
All three default permissive, and all three appear in nobgp show and nobgp status.
Scope, stated plainly: these settings govern the programmatic surface — the MCP tools your assistant calls and the event-bus sources the router dispatches. They do not govern a published terminal service, whose command and user are fixed when you publish it. That exemption is deliberate: it keeps a locked-down node recoverable through its terminal instead of requiring physical access.
Command execution
- Choosing who commands run as.
commandandcommand_subscribenow take the same pair of options:admin(run elevated — root on Unix, the service's Administrator context on Windows) andusername(a specific account, Unix only). Setting both is an error. - Fleet dispatches no longer run as root by default.
command_subscribepreviously ran every dispatched command as root with no way to choose otherwise; it now defaults to the node's configured user, matching the single-nodecommandtool. If you rely on dispatched commands having root, addadmin: true. nobgp notifyworks from dispatched commands. Scripts run by the event bus can callnobgp notifydirectly — the agent's directory is on their PATH, and the local API socket is reachable by the account those commands run as.
Event bus
- Overflow says which side overflowed. When a node's buffer or the kernel's event queue fills, the terminal
overflowevent now carries a reason instead of only a status. - Subscriptions report the nodes they matched. Every subscribe call returns the resolved node list, not just a count — so you can see what a selector actually matched without creating a throwaway subscription.
- A zero-match selector says so rather than returning a success-shaped empty result.
archselectors accept either spelling.arm64/aarch64andamd64/x86_64now mean the same thing; previously the value shown everywhere else in the product matched nothing here.- Command results always carry
exit_code, including zero. Previously a clean exit reported no exit code at all, which was indistinguishable from "still running".
Tools and reliability
- Fixed: array and number arguments were rejected from some clients. Tools taking lists (
node_names,watches) or numbers (idle_timeout) could not be called from Claude Code. Reconnect your MCP client to pick up the corrected schemas. - Fixed: reading events could lose them. A failed
event_tailresponse discarded the batch it could not deliver; the events are now restored and redelivered on retry. - Node references are easier. Tools accept a node name without a network name when the network is unambiguous, and
status/resolvenow return node IDs — so there is a path from a name you know to the ID the tools take. fs_statacceptsallow_missingandfs_deleteacceptsforce, matching thefiletool they project.- Clearer errors. Your command output no longer appears in noBGP's server logs;
nobgp notifydistinguishes a permission problem from a stopped agent; failed writes name the file you asked for rather than a temporary one. nobgp showcorrected. Theallow-*settings printed twice in two different formats, and aquic-routervalue left behind by older versions was displayed as though it were an active override — it is ignored by the agent, and the line contradicted the endpoint reported directly beneath it. Both fixed;nobgp statuswas unaffected.whoamino longer reports an empty email for calls arriving through a node — the field is simply absent there, withnode_contextidentifying the node. Reconnect your MCP client after upgrading the router, or it will reject the new response shape until it refetches.
Documented behavior worth knowing
- Filesystem events differ by platform. On macOS, event paths come back with symlinks resolved (
/tmp/xreports as/private/tmp/x), and a file created then immediately written may report only the create. Linux reports distinct operations on unresolved paths. - Commands run through the login shell on Unix (bash, sh or zsh depending on the host), not a fixed
sh. - File tools and command tools may run as different users on the same node, so a file readable through
fs_readis not necessarily readable throughcommand.
Platform fixes
- macOS: fixed service installation, which could leave a freshly installed agent without a running service.
- Windows: installer now forwards all
NOBGP_*environment variables when elevating; file replacement retries when the target is briefly open. - Linux:
install.shworks on headless hosts and quotes its environment passthrough correctly. - Upgrades: an unpublished version now says so instead of reporting a permissions error, and the download is checked before you are prompted.