Security

What we can show you.

This page is written for the person your organisation sends to check. It says what a node sends and to whom, what is encrypted and what is not, how to verify what you downloaded, how to report a hole — and, at the end, what we have not done.

What leaves a node

Two requests on a default install, both to us, both switchable off in config.yaml. Everything else happens only because you turned on the feature that needs it. There is no telemetry and no analytics of any kind — there was until September 2026, and it was removed rather than made quieter.

Goes toWhenWhat forTurn it off
meshhold.com every 6 h Update check. Fetches a manifest of current versions; sends nothing but the request itself. update_check.enabled: false
meshhold.com every 6 h Your public IP and country, so the Network page can show where your own nodes are. The answer is cached; the address is not stored on our side. ipinfo.enabled: false
meshhold.com on demand A diagnostics bundle, only when you press send on a bug report. Do not press it
musicbrainz.org, coverartarchive.org, api.acoustid.org on demand Music metadata and cover art, while enriching an audio library. Leave enrichment off
api.themoviedb.org, image.tmdb.org on demand Film and series metadata, same feature for video. Leave enrichment off
raw.githubusercontent.com on demand Public domain blocklists, if you switch on the tunnel ad-blocker. Leave the ad-blocker off
huggingface.co on demand Downloading a local model you asked for. Do not download one
Your AI provider on demand Whatever you send an agent, if you configure one. This is the one place where content can leave, and it leaves because you asked it to. Configure no agent
Your S3 endpoint, your webhook targets on demand Only the ones you configured, only where you pointed them. Do not configure them

An air-gapped node with those first two switched off makes no outbound connection at all beyond its own mesh. That is checkable rather than promised: the source is public, and the endpoints above are constants you can grep for.

What is encrypted

Between nodes

libp2p in private-network mode: a peer without your swarm key cannot finish a handshake, so the mesh is not reachable by strangers even before authentication.

On disk

A node created from scratch is encrypted at rest by default — the metadata store, the libp2p identity and your saved networks. An older node is not converted behind your back; it asks.

The master key

From the OS keystore: DPAPI, Keychain, Secret Service, Android Keystore. On a headless server it falls back to a key file bound to the machine id — enough that a copy of the data directory is not enough, not a defence against local root or a disk image.

The web UI

TLS on by default with a self-signed certificate on first start; bring your own or use ACME. Brute-force lockout per IP, optional TOTP, security headers on every response.

The details, including the parts that are your responsibility rather than ours, are in the security reference and the architecture spec.

Verifying what you downloaded

Every published artifact carries a SHA-256 on the downloads page and in the release archive. Check it before you install:

# Linux / macOS
sha256sum meshhold_linux_amd64.tar.gz

# Windows PowerShell
Get-FileHash .\MeshHold-Setup.exe -Algorithm SHA256

The artifacts are not cryptographically signed yet. A checksum served from the same site as the file protects against a corrupted download, not against that site being compromised. Signing is on the roadmap; until it lands, saying so is the only honest description.

Reporting a vulnerability

Write to meshhold@gmail.com, or open a ticket and pick Security report — it goes to the same person either way and is read before anything else in the queue. Please do not post it on the forum first.

What you get back

An acknowledgement within three days, and an honest assessment: whether we agree it is a problem, how bad we think it is, and when we can realistically fix it.

What we ask

Time to ship a fix before it is public. We will not argue about a deadline you set as long as it is a real one, and we will credit you in the release notes unless you would rather we did not.

No PGP key yet

There is no published key to encrypt a report to. If you need one before you can write, say so in a one-line mail and we will publish one — better than pointing at a key nobody has verified.

No bounty

There is no money behind a bug bounty and we would rather say that than run one that pays late. Credit, a fast fix, and a direct line to the person who wrote the bug.

What we have not done

  • No external security audit. Nobody independent has reviewed this code. If your process requires one, it does not exist and we will not pretend a code review by the author is the same thing.
  • No ISO 27001, no SOC 2, no DORA attestation. Those certify an organisation, and there is no organisation — MeshHold is a private project run by one person in Novi Sad, Serbia.
  • No signed releases. Checksums only, as above.
  • One maintainer. The response time to a vulnerability is whatever one person can manage. That is the honest bus factor, and it is the strongest argument for the next point.

What stands in place of all that: the source is public under AGPL-3.0, the protocol is documented, the data is on hardware you own, and nothing about the design requires us to keep existing for your deployment to keep working. You can audit it, fork it, or hire someone to do either — and none of that needs our permission.

Something here out of date, or a claim that does not survive checking? Tell us — a security page that has drifted from the code is worse than none.