> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getbased.health/llms.txt
> Use this file to discover all available pages before exploring further.

# Sync getbased across multiple devices

> Use a 24-word mnemonic to sync your profiles, lab data, and AI settings across devices. The relay stores only encrypted data.

getbased can sync your profiles, lab data, and AI settings across as many devices as you like. Sync is opt-in and end-to-end encrypted: a relay server carries the data between your devices, but it only ever stores ciphertext. Without your mnemonic, the relay cannot read anything.

## How it works

Sync is powered by [Evolu](https://www.evolu.dev/), a local-first CRDT (Conflict-free Replicated Data Type) engine. When you enable sync:

1. A **24-word mnemonic** is generated — this is both your sync identity and your encryption key.
2. Your data is encrypted with a key derived from that mnemonic and pushed to the relay.
3. Any other device that uses the same mnemonic can pull and decrypt your data.

The relay acts as a blind store-and-forward server. It holds encrypted blobs and forwards them to your other devices. It never sees your plaintext.

## Set up sync on your first device

<Steps>
  <Step title="Open sync settings">
    Go to **Settings → Data**, or click the **Protect your data** pill on the dashboard and select **Cross-device Sync**.
  </Step>

  <Step title="Enable sync">
    Toggle **Cross-device sync** on. A setup modal appears.
  </Step>

  <Step title="Choose New setup">
    Click **New setup** to generate a fresh mnemonic for this account.
  </Step>

  <Step title="Save your mnemonic">
    Your 24-word mnemonic is displayed in cleartext. Write it down and store it somewhere offline — a piece of paper in a safe place, a password manager, or both. Then check **I have saved my mnemonic somewhere safe**.
  </Step>

  <Step title="Finish">
    Click **Done**. Your data begins syncing to the relay immediately.
  </Step>
</Steps>

<Warning>
  Anyone who has your mnemonic can access your synced data. Treat it like a password — store it offline and never share it.
</Warning>

## Add more devices

<Steps>
  <Step title="Open sync settings on the new device">
    Go to **Settings → Data** and toggle **Cross-device sync** on.
  </Step>

  <Step title="Choose Join existing">
    Click **Join existing** in the setup modal.
  </Step>

  <Step title="Enter your mnemonic">
    Paste or type your 24-word mnemonic from your first device.
  </Step>

  <Step title="Restore">
    Click **Restore**. The page reloads and pulls your data from the relay. All profiles and AI settings appear immediately.
  </Step>
</Steps>

## What syncs

The following data flows across all paired devices:

* All profile data — lab entries, per-file import history, context cards, notes, supplements, cycle data, custom markers, EMF assessments
* Profile metadata — name, sex, date of birth, location, tags
* AI settings — provider, API keys, model selections, Venice E2EE toggle, PPQ private-mode preference
* Agent Access state — enabled flag, relay profile metadata, read token, Agent Context key, and the selected wearable daily-series window
* Chat threads, messages, and custom personalities
* Display preferences — unit system, range mode, chart overlays

Settings such as theme are device-specific and do not sync. Wearable OAuth refresh tokens also stay local to each browser even though compact wearable summaries and Agent Access series preferences can sync.

### Wearable data

Wearable sync follows a deliberate split:

* **Wearable summary syncs.** The latest values, baselines, weekly trends, and anomaly events for every connected wearable metric flow to your other devices alongside everything else. Strip cards on Device B show the right numbers immediately after sync.
* **Raw daily rows stay local.** The full 90-day history (every per-day HRV, sleep score, RHR, and manual entry) lives in a per-device IndexedDB and is excluded from the sync payload. Detail-modal charts on Device B will be empty until you connect each wearable vendor separately on that device.
* **OAuth tokens never sync.** Each device must authorise each wearable independently. This is by design — a stolen mnemonic should not grant continuous access to your live wearable feeds.

## Sync status indicator

When sync is enabled, a small colored dot appears in the header next to the settings gear:

| Dot            | Meaning                                            |
| -------------- | -------------------------------------------------- |
| Green          | Synced — relay connected, data confirmed           |
| Blue (pulsing) | Syncing — push or pull in progress                 |
| Amber          | Offline — relay unreachable, changes saved locally |
| Red            | Error — sync failed                                |

Click the dot to see relay connectivity details, last push and pull timestamps, and a **Sync now** button for manual retry. The **Settings** link in that panel opens the Data tab directly.

## Conflict resolution

Sync uses **last-write-wins per item**, based on timestamps. Each save ships small per-item CRDT deltas — one lab entry, one marker note, one sun session — rather than re-sending your entire health record. If two devices edit the same item simultaneously before they sync, the most recent push wins. Edits to different items always merge cleanly.

## Mnemonic security

Your mnemonic is your encryption key. getbased takes several precautions to protect it:

* **Masked by default** — displayed as bullet characters in Settings, with a Show/Hide toggle.
* **Clipboard auto-clear** — when you copy the mnemonic, the clipboard is cleared after 60 seconds.
* **No server storage** — the mnemonic is generated and stored locally by the Evolu engine and is never sent to any server.

### Regenerating your mnemonic

Disabling sync resets your identity. Re-enabling sync generates a fresh mnemonic. Your other devices will need to join with the new mnemonic.

<Danger>
  If you lose your mnemonic, there is no recovery. You can still access your local data on each device, but you will need to set up sync again from scratch with a new mnemonic on all devices.
</Danger>

## Profile deletion across devices

When you delete a profile, getbased marks it as deleted on the relay (a tombstone). On the next pull, every other paired device sees the tombstone and wipes its local copy automatically — single-profile deletes propagate without prompting.

For batched deletes (two or more profiles deleted at once), the receiving device quarantines the wipe and shows a confirmation UI in **Settings → Data**. Each pending delete has **Apply delete** and **Restore** buttons. This protects against a leaked mnemonic: an attacker publishing tombstones for all your profiles would otherwise silently wipe every paired device on the next pull.

To reject a quarantined delete, click **Restore** — getbased re-publishes the local profile data, which beats the tombstone on the next sync. To accept, click **Apply delete** — the local wipe runs and the entry clears.

## Run your own relay server

The relay is open source (the [Evolu relay](https://github.com/evoluhq/evolu/tree/main/apps/relay)) and runs as a single Docker container with an embedded SQLite database. You need a Linux VPS with at least 1 CPU and 1 GB RAM, Docker, and a domain with TLS.

<Steps>
  <Step title="Start the relay container">
    ```bash theme={null}
    docker run -d \
      --name evolu-relay \
      --network host \
      --restart unless-stopped \
      evoluhq/relay:latest
    ```

    This starts the relay on port 4000 (WebSocket only).
  </Step>

  <Step title="Add TLS with Caddy">
    Install [Caddy](https://caddyserver.com/) and create `/etc/caddy/Caddyfile`:

    ```
    sync.yourdomain.com {
        reverse_proxy 127.0.0.1:4000 {
            transport http {
                versions h1
            }
        }
    }
    ```

    The `versions h1` directive is required — WebSocket upgrades need HTTP/1.1.

    ```bash theme={null}
    systemctl restart caddy
    ```

    Caddy provisions a TLS certificate automatically via Let's Encrypt.
  </Step>

  <Step title="Point DNS">
    Add an A record for `sync.yourdomain.com` pointing to your server's IP address.
  </Step>

  <Step title="Connect getbased to your relay">
    In getbased, go to **Settings → Data → Advanced** and enter `wss://sync.yourdomain.com`. The status dot turns green when connected.
  </Step>
</Steps>

<Tip>
  For a production relay, disable SSH password authentication, enable a firewall (allow only ports 22, 80, and 443), and enable automatic security updates.
</Tip>

## Relationship to local encryption

Cross-device sync and [local encryption](/guides/encryption) are independent systems:

* **Local encryption** (passphrase → AES-256-GCM) protects your localStorage data at rest on each device.
* **Sync encryption** (mnemonic → Evolu's key derivation → XChaCha20-Poly1305) protects data in transit and on the relay.

You can use either, both, or neither. Enabling local encryption does not affect sync, and vice versa.
