MeshBay — Quickstart
This guide takes one Linux machine, turns it into a MeshBay node, creates a group over a directory on it, and invites a second person. It assumes you can use a terminal. It assumes nothing else.
For what each step means — and for everything this guide leaves out — read
USERGUIDE.md.
Scope. Linux only: Ubuntu/Debian and Fedora. Windows is covered by
PACKAGING-GUIDE.mdand is not repeated here. This guide uses meshbay.org as the hub; running your own isPACKAGING-GUIDE.mdplusHTTPS.mdandMAIL-SERVER.md.
What you are building
your machine meshbay.org your friend
──────────── ─────────── ───────────
meshbay-node ◄─── signalling ────► hub ◄─── sign-in ───► browser
holds the files accounts, or desktop
holds the group key group list, client
decides who is served introductions
│ │
└──────────── encrypted, peer to peer, direct ──────────────────┘
(your files never touch the hub)
Three things, and it is worth knowing which is which before you start:
| What it is | |
|---|---|
| The hub | An address book and a switchboard. It holds your account and your group's name, and introduces two machines to each other. It never sees a file, a message or a key. |
| The node | A daemon on your machine. It holds the directories you share and the key that encrypts them. It decides who gets served. This is the part you install. |
| The client | The web app the hub serves, or the desktop application. This is what you and your members look at. |
Before you start
- [ ] A Linux machine that stays on. Your files are served from it, so a laptop that sleeps is a group that is offline half the time. A spare mini-PC, a home server or an always-on desktop is the right shape.
- [ ] A directory to share, with something in it.
- [ ] An email address you can read — account sign-up sends a code to it.
- [ ] About half an hour, plus however long a first index takes — which depends on how much you are sharing, and does not need watching.
- [ ] Terminal access to that machine. Everything below works over SSH; no graphical session is needed on the node.
You do not need a static IP, a domain name, port forwarding, or a router you control. Two residential ISPs have been measured working without any of it.
Step 1 — Download the packages
From https://meshbay.org/downloads, take the ones for your distribution:
| Ubuntu / Debian | Fedora | |
|---|---|---|
meshbay-common — required, install it first |
.deb |
.rpm |
meshbay-node — the daemon that hosts your files |
.deb |
.rpm |
meshbay-client — the desktop application, optional |
.deb |
.rpm |
You need the first two. The desktop application is worth having if this machine has a screen, but nothing in this guide requires it: a terminal and a browser are enough.
Put them in one directory — the next step installs them together.
Step 2 — Install
Install with your package manager, not with dpkg -i / rpm -ivh. Both of
those ignore weak dependencies, and the video drivers that let this machine
re-encode a film without melting are weak dependencies.
cd ~/Downloads # wherever you put them
# Ubuntu / Debian
sudo apt install ./meshbay-common_*.deb ./meshbay-node_*.deb
# Fedora
sudo dnf install ./meshbay-common-*.rpm ./meshbay-node-*.rpm
Add ./meshbay-client_* to that line to install the desktop application too.
meshbay-common carries everything the others need, so there is nothing else
to install and no Python environment to set up. ffmpeg, required for video
streaming, comes in as a recommended dependency of the command above; without
it the node refuses to start and says so.
Check it landed:
meshbay-node status
It will report that there is no keystore. That is the next step.
Step 3 — Create your account
Open https://meshbay.org in a browser and register.
Three things on that page are worth slowing down for:
- Your passphrase is not a password. It never reaches the hub. It encrypts the copy of your identity keys that lives on every node you join, and nobody — not the hub, not an operator, not us — can reset it. The floor is 12 characters; four unrelated words is the shape that actually works.
- Your recovery key is shown exactly once. It is a 32-byte secret that can restore your access to your groups if you forget the passphrase. Put it in a password manager before clicking past it. Lose both it and the passphrase and your files are still there — but every group has to be rejoined by hand, with a new identity.
- Verify your email. A code arrives; the account is inactive until you enter it.
Step 4 — Set up the node
Back on the node machine:
meshbay-node init
It asks for the hub URL (press Enter for https://meshbay.org) and your hub
username. Then it writes ~/.config/meshbay/node.toml, creates the keystore,
and prints something like:
Node key: 7mK2p...base64...=
Copy that key. In your browser, on meshbay.org: Profile → Link Node, paste it, submit. It is on the Profile page, not Settings — next to your passphrase and recovery phrase, which is where everything tied to your identity rather than to this browser lives.
This is what lets the hub introduce your members to this machine. It is a public key; it identifies the node and unlocks nothing.
If you lose it, meshbay-node status prints it again at any time. Those are the
two places it can be read — that command, and Node → Overview in the desktop
client. A browser cannot reach the node's own control API, so it cannot show you
the key; pasting it here once is what a browser-only operator does instead.
Step 5 — Start the node
systemctl --user enable --now meshbay-node
loginctl enable-linger $USER # keep serving when you are not logged in
enable-linger is not optional on a machine you reach over SSH. Without it,
systemd stops your user services when your session ends — the group goes dark
the moment you disconnect.
Check:
meshbay-node status
You want to see daemon running. If not:
journalctl --user -u meshbay-node -f
If your files live outside your home directory
The node unit is hardened: it can only write inside ~/.config/meshbay and
~/.local/share/meshbay. An external drive or a second partition needs a
drop-in, and it needs both lines:
mkdir -p ~/.config/systemd/user/meshbay-node.service.d
cat > ~/.config/systemd/user/meshbay-node.service.d/paths.conf <<'EOF'
[Service]
ReadWritePaths=/mnt/library
RequiresMountsFor=/mnt/library
EOF
systemctl --user daemon-reload
systemctl --user restart meshbay-node
RequiresMountsFor matters as much as ReadWritePaths. The service runs in its
own mount namespace, so a volume mounted after it started is invisible to it —
and the symptom is a directory that reads as empty while everything else looks
correct.
Step 6 — Create the group
In the browser, on meshbay.org: Create group in the sidebar.
- Name — anything. It is shown to members as
name@yourusername. - Join policy — leave it on Invite only. The alternative, Open, lists the group publicly and lets anyone in, including the hub. There are groups that want that; a first one is not it.
- Description — optional, shown to members on their home page.
The group now exists on the hub and has no files, no key and no host. The next step is all three.
Step 7 — Hand the group to your node
Back on the node machine. Use the same name you just typed:
meshbay-node group add "Family Photos" --dir ~/Pictures/shared
meshbay-node reload
meshbay-node gek init --group "Family Photos"
What those three did:
group add |
told the node to host that group, and made the directory its first shared folder. It is read-write by default, so members can upload into it. Add --no-writable if you want a published, read-only library. |
reload |
made the running daemon re-read its config without dropping anyone. |
gek init |
generated the group's encryption key. Nothing works before this — the key never leaves your node, and every member receives it wrapped for their own key, on every connection. |
The node starts indexing immediately. A large library takes a while; you can
watch it with meshbay-node status or in the group page, which shows the
progress.
Want more than one directory in the group?
meshbay-node root add /mnt/library/films --name Films
meshbay-node root add /mnt/usb/archive --removable # external drive
meshbay-node root list
Roots added later are read-only by default — the opposite of the first one,
deliberately. Pass --writable if members should be able to upload there.
Step 8 — Pair your browser
Your node does not take orders from the hub. Before your browser can invite anyone or delete a file, the node has to recognise it:
meshbay-node operator pair
It prints a code like R3H8-TB6V, valid 24 hours. In the browser, open your
group → Members tab → enter the code.
The code never passes through the hub. That is the whole point of it: a hub that could name your operator key could make itself your node's administrator.
Step 9 — Let people reach you
WebRTC picks a fresh UDP port per connection, so there is no single port to forward. What the node needs is to accept unsolicited inbound UDP on your LAN — browsers announce themselves with an address the node cannot resolve, so the browser must be able to call the node, not the reverse.
# Ubuntu — your LAN, never "anywhere"
sudo ufw allow from 192.168.0.0/16 app "MeshBay Node"
# Fedora — apply to the zone holding your LAN interface
sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-service=meshbay-node
sudo firewall-cmd --reload
Scope it to the LAN. This profile opens UDP 1024-65535; it does not belong in an internet-facing zone. Members outside your network are reached by hole punching, which needs no open port at all.
The node's own admin surface is not affected: it listens on loopback only, behind a token, and is never network-exposed.
Step 10 — Invite someone
Your friend needs a meshbay.org account first — send them to Step 3. Then, with their username:
meshbay-node member invite alice_dupont
You get:
INVITATION CODE K7P2-9WQX
valid until 2026-09-25T17:40:00Z
Send that code however you normally talk to them — message, mail, out loud. It works once, for that account only, for that group only, and the hub never sees it. You do not need to be online when they use it.
Someone with no account yet gets a link instead, bound to their e-mail address:
meshbay-node member invite alice@example.org --link. They open it, register
with that address, and land in the group without typing a code
(USERGUIDE.md §7).
You can do the same thing from the Members tab of the group, from the browser you paired in Step 8. There, Send the invitation by e-mail is ticked by default and has the hub mail the code for you — which means the hub reads it. Untick it and share the code yourself when that matters; the box remembers.
Step 11 — What your friend does
- Signs in at https://meshbay.org.
- The group is already in their sidebar — creating the invitation registered their membership.
- They open it and are asked: "This node needs to recognise you." They paste the code.
- That is it. Your node pins their key, wraps the group key for it, and their files appear.
They will not be asked again on that browser. A different browser on the same node recovers the same identity with their passphrase alone. A different node — someone else's group — asks for a code again, as first contact always does.
Did it work?
meshbay-node status
A healthy node reads roughly like this:
hub https://meshbay.org (user yourname)
node key 7mK2p...=
daemon running — ok
node_id 82.65.x.x:0
groups 1 files 4213 peers 1
config /home/you/.config/meshbay/node.toml
group Family Photos [private] 8f3c...
shared → /home/you/Pictures/shared (rw)
operator yourname key AAAC3NzaC1lZDI1… paired 2026-09-18T14:02:11Z
If a line is missing, status names the command that fixes it. The four that
catch most people:
| Symptom | Cause |
|---|---|
daemon not running |
Step 5, or a startup error in journalctl --user -u meshbay-node |
operator NONE PAIRED |
Step 8 — invites and file deletion are refused until this is done |
an action needed: block naming a group key |
Step 7's gek init was skipped — meshbay-node group list shows it as NO KEY |
| Group shows files to you, nothing to a member | The member never redeemed a code, or the firewall in Step 9 |
Where to go next
- Point Videos, Music and Photos at their folders. Group → Settings — as many folders as each library needs. Until you do, those tabs stay empty and say so.
- Turn off the applications you do not want. Group → Members → Applications. Files and Settings always stay.
- Add your other devices. Your phone's browser, the desktop application: each one asks to be recognised, and you approve it from a device already linked. Nobody else is involved.
- Read
USERGUIDE.md— what each application does, how members are managed, what happens when someone leaves, what is private and what is not, and what to do when something breaks.