self-deploy
run your own relay. your server, your rules. free, forever. one binary, agpl, unlimited devices and storage.
what you get
shizumu syncs through a relay: a small server that passes end-to-end encrypted blobs between your devices. it never sees your writing — only ciphertext. self-deploy means you run that relay yourself, so nothing touches anyone else's machine. it is the same binary we run for the hosted tier, with no separate database service to manage.
what you need
- a small linux server. a low-end vps or a pi-class box is plenty.
- a domain or subdomain pointing at it.
- https in front. the app refuses a plain http relay, except on localhost.
- rust 1.95 or newer to build, or the docker image.
get the relay
git clone https://github.com/shizumu-app/shizumu-relay
cd shizumu-relay
cargo build --release
# the binary lands at target/release/shizumu-relay a dockerfile and a docker-compose example ship in the repo if you prefer containers.
bootstrap your user
the relay is single-user by default: one account, your devices. create it once. the command prints a one-shot enrollment token, valid for an hour.
shizumu-relay init-user --pub <your-device-pubkey>
# prints user_id and enrollment_token the app shows the device pubkey in settings, sync, when you choose "my own relay".
run it
configuration is a few environment variables. keep them in a root-owned file such as /etc/shizumu/relay.env, mode 600.
SHIZUMU_BIND=127.0.0.1:8080
SHIZUMU_DB=/var/lib/shizumu/relay.db
SHIZUMU_STORAGE=fs:///var/lib/shizumu/blobs storage backends: fs for a real disk, sqlite for a single-file nano deploy, s3 for minio, garage, r2, or any s3-compatible store. the index always lives in relay.db.
run it under systemd so it survives reboots:
[Unit]
Description=shizumu relay
After=network-online.target
[Service]
EnvironmentFile=/etc/shizumu/relay.env
ExecStart=/usr/local/bin/shizumu-relay serve
User=shizumu
Restart=on-failure
[Install]
WantedBy=multi-user.target put it behind https
terminate tls in front of the relay. caddy is the shortest path:
sync.example.com {
reverse_proxy 127.0.0.1:8080
} with nginx, allow attachment-sized bodies — the client sends up to 100 mb, so the proxy limit must sit above it:
client_max_body_size 110m; point the app at it
open shizumu, settings, sync, and choose "my own relay". set the relay url to https://sync.example.com and paste the enrollment token on your first device. add each other device with the short pairing code the first one shows. your writing now syncs through your own server, end to end encrypted.
backups and upgrades
back up relay.db (litestream works well) and the blob store; both hold only ciphertext. to upgrade, pull, rebuild, restart — migrations run on start. the full operator handbook, including log redaction, monitoring, and maintenance commands, lives in the repo at docs/operator.md.
the deal
self-deploy is free, forever, under the agpl. the hosted tier exists for people who would rather not run a server; it funds the work. same binary, same encryption, your choice.