Quick Start

Prerequisites

Install

Linux:

git clone https://github.com/gokr/buddydrive
cd buddydrive
nimble build

macOS:

git clone https://github.com/gokr/buddydrive
cd buddydrive
nimble build

Windows:

git clone https://github.com/gokr/buddydrive
cd buddydrive
nimble build

Initialize

buddydrive init

This creates:

Pair With a Buddy

On your machine:

buddydrive add-buddy --generate-code

On your buddy's machine:

buddydrive add-buddy --id <your-buddy-id> --code ABCD-EFGH

The pairing code is used for both pairing confirmation and relay fallback.

Add a Folder

buddydrive add-folder ~/Documents --name docs

Options:

Set Up Recovery

Enable recovery on the machine you want to protect:

buddydrive setup-recovery

BuddyDrive shows a 12-word recovery phrase, asks you to verify part of it, stores recovery metadata in config.toml, and syncs an encrypted config blob to the relay.

Restore On a New Machine

On a replacement machine:

buddydrive recover
buddydrive start

Enter the same 12-word recovery phrase. If relay recovery succeeds, BuddyDrive restores your config locally. Starting the daemon then lets normal sync recreate missing files.

Current limitation: the CLI prompts for buddy fallback details if relay recovery fails, but that buddy-backed fetch path is not implemented yet. Recovery works via the relay path only.

Start the Daemon

buddydrive start

Optional:

Per-Buddy Sync Time

Each buddy can have an optional sync time that controls when to initiate connections. Incoming connections are always accepted:

buddydrive config set buddy-sync-time <buddy-id> 03:00

When empty (default), the daemon initiates whenever it discovers a buddy address.

Connectivity Notes

BuddyDrive connects peers using deterministic initiator selection: the side without a public address initiates (it dials the public side directly), or the side with the lower buddy UUID if both are the same reachability. Incoming connections from known buddies are always accepted. Connectivity options:

  1. Direct connection with a public TCP address
  2. Relay fallback using the stored pairing code

For direct connections, forward the configured listen_port on your router and set [network].announce_addr in ~/.buddydrive/config.toml to a public multiaddr such as:

announce_addr = "/ip4/203.0.113.10/tcp/41721"

For relay fallback:

buddydrive config set relay-base-url https://api.buddydrive.org
buddydrive config set relay-region eu

The public EU TCP relay is relay-eu.buddydrive.org:19447.

Check Status

buddydrive status

Current CLI Limitations

GUI

Launch

buddydrive-gui

Features

CLI Reference

Commands

buddydrive init                        Initialize BuddyDrive
buddydrive config                      Show configuration
buddydrive config set <key> ...        Update configuration values
  relay-base-url <url>                Set relay discovery URL
  relay-region <region>               Set relay region (eu, us, local)
  storage-base-path <path>           Set incoming storage base path
  bandwidth-limit <kbps>             Set bandwidth limit (0 = unlimited)
  buddy-pairing-code <id> <code>     Set buddy pairing code
  buddy-name <name>                  Set buddy display name
  buddy-sync-time <id> <HH:MM>       Set buddy sync time (empty = always)
  folder-append-only <name> on|off   Toggle folder append-only mode
buddydrive add-folder <path>           Add folder to sync
  --name <name>                        Folder name
  --no-encrypt                         Disable folder encryption flag
  --append-only                        Only sync new files into that folder
  --buddy <id>                         Restrict folder to buddy
buddydrive remove-folder <name>        Remove folder
buddydrive list-folders                List configured folders
buddydrive add-buddy                   Pair with a buddy
  --generate-code                      Generate pairing code
  --id <buddy-id>                      Buddy ID to pair with
  --code <code>                        Pairing code from buddy
buddydrive remove-buddy <id>           Remove buddy
buddydrive list-buddies                List paired buddies
buddydrive connect <address>           Manual connect placeholder
buddydrive start                       Start sync daemon
  --port <control-port>                Override control API port
  --daemon                             Accepted but stays foreground
buddydrive stop                        Stop placeholder command
buddydrive status                      Show configured status
buddydrive logs                        Show recent logs
buddydrive setup-recovery              Generate recovery phrase and sync encrypted config
buddydrive recover                     Restore config from recovery phrase
buddydrive sync-config                 Manually sync encrypted config to relay/buddies
buddydrive export-recovery             Show stored recovery metadata
buddydrive help                        Show help

Examples

# Pair with a buddy
buddydrive add-buddy --generate-code
buddydrive add-buddy --id abc123 --code XYZ-789

# Add folders
buddydrive add-folder ~/Photos --name photos
buddydrive add-folder ~/Documents --name docs --append-only

# Configure relay fallback
buddydrive config set relay-base-url https://api.buddydrive.org
buddydrive config set relay-region eu
buddydrive config set buddy-pairing-code abc123 ABCD-EFGH

# Set per-buddy sync time
buddydrive config set buddy-sync-time abc123 03:00

# Set bandwidth limit
buddydrive config set bandwidth-limit 500

# Toggle append-only on a folder
buddydrive config set folder-append-only docs on

# Set up recovery
buddydrive setup-recovery

# Restore on a new machine
buddydrive recover

# Check what's configured
buddydrive list-folders
buddydrive list-buddies
buddydrive config

Configuration

Config stored at ~/.buddydrive/config.toml:

[buddy]
name = "Alice"
id = "fcd6295c-a912-44d4-a27b-ad898795207d"

[recovery]
enabled = true
public_key = "6J8h2qFvExampleRecoveryKey"
master_key = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"

[network]
listen_port = 41721
announce_addr = "/ip4/203.0.113.10/tcp/41721"
relay_base_url = "https://api.buddydrive.org"
relay_region = "eu"
storage_base_path = ""
bandwidth_limit_kbps = 0

[[folders]]
id = "f47ac10b-58cc-4372-a567-0e02b2c3d479"
name = "docs"
path = "/home/alice/Documents"
encrypted = true
append_only = false
folder_key = "a1b2c3d4e5f6..."
buddies = ["bob-uuid"]

[[buddies]]
id = "bob-uuid"
name = "Bob"
pairing_code = "ABCD-EFGH"
sync_time = "03:00"
added_at = "2026-04-10T12:00:00Z"

Files

Location Purpose
~/.buddydrive/config.tomlConfiguration
~/.buddydrive/state.dbRuntime state
~/.buddydrive/index.dbFile index
~/.buddydrive/buddydrive.logLogs
~/.buddydrive/portControl API port

Troubleshooting

Daemon won't start

buddydrive logs
buddydrive config

Can't connect to buddy

  1. Both peers need internet access
  2. Both peers need buddydrive start running
  3. Check stored buddies with buddydrive list-buddies
  4. For direct mode, verify port forwarding and announce_addr
  5. For relay mode, verify relay-region, relay-base-url, and matching pairing codes

Files not syncing

  1. Check daemon logs with buddydrive logs
  2. Check folder configuration with buddydrive list-folders
  3. Remember buddydrive status does not show live connection state yet
  4. Missing files are restored through normal sync after connectivity returns

Next Steps