ENPLDEPT
Flash
All docs
Store · seller

Sell disk space to other node owners — the Sensmos Store agent for a NAS or home server

Other node owners need a place for encrypted backups. Your NAS, Raspberry or home server has space it never uses. The Store agent connects the two — you hold ciphertext you cannot read, answer a proof a few times a day, and are paid for every day the proof passes. Nothing goes through your node, nothing opens in your firewall.

Who this is for

A machine that is on anyway — a NAS, a Raspberry, a small home server, a box in a rack you already pay for — with a gigabyte or more of space you do not need, on the same LAN as a Sensmos node. Linux with Python 3, nothing to install beyond the script itself. Root is needed only to write the state file and the systemd unit.

A buyer is always another node owner: Store is internal trade between people who run nodes, not a public cloud. You never deal with the buyer directly; the backend picks sellers, moves the bytes and settles the days.

What you actually hold

Encrypted blobs. The buyer's app encrypts every file on the phone with a key derived from the buyer's wallet signature; what reaches you is ciphertext with a random id. You do not receive a key, a file name, or anything that identifies the buyer. There is no code path on your side that could decrypt — the agent is one readable file, look for yourself.

Quick start

Run this on the machine that will hold the data. It talks to your node once, over the LAN, and from then on to the backend only.

# 1 — get the agent (single file, standard library only)
sudo curl -fsSL -o /usr/local/bin/sensmos-store.py https://sensmos.com/ext/sensmos-store.py
sudo chmod +x /usr/local/bin/sensmos-store.py

# 2 — pair through your node: its LAN address, its PIN, a label, where to keep blobs, how much to offer
sudo sensmos-store.py --pair 192.168.1.50 --pin 123456 --name "NAS in the basement" \
                      --dir /srv/sensmos-store --capacity 100G

# 3 — install & start it as a boot-persistent service
sudo sensmos-store.py --install-service

# 4 — watch it
journalctl -u sensmos-store -f

Pairing prints OK — attachment …, token saved to /etc/sensmos-store.json. The service log then shows:

21:14:02 store agent store-py/0.1  dir=/srv/sensmos-store  capacity=100 GB  used=0.00 GB
21:14:03 connected as 3f9a1c2e

From that moment you are in the pool. The first buyer shows up in the log as put 7d0b… 18.1 MB … followed by put 7d0b… done, and proofs as proof 7d0b… block 3: answered (10 MB hashed).

The node's LAN address is in your router's client list; the PIN is the node's PIN from the app. The node has to be online (connected to the backend) at the moment of pairing — it relays your request and the backend's answer.

How you get paid

whatterms
price0.1 GALU per GB per copy per day — a package starts at 1 GB and grows by 1 GB; 10 GB is 1 GALU a day per copy
your share70%; 30% returns to the reward pool
paid forevery day a buyer's package is pinned to you and you were there for it: with their files on your disk, your copy passed a proof; while the package is still empty, your agent reported in that day — the space is reserved either way
not paid fordays offline or with a failed proof; days on which the buyer had no GALU — that day counts as arrears for the buyer (uploads paused, copies released after 14 unpaid days) and you are not paid for it

Settlement runs once an hour on the backend and books each (day, buyer, seller) once. GALU lands in your wallet's balance like any other service income.

Proofs — how the backend knows you still have the file

Three times a day per copy the backend picks a random 10 MB block of a random file you hold and sends a salt. Your agent hashes the block with the salt and answers with 32 bytes — no data moves, nothing is computed on our side. With two copies at two sellers, the two answers are compared with each other. When they disagree, or when only one copy is online, the backend asks for the raw block and checks it against the hash list the buyer supplied at upload.

Three failed proofs in a row and the copy is marked dropped: no more challenges, no more pay. There is no penalty beyond that — you simply stop earning on it.

