Nodus

Introduction

What Nodus is, why it exists, and how this documentation is organised.

Nodus is a hybrid, offline-first peer-to-peer storage system. Files live primarily on a Storage Node you control, sync directly between your own devices over the local network, and use the Internet only as an enhancement — never a hard dependency.

Nodus is a single monorepo containing four deployable components:

ComponentDirectoryStackRole
Web clientapps/webNext.js + packages/ui (Tailwind v4)Browser UI, session auth, uploads/downloads
Mobile clientapps/mobileReact Native / ExpoNative app, LAN discovery, background sync
Storage Nodeservices/storage-nodeRust, SQLiteDurable local storage + object store
Relayservices/relayGo, SQLite, RedisAuth, signaling, sync, temporary buffer

Why Nodus

Most cloud storage treats the Internet — and a central server — as the source of truth. Nodus flips that:

  • Local-network-first. Your devices talk directly to your Storage Node over Wi-Fi or wired LAN. No Internet is required for day-to-day sync.
  • Internet as enhancement, not dependency. A Relay provides signaling, cross-network sync, and temporary buffering when devices aren't on the same network — but it never holds plaintext file contents or keys.
  • Recoverable by design. If the Relay's database is lost, it can be fully rebuilt from snapshots held by your Storage Node(s).
  • Convergent, not "last write wins". Independently made offline changes reconcile without an arbitrary winner overwriting the other.

How it fits together

                         INTERNET
                            |
                            v
                 +----------------------+
                 |    Go Relay / API    |
                 | SQLite · Redis       |
                 | Temporary Buffer     |
                 +----------+-----------+
                            |
                       Sync Protocol
                            |
                        Wi-Fi / LAN
                            |
                 +----------v-----------+
                 |   Rust Storage Node  |
                 | SQLite · Object Store|
                 +----------+-----------+
                            |
                     Local WebRTC
                            |
                 +----------v-----------+
                 |   Web / Mobile Client|
                 +----------------------+

Files are split into 8 MB shards, encrypted client-side with AES-256-GCM (a unique nonce per shard), and integrity-checked with BLAKE3. The Relay only ever sees encrypted bytes and encrypted key envelopes — never plaintext file keys or shard contents.

Where to go next

On this page