- Added `session_keys` to the `Disconnected` state to preserve encryption keys for reconnection. - Enhanced `set_device_connected` method to handle transitions from `Disconnected` to `Connected` states. - Updated device query to include `Disconnected` devices, ensuring they remain visible in the device list. - Improved overall device state management for seamless reconnection and stability in device connections.
12 KiB
CLI: Library Sync Setup Commands
Overview
After pairing two devices, use these commands to set up library synchronization between them.
Prerequisites
- Devices must be paired - Use
sd network pair generateandsd network pair joinfirst - At least one library exists - Use
sd library listto see available libraries - Networking must be running - Check with
sd network status - Know the device IDs - Use
sd network devicesto list paired devices
Commands
0. List Paired Devices (Get Device IDs)
First, you need to know the device ID of the paired device.
sd network devices
Options:
--connected- Show only currently connected devices
Example:
$ sd network devices
Paired Devices (2 total, 1 connected):
─────────────────────────────────────────────────────
Name: Bob's MacBook
ID: 550e8400-e29b-41d4-a716-446655440000
Type: Desktop
OS Version: 1.0
App Version: 2.0.0
Status: 🟢 Connected
Last Seen: 2025-10-05 03:30:00
Name: Alice's iPhone
ID: e1054ba9-2e8b-4847-9644-a7fb764d4221
Type: Mobile
OS Version: 1.0
App Version: 2.0.0
Status: ⚪ Paired
Last Seen: 2025-10-04 18:45:00
JSON Output:
$ sd network devices --output json
{
"devices": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Bob's MacBook",
"device_type": "Desktop",
"os_version": "1.0",
"app_version": "2.0.0",
"is_connected": true,
"last_seen": "2025-10-05T03:30:00Z"
}
],
"total": 2,
"connected": 1
}
Filter Connected Only:
$ sd network devices --connected
Paired Devices (1 total, 1 connected):
─────────────────────────────────────────────────────
Name: Bob's MacBook
ID: 550e8400-e29b-41d4-a716-446655440000
Status: 🟢 Connected
1. Discover Remote Libraries
Discover what libraries are available on a paired device.
sd library sync-setup discover <DEVICE_ID>
Arguments:
<DEVICE_ID>- UUID of the paired device
Example:
$ sd library sync-setup discover 550e8400-e29b-41d4-a716-446655440000
Device: Bob's MacBook (550e8400-e29b-41d4-a716-446655440000)
Online: true
Remote Libraries (2):
─────────────────────────────────────────
Name: My Library
ID: 3f8cb26f-de79-4d87-88dd-01be5f024041
Created: 2025-01-01 10:30:00
Entries: 5000
Locations: 3
Devices: 1
Size: 10737418240 bytes
Name: Work Documents
ID: 7a9c2d1e-5f84-4b23-a567-1234567890ab
Description: Work files and projects
Created: 2025-01-15 14:20:00
Entries: 1200
Locations: 2
Devices: 1
Size: 2147483648 bytes
JSON Output:
$ sd library sync-setup discover <DEVICE_ID> --output json
{
"device_id": "550e8400-e29b-41d4-a716-446655440000",
"device_name": "Bob's MacBook",
"is_online": true,
"libraries": [
{
"id": "3f8cb26f-de79-4d87-88dd-01be5f024041",
"name": "My Library",
"description": null,
"created_at": "2025-01-01T10:30:00Z",
"statistics": {
"total_entries": 5000,
"total_locations": 3,
"total_size_bytes": 10737418240,
"device_count": 1
}
}
]
}
2. Setup Library Sync
Configure library sync between local and remote devices.
sd library sync-setup setup \
--local-library <LOCAL_LIBRARY_ID> \
--remote-device <REMOTE_DEVICE_ID> \
[--remote-library <REMOTE_LIBRARY_ID>] \
[--action <ACTION>] \
[--leader <LEADER>] \
[--local-device <LOCAL_DEVICE_ID>]
Required Arguments:
--local-library- UUID of your local library--remote-device- UUID of the paired device
Optional Arguments:
--remote-library- UUID of the remote library to sync with (optional for register-only)--action- Sync action type (default:register-only)register-only- Just register devices (Phase 1) ✅merge-into-local- Future (Phase 3)merge-into-remote- Future (Phase 3)create-shared- Future (Phase 3)
--leader- Which device is the sync leader (default:local)local- This device is the leaderremote- Remote device is the leader
--local-device- Override auto-detected local device ID
Example:
$ sd library sync-setup setup \
--local-library 3f8cb26f-de79-4d87-88dd-01be5f024041 \
--remote-device 550e8400-e29b-41d4-a716-446655440000 \
--remote-library 7a9c2d1e-5f84-4b23-a567-1234567890ab \
--action register-only \
--leader local
✓ Library sync setup successful
Local library: 3f8cb26f-de79-4d87-88dd-01be5f024041
Remote library: 7a9c2d1e-5f84-4b23-a567-1234567890ab
Devices successfully registered for library access
Complete Workflow Example
Here's a complete workflow for pairing devices and setting up library sync:
Device A (CLI Daemon)
# 1. Start the daemon
$ sd start --foreground
# 2. Generate a pairing code
$ sd network pair generate
Pairing code: word1 word2 word3 word4 word5 word6 word7 word8 word9 word10 word11 word12
Session: 2369763d-e205-a344-6341-dbfa2ec8a709
Expires at: 2025-10-05 03:28:44
# 3. Wait for Device B to join...
# (Pairing completes)
# 4. List paired devices (get device IDs)
$ sd network devices
Paired Devices (1 total, 1 connected):
─────────────────────────────────────────────────────
Name: iOS Device
ID: e1054ba9-2e8b-4847-9644-a7fb764d4221
Type: Mobile
Status: 🟢 Connected
# 5. List local libraries
$ sd library list
- 3f8cb26f-de79-4d87-88dd-01be5f024041 /Users/alice/Library/Application Support/spacedrive/libraries/My Library.sdlibrary
# 6. Discover libraries on Device B (iOS)
$ sd library sync-setup discover e1054ba9-2e8b-4847-9644-a7fb764d4221
Device: iOS Device (e1054ba9-2e8b-4847-9644-a7fb764d4221)
Online: true
Remote Libraries (1):
─────────────────────────────────────────
Name: My Library
ID: d9828b35-6618-4d56-a37a-84ef03617d1e
Entries: 0
Locations: 0
Devices: 1
# 7. Set up library sync
$ sd library sync-setup setup \
--local-library 3f8cb26f-de79-4d87-88dd-01be5f024041 \
--remote-device e1054ba9-2e8b-4847-9644-a7fb764d4221 \
--remote-library d9828b35-6618-4d56-a37a-84ef03617d1e \
--leader local
✓ Library sync setup successful
Local library: 3f8cb26f-de79-4d87-88dd-01be5f024041
Remote library: d9828b35-6618-4d56-a37a-84ef03617d1e
Devices successfully registered for library access
# 8. Verify devices are registered
$ sd library info
# You should see the remote device in the devices list
Device B (iOS)
# 1. Enter pairing code from Device A in the app
# 2. After pairing completes, discover Device A's libraries
# (Use iOS UI or similar CLI commands when running on device)
# 3. Select libraries and set up sync
# (Use iOS UI for library selection)
Output Formats
All commands support --output flag:
# Human-readable (default)
$ sd library sync-setup discover <DEVICE_ID>
# JSON output
$ sd library sync-setup discover <DEVICE_ID> --output json
# YAML output
$ sd library sync-setup discover <DEVICE_ID> --output yaml
Common Use Cases
Scenario 1: Simple Two-Device Setup
You have a desktop and a phone, both with "My Library" auto-created.
# On Desktop
sd pair generate
# Share code with phone
# After phone joins:
sd library sync-setup discover <PHONE_DEVICE_ID>
sd library sync-setup setup \
--local-library <DESKTOP_LIBRARY_ID> \
--remote-device <PHONE_DEVICE_ID> \
--remote-library <PHONE_LIBRARY_ID>
Scenario 2: Multiple Libraries
You want to choose which libraries to sync.
# Discover what libraries the remote device has
sd library sync-setup discover <REMOTE_DEVICE_ID>
# Set up sync for specific library pair
sd library sync-setup setup \
--local-library <PHOTOS_LIBRARY_ID> \
--remote-device <REMOTE_DEVICE_ID> \
--remote-library <THEIR_PHOTOS_LIBRARY_ID>
# Optionally set up another pair
sd library sync-setup setup \
--local-library <WORK_LIBRARY_ID> \
--remote-device <REMOTE_DEVICE_ID> \
--remote-library <THEIR_WORK_LIBRARY_ID>
Scenario 3: One-Way Registration
Register your device in their library without syncing data.
sd library sync-setup setup \
--local-library <MY_LIBRARY_ID> \
--remote-device <THEIR_DEVICE_ID> \
--action register-only
# No --remote-library specified
Troubleshooting
"Device not paired"
Error: Device must be paired before setting up library sync
Solution:
1. Check pairing status: sd pair status
2. Pair devices if needed: sd pair generate / sd pair join
3. Retry sync setup after pairing completes
"Device offline"
Device: Bob's MacBook (550e8400-e29b-41d4-a716-446655440000)
Online: false
No libraries found on remote device
Solution:
1. Ensure remote device daemon is running
2. Check network connectivity
3. Verify devices can discover each other (mDNS)
4. Retry when device comes online
"Library not found"
Error: Library not found: <UUID>
Solution:
1. List local libraries: sd library list
2. Verify library ID is correct
3. Create library if needed: sd library create <NAME>
"Context not available"
Error: Context not available for library operations
Solution:
1. Restart the daemon: sd restart
2. Wait for initialization to complete
3. Check logs for networking initialization errors
Integration with Other Commands
List Paired Devices
# See all paired devices with details
$ sd network devices
Paired Devices (2 total, 1 connected):
Name: Bob's MacBook
ID: 550e8400-e29b-41d4-a716-446655440000
Status: 🟢 Connected
# See only connected devices
$ sd network devices --connected
# Check network status summary
$ sd network status
Networking: running
Paired: 2 | Connected: 1
Verify Registration
After setup, the remote device should appear in your library's device list:
# Get library info (when UI supports it)
$ sd library info
# Device list will include the remote device
Advanced Usage
Custom Device ID
If you need to override the auto-detected local device ID:
sd library sync-setup setup \
--local-library <LIBRARY_ID> \
--remote-device <REMOTE_DEVICE_ID> \
--local-device <CUSTOM_LOCAL_DEVICE_ID> \
--leader local
Specify Remote as Leader
If the remote device should be the sync leader:
sd library sync-setup setup \
--local-library <LIBRARY_ID> \
--remote-device <REMOTE_DEVICE_ID> \
--remote-library <REMOTE_LIBRARY_ID> \
--leader remote
Future Commands (Phase 3)
When full sync is implemented, additional actions will be available:
# Merge remote library into local
sd library sync-setup setup \
--local-library <LOCAL_ID> \
--remote-device <DEVICE_ID> \
--remote-library <REMOTE_ID> \
--action merge-into-local \
--leader local
# Merge local library into remote
sd library sync-setup setup \
--local-library <LOCAL_ID> \
--remote-device <DEVICE_ID> \
--remote-library <REMOTE_ID> \
--action merge-into-remote \
--leader remote
# Create new shared library
sd library sync-setup setup \
--remote-device <DEVICE_ID> \
--action create-shared \
--leader local
See Also
- Pairing:
sd network pair --help - Devices:
sd network devices --help - Libraries:
sd library --help - Networking:
sd network --help - Design:
docs/core/LIBRARY_SYNC_SETUP.md
Quick Command Reference
# Pairing
sd network pair generate # Generate pairing code
sd network pair join <CODE> # Join with code
sd network pair status # Show pairing sessions
# Devices
sd network devices # List all paired devices
sd network devices --connected # List connected devices only
# Library Sync Setup
sd library sync-setup discover <DEVICE_ID>
sd library sync-setup setup --local-library <ID> --remote-device <ID> [OPTIONS]
# Libraries
sd library list # List local libraries
sd library info # Show library details