โ† Dashboard ยท Docs ยทConcepts

Grove Concepts

Terminology

Cell

A single Grove node โ€” one device running grove.py and web.py. Every cell has its own identity (keypair), storage, and dashboard. Your laptop, a Raspberry Pi, a VPS โ€” each is a cell.

Fleet

All the cells you're connected to. Your personal distributed network.

Peer

Another cell in your fleet. Peers sync files, relay messages, and back each other up.

Friend

A peer you've promoted to friend status. Friends can share files with you (via grants). Non-friend peers can still store your encrypted chunks but can't share files with you.

Favorite

A peer marked as a preferred sync target. Your chunks will always be synced to favorite peers first, regardless of speed ranking.

Chunk

A 4MB piece of a file, encrypted with ChaCha20-Poly1305. Files are split into chunks for storage and transfer. Chunk filenames are their SHA-256 hash (content-addressed).

Manifest

A JSON file describing a complete file: its name, size, chunk hashes, encryption metadata, and source path. Format: {filename}.{hash8}.json. Manifests live in ~/.grove/manifests/.

Grant

A cryptographic permission to access a shared file. When you share a file with a peer, you create a signed grant containing the manifest hash, the encrypted file key, and your signature. Grants are verified using Ed25519 signatures.

Placement

The system's record of which chunks live on which peers. Used to decide where to replicate, what's under-replicated, and what's at risk. Stored in ~/.grove/placement.db (SQLite).

Replication Factor

How many copies of each chunk exist across the fleet. Default desired factor: 2 (your cell + one peer). Configurable per-cell.

Relay

A WebSocket server that lets cells communicate when they can't reach each other directly (e.g., behind NAT). Cells connect to a relay and exchange messages through it. Relay operators can't read message contents (end-to-end encrypted).

Transport

How two cells communicate. Types:

Bounty

A token-like credit system for resource sharing. Peers earn bounty by storing chunks for others. Spend bounty to store your data on peers. Currently tracks storage contributions.

GroveAI

Built-in AI chat powered by local LLM inference (llama.cpp or Ollama). Can also route queries to peer cells with more powerful hardware.

Opp Sync (Opportunistic Sync)

Background process that runs every ~5 minutes. Probes all peers, checks for missing chunks, pulls/pushes data to maintain replication targets, records speed measurements, and runs health checks.


File Lifecycle


1. Upload         โ†’ File saved to GROVE_HOME (your file tree)
2. Chunk           โ†’ Split into 4MB chunks, encrypted with ChaCha20
3. Manifest        โ†’ JSON manifest created describing the file
4. Local storage   โ†’ Chunks stored in ~/.grove/chunks/{hash[:2]}/{hash}
5. Sync            โ†’ Opp sync pushes chunks to peers (speed-ranked)
6. Placement       โ†’ Placement DB tracks which peers hold which chunks
7. Healing         โ†’ If a peer goes offline, chunks re-replicate elsewhere

Sharing Lifecycle


1. Select file     โ†’ Choose file(s) in dashboard
2. Pick peers      โ†’ Select which friends to share with
3. Create grant    โ†’ Signed grant with encrypted file key
4. Push grant      โ†’ Grant sent to peer's cell
5. Peer sees file  โ†’ Appears in their Feed tab
6. Peer downloads  โ†’ Chunks pulled from your cell (or other holders)

Directory Structure


~/.grove/                    # Runtime directory (GROVE_DIR)
โ”œโ”€โ”€ config.json              # Cell configuration
โ”œโ”€โ”€ node.key                 # Ed25519 private signing key
โ”œโ”€โ”€ node.pub                 # Ed25519 public key
โ”œโ”€โ”€ node_x25519.key          # X25519 private key (for chat encryption)
โ”œโ”€โ”€ node_x25519.pub          # X25519 public key
โ”œโ”€โ”€ .key                     # Master encryption key (256-bit)
โ”œโ”€โ”€ peer_secret              # Shared secret for peer API auth
โ”œโ”€โ”€ dashboard_auth           # Dashboard password hash
โ”œโ”€โ”€ placement.db             # SQLite: chunk placement tracking
โ”œโ”€โ”€ peer_speeds.json         # Recorded route speeds
โ”œโ”€โ”€ peer_health.json         # Peer uptime tracking
โ”œโ”€โ”€ chunks/                  # Encrypted chunk storage
โ”‚   โ”œโ”€โ”€ ab/                  # First 2 hex chars of hash
โ”‚   โ”‚   โ””โ”€โ”€ ab3f7c...       # Full hash filename
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ manifests/               # File manifests
โ”‚   โ””โ”€โ”€ photo.jpg.a1b2c3d4.json
โ”œโ”€โ”€ grants/                  # Received share grants
โ”œโ”€โ”€ invites/                 # Created invite tokens
โ”œโ”€โ”€ models/                  # AI model files (.gguf)
โ”œโ”€โ”€ grove.py                 # Core library
โ””โ”€โ”€ web.py                   # Web dashboard + API server

~/GroveHome/                 # User file tree (GROVE_HOME)
โ”œโ”€โ”€ Documents/
โ”œโ”€โ”€ Photos/
โ””โ”€โ”€ ...                      # Your actual files

Network Topology


         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  Relay   โ”‚  (WebSocket hub, optional)
         โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
              โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚         โ”‚         โ”‚
โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”
โ”‚ Cell โ”‚ โ”‚ Cell โ”‚ โ”‚ Cell โ”‚
โ”‚ (Mac)โ”‚ โ”‚ (Pi) โ”‚ โ”‚ (VPS)โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ†•         โ†•         โ†•
 Tailscale / Yggdrasil / LAN / WAN

Cells find the best route to each peer automatically. Routes are benchmarked every 6 hours and scored by throughput + latency.