NodeMesh runs an agent on your machine. We know that deserves scrutiny — so here is exactly what it does, what it can't do, and how the channel between your box and ours is secured.
The agent runs on your hardware. NodeMesh is the control plane — it tells the agent what to do, but it does not hold your game data, your world files, or elevated privileges on your machine.
The relationship is deliberately one-directional: your agent registers with NodeMesh and opens a persistent gRPC stream. NodeMesh can only send the commands the agent's allowlist permits — nothing else crosses that channel. Your machine initiates the connection; nothing from the internet reaches it unless the traffic proxy is enabled for a specific instance.
The agent uses a dumb-terminal architecture: all game intelligence lives in the NodeMesh backend. The agent registers, sends heartbeats, executes a narrow set of permitted operations, and streams stdout/stderr back. It does not parse or interpret game protocol.
This is the headline security improvement shipped in the R4 hardening round (v0.2.13). The agent's Execute RPC used to allow bash, sh, java, steamcmd, and PowerShell. All of those except PowerShell have been removed from the allowlist. Linux game servers no longer use the Execute RPC at all.
All seven supported Linux games (Minecraft, Valheim, Hytale, Rust, Palworld, Satisfactory, Project Zomboid) install and launch via dedicated GameSetup and GameStart RPCs. These execute Go code directly — no shell in the middle. The install specification is a declarative JSON manifest; the agent resolves download URLs, verifies checksums, writes config files, and spawns the game binary — all in native Go with no intermediate shell interpreter.
Every agent is issued a unique credential at registration. No shared secrets, no bearer tokens that work across machines.
nodes.secret_hash. The plaintext is returned once in the registration response and never stored server-side.
x-node-id and x-node-secret metadata. Server-side interceptors validate via bcrypt on every RPC. Nodes without a stored hash are rejected — fail closed.
api.nodemesh.app:443 over TLS (Let's Encrypt certificate, Caddy-terminated). The gRPC listener and proxy control channel bind loopback only — they are never directly reachable from the internet.
The agent's manifest installer is constrained in two ways:
safeJoin, which resolves and prefix-checks the path against the instance directory. A manifest that tries to write outside its directory is rejected before any I/O occurs.
NODEMESH_DATA_DIR). Requests outside this boundary are rejected and the instance is marked stopped so the UI reflects the failure immediately.
The Linux install script (curl … | sudo sh) now fetches a SHA256SUMS manifest alongside the agent binary and verifies the download before it is installed:
SHA256SUMS is unavailable the script prints a warning and continues — this prevents install breakage when the checksum manifest hasn't been published yet for a new release.
SHA256SUMS file is served at GET /SHA256SUMS from the release directory on the same host. The deploy step generates it via sha256sum nodemesh-agent-* after building the release binaries.
We think honesty matters more than marketing polish. These are the things we haven't done yet:
These are the next planned security improvements. None of these are committed to a release date.
Open-source agent. Publishing the agent source under an open-source licence so the community can audit what runs on their hardware. Planned for after open beta.
Signed release binaries. GPG-signing agent binaries so the checksum file can itself be verified against a public key. Currently the checksum proves download integrity; signing would prove publisher authenticity.
Remove PowerShell from Windows agent. Migrate the Windows Minecraft path to the manifest-driven installer, eliminating the last Execute RPC user and removing PowerShell from the allowlist entirely.
Responsible disclosure policy. A published security contact and CVE-coordinated disclosure process once the agent is open-source.
Found a security issue? Email security@nodemesh.app. We read every message.