Capacity and how sellers are chosen

  • --capacity is what you offer. It is not verified — a seller who declares more than they have fails proofs and earns nothing, which is the whole check.
  • What counts is free space in the backend's own ledger (what it has placed with you), not what your agent reports; the report every five minutes is informational.
  • A buyer's package starts at 1 GB and grows a gigabyte at a time at the same sellers, so every whole free gigabyte you offer can be sold.
  • Sellers are ranked by free space; the buyer's two copies always go to two different owners, and never to the buyer's own machines.
  • Once chosen you are pinned: every file that buyer uploads from then on lands with you, and when they buy an extra gigabyte it has to fit at your place. Their package moves nowhere on its own. A buyer can close it at any time: their files are deleted from your disk, the space is free again and the payments stop with that day.

To change what you offer, edit capacity_b in /etc/sensmos-store.json and restart the service. To stop selling, stop the service — without proofs your copies are dropped within a day and you leave the pool; the blobs in --dir are yours to delete.

Network

The agent dials out to sensmos.com over TLS and keeps that one connection. No inbound port, no port forwarding, works behind CGNAT. Transfers, proofs and deletes all arrive over the same connection.

Where you see it

Today: the service log. The app does not yet show seller statistics; that is being built, and this page will say so when it is there.

Flags

flagmeaning
--pair IP --pin PIN --name "…"one-time pairing through a node
--dir DIRwhere blobs are kept (default /var/lib/sensmos-store)
--capacity 100Gspace you offer; M, G, T suffixes
--install-servicecopy to /usr/local/bin, write and enable the systemd unit
--be URLalternative backend, for testing

The unit it writes:

# /etc/systemd/system/sensmos-store.service
[Unit]
Description=Sensmos store agent
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/python3 /usr/local/bin/sensmos-store.py
Restart=always
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

Pairing — the token

The agent has no credentials of its own. It asks your node (with the node's PIN, from inside the LAN) to vouch for it; the node relays the request to the backend, and the backend issues a token scoped to store.serve — serving Store sessions, nothing else. The token is stored in /etc/sensmos-store.json (mode 0600) and the agent renews it by itself. One node can vouch for up to four attachments. The full contract is on Attachments & the EXT API.

Updates

The agent never updates itself: it runs as root in your LAN, and a server that could push code to it would be a way into your network. To update, repeat step 1 and restart:

sudo curl -fsSL -o /usr/local/bin/sensmos-store.py https://sensmos.com/ext/sensmos-store.py
sudo systemctl restart sensmos-store

Early days

Store is new. While it is being tested, a package is a single copy rather than two, and the pool is small. Pricing per copy does not change when the second copy returns. If you set up a seller and nothing arrives for a while, that is the honest state of demand, not a fault on your side — say hello on Discord and we will tell you what the pool looks like.

Questions, straight answers

Can I read what I host?

No. The buyer encrypts every file on their own phone with a key derived from their wallet; you receive ciphertext, never a key, never a file name. The backend cannot read it either — it only relays bytes and stores the buyer's hash list.

What happens when my machine is off?

You earn nothing for that day. A proof that cannot be answered counts as failed; after three failed proofs in a row the copy is dropped. Today a dropped copy is not moved to another seller — the buyer's file stays on their remaining copy — so an always-on machine is the point.

How much do I earn?

0.1 GALU per GB per copy per day, of which 70% is yours: packages start at 1 GB and grow by the gigabyte, so a 10 GB package at your place is 0.7 GALU a day. Only on days a buyer holds a package with you and you were there for it: a passed proof once their files are on your disk, a daily report from your agent while the package is still empty. We make no promise about how many buyers there will be.

Can I offer 3 GB?

Yes. Packages start at 1 GB and grow one gigabyte at a time, so every whole gigabyte you offer can be sold — to three buyers with a starter package, or to one who grew to 3 GB.

Does my node need a radio or anything special?

No. Any Sensmos node on the same LAN, online, with its PIN. It only vouches for the agent once; afterwards it is out of the loop.

Is there a Docker image?

Not yet. The supported way is the systemd service on a Linux host.

Last updated: 2026-09-07