How to run a Bee node
Install it, fund it, store something, get it back.
Install it, fund it, store something, get it back.
They collectively provide censorship-resistant decentralized storage and communication services.
“Swarm's mission is to enable a self-sovereign global society and permissionless open markets by providing scalable decentralized storage infrastructure for Web3.”
| Someone else's node | Your own node | |
|---|---|---|
| Writing | Their account, their limits | Your postage batch |
| How long data stays | Whatever they paid for | You decide, and you can extend it |
| Endpoint | A remote API | http://localhost:1633 |
| Ceiling | What their API exposes | Everything Bee can do |
Reading from a public gateway needs nothing at all. It's writing — and deciding what stays — where your own node starts to matter.
No prior Swarm experience assumed.
| From here | What you have at the end of it |
|---|---|
| Install | bee and swarm-cli on your machine |
| First download | A running node — no funding yet |
| Funding | xDAI and xBZZ in your node's wallet |
| How it works | Batches, depth, amount — while it syncs |
| Buy and upload | A batch, and a file on Swarm |
| What breaks | The five expensive mistakes |
Every command is on this page. Stuck? discord.ethswarm.org
| Mode | Download | Upload | Shares disk | Needs funding |
|---|---|---|---|---|
| Ultra-light | Yes | No | No | No |
| Light | Yes | Yes | No | ~0.01 xDAI + ~0.20 xBZZ |
| Full | Yes | Yes | Yes | Plus stake |
“A ‘light' node can download and upload data from Swarm but does not share its disk space with the network and does not earn rewards.”
| What you need | What drives it | Best if | |
|---|---|---|---|
| Agent — demoed | Node.js 18+, Claude Code | /swarm | You want the tedium handled |
| Terminal | Node.js 18+, a shell | You, copy-pasting this page | You'd rather read than delegate |
| Desktop app | Just a laptop | A GUI | You don't want a terminal at all |
Windows: WSL2 first for the top two. The desktop app runs on Windows natively.
| Terminal fighting you | Swarm Desktop |
|---|---|
| No node at all today | Beeport (beta) — uploads from the browser |
Beeport uses someone else's node, so nothing you learn here transfers. Plan C, not a lane.
node --version && npm --versionv18 or newer. Anything older and Bee's tooling misbehaves in ways that look like network problems.
npm install --global @ethersphere/swarm-cliswarm-cli quickstartGrabs the right Bee binary for your platform. No sudo, no piping a script from the internet into your shell.
The documented installer, if you prefer it: curl -s https://raw.githubusercontent.com/ethersphere/bee/master/install.sh | TAG=v2.8.1 bash
bee versionExpect 2.8.1 or newer. Do not run 2.7.x — 2.8 was a breaking change.
If this prints a version, you're past the only genuinely fiddly part.
bee start \
--password YOUR_PASSWORD \
--api-addr 127.0.0.1:1633| Ultra-light mode | Downloads work now |
| Uploads need funding — next section |
swarm-cli statusThe node is waking up and finding peers. Wait, retry, don't debug it.
swarm-cli download <HASH>These slides are on Swarm. That's the hash — your brand-new node just fetched the thing you're looking at.
No account. No sign-up. No card.
| Download | Free tier — no batch needed |
| Upload | Needs a postage batch |
“Postage stamp batches represent *right to write* data on Swarm's DISC.”
| Token | Amount | What the docs say |
|---|---|---|
| xDAI | ~0.01 | “enough to start a light node” |
| xBZZ | ~0.20 | “enough to upload a small amount of data” |
Not Ethereum mainnet. Gnosis Chain.
| Route | Use it when |
|---|---|
| fund.bzz.limo | You hold crypto on any chain — no bridging, no swapping |
| CoW Swap · Jumper · Omnibridge | Buying xBZZ directly, or bringing BZZ over from mainnet |
| Gnosis faucet | You only need the xDAI for gas |
swarm-cli addresses # where to send itbee start \
--password YOUR_PASSWORD \
--swap-enable \
--api-addr 127.0.0.1:1633 \
--blockchain-rpc-endpoint https://xdai.fairdatasociety.orgSame password as before. Ctrl+C the old one first.
| Deploying a chequebook | “A chequebook contract will be automatically deployed when a Bee node is configured to run as a light or full node… Required for bandwidth payments.” |
| Reading chain history | Catching up on which batches have paid for what, so it knows which data the network owes you. |
depth | “determining data volume that can be uploaded by the batch” |
amount | “determining storage duration of data uploaded with the batch” |
swarm-cli calls it a stamp. Same thing.
| Depth | Capacity | 1 week | 1 month | 3 months |
|---|---|---|---|---|
| 17 | ~40 KB | 0.12 | 0.5 | 1.6 |
| 18 | ~6 MB | 0.24 | 1.0 | 3.2 |
| 19 | ~110 MB | 0.5 | 2.1 | 6.3 |
| 20 | ~680 MB | 1.0 | 4.2 | 12.6 |
| 22 | ~7.7 GB | 3.9 | 16.8 | 50.4 |
xBZZ, rough upper bounds. cost ≈ amount × 2^depth ÷ 10^16 — read the live price rather than hardcoding it: curl -s http://localhost:1633/chainstate | jq .currentPrice
| Buy | depth 17 — ~40 KB, about a week, ~0.12 xBZZ |
| Don't buy | depth 22 — ~4 xBZZ for the same week, and it fails on a thin balance |
Batches can be extended later, so starting small costs you nothing but a second purchase.
TTL is “the number of seconds before the chunks will be considered for garbage collection by nodes in the network.”
swarm-cli statusChainsync Δ under ~10 blocks and you're ready. Buying while it's still catching up is how you get a batch that doesn't work.
swarm-cli stamp create \
--capacity 40KB --ttl 1w --label first-stampBy the dials instead: swarm-cli stamp buy --depth 17 --amount <from live price>
Save the stamp ID. You'll paste it into everything from here on.
swarm-cli stamp listA batch has to propagate before the network will honor it. Uploading immediately looks exactly like a broken node.
echo "Hello Swarm" \
| swarm-cli upload --stdin \
--stamp <ID> --name hello.txtswarm-cli download <RETURNED_HASH>“The upload returns a Swarm reference hash, anyone with that reference can download the content.”
A feed address is the deliberate exception — “static addresses for your mutable content.”
| Buying more storage than you funded | Depth 17 ≈ 0.12 xBZZ. Depth 22 needs ~4 xBZZ for the same week. |
| Hardcoding the storage price | It's live. Read /chainstate. |
| Full-node code on a light node | Subscribing to incoming messages is the usual casualty. |
| Building “unsend” on ACT | “Grantees will be able to retrieve the content version they were granted access to… even if their access to newer versions were revoked.” |
| The SDK's version warning | Stale version string in bee-js, not a real problem. |
discord.ethswarm.org · docs.ethswarm.org
Nobody is impressed by suffering.
| Access control (ACT) | Encryption at the chunk level — grant access by wallet public key |
|---|---|
| Feeds | “Static addresses for your mutable content” |
| Websites | A folder with an index.html, hosted with nothing to patch |
| Messaging | GSOC and PSS |
Before anyone looks at it: swarm-cli stamp topup --stamp <ID> --amount <more> — a starter batch lasts about a week, and a dead batch looks exactly like a broken project.
links.ethswarm.org · docs.ethswarm.org · swarm-devrel.bzz.link · discord.ethswarm.org
# check
node --version && npm --version
# install
npm install -g @ethersphere/swarm-cli
swarm-cli quickstart
bee version
# run, unfunded
bee start --password YOUR_PASSWORD \
--api-addr 127.0.0.1:1633
swarm-cli status
swarm-cli download <HASH>
# fund — send xDAI + xBZZ to this
# address, on Gnosis Chain
swarm-cli addresses# run, funded
bee start --password YOUR_PASSWORD \
--swap-enable \
--api-addr 127.0.0.1:1633 \
--blockchain-rpc-endpoint \
https://xdai.fairdatasociety.org
swarm-cli status # Chainsync delta < 10
# buy storage
swarm-cli stamp create --capacity 40KB \
--ttl 1w --label first-stamp
swarm-cli stamp list # wait ~2 min
# prove it
echo "Hello Swarm" | swarm-cli upload \
--stdin --stamp <ID> --name hello.txt
swarm-cli download <RETURNED_HASH>
# keep it alive
swarm-cli stamp topup --stamp <ID> \
--amount <more>