Skip to content

Multi Device Sync

Eric Griffin edited this page Jun 15, 2026 · 8 revisions

Multi-Device Sync

Submersion can keep your dive log in sync across every device you use — phone, tablet, and computer — so a dive you download on one shows up on all of them.

Sync is "bring your own storage." Your dive data lives in a cloud account you control, and Submersion reads and writes a small set of app-managed sync files there. There is no Submersion server in the middle and no Submersion account to create: you own the storage, and you own the data.

Tip: Set up the device that already has your dives first. It seeds the shared library, and every other device then merges into it.

How Sync Works

Once you connect a device to a storage backend, Submersion keeps it up to date automatically:

  • Every device reads the latest shared library from your storage and writes its own changes back to it.
  • Syncs are incremental. The first sync uploads your library once; after that, each sync transfers only what actually changed — so even a large dive log stays fast to sync and does not need the app left open.
  • New dives, edits, and deletions made on one device propagate to the others on the next sync.
  • The first device to connect seeds the library. When another device connects to a backend that already has data, Submersion asks whether to combine the two libraries before merging anything (see Adding More Devices below).
  • Your connection details are stored in the device's secure keychain — never in the dive database, and never sent anywhere else.
One library, many devices: Each device keeps its own complete copy of your dive log. Submersion automatically shares each device's changes and merges in everyone else's, so every device ends up with the same library — you never have to reconcile copies by hand.

Choosing a Storage Backend

Open Settings → Cloud Sync and pick the backend that fits your devices:

Backend Best for Notes
iCloud All-Apple setups (iPhone, iPad, Mac) Simplest option — uses the iCloud account you're already signed into. Apple platforms only.
S3-Compatible Storage Mixed platforms, or full control over where data lives Works with any S3-compatible provider (Cloudflare R2, Amazon S3, Backblaze B2, MinIO, self-hosted). Available on every platform: iOS, Android, macOS, Windows, and Linux. You supply an endpoint, a bucket, and access keys.
More backends are on the way. Additional storage providers are planned for upcoming releases. If you sync across a mix of Apple and non-Apple devices today, the S3-compatible backend is the one that reaches all of them — the Cloudflare R2 walkthrough at the end of this page shows a complete, free setup.

Enabling Sync

The details you enter depend on the backend, but the flow is always the same:

  1. Open Settings → Cloud Sync.
  2. Select a backend and provide its connection details. For iCloud, select it and sign in if prompted. For S3-compatible storage, enter the endpoint, bucket, and keys (see the Cloudflare R2 example below).
  3. Confirm the connection and tap Save.
  4. Run the first sync with Sync Now.

The "Combine Libraries?" Prompt

The first time a device syncs to a backend that already contains dives from another device, Submersion pauses and asks before merging:

Combine Libraries? — Existing sync data was found in the cloud. Your first sync will combine that data with the dives on this device, across every synced device.

Choose Merge and Sync to bring the two libraries together. This is exactly what you want when adding a new device to an existing library.

Heads up on duplicates: If you logged the same dive separately on two devices before connecting them, merging keeps both copies — they will appear twice. Merge a new device into the library before you start logging on it, not after.

Adding More Devices

To put your log on another device:

  1. Install Submersion on the new device.
  2. Open Settings → Cloud Sync and choose the same backend as your other devices — the same iCloud account, or the same bucket and access keys for S3-compatible storage.
  3. Run Sync Now. Because the backend already holds your library, you will see the Combine Libraries? prompt — choose Merge and Sync.

From then on, all connected devices share one library.

Sync Options

Under Settings → Cloud Sync you control when syncs happen:

Option What it does
Auto Sync Sync automatically whenever your data changes.
Sync on Launch Run a sync when the app starts.
Sync on Resume Run a sync when you return to the app.
Sync Now Trigger a sync manually.
Last Sync Shows when the last successful sync ran.

Switching or Removing a Backend

If you switch a device from one backend to another, Submersion confirms first:

Switch sync backend? — Your data is not moved off the old backend; it stays there until you delete it. After switching, this device's next sync combines its data with whatever already exists on the new backend. Your other devices keep using the old backend until you switch each of them too.

Two things to remember:

  • Switching is per-device. Each device keeps using its current backend until you switch it individually.
  • Nothing is deleted automatically. Your old data stays in the previous storage until you remove it yourself.

For S3-compatible storage, you can clear the connection on a device with Remove Configuration on the S3 settings screen. This forgets the endpoint and keys on that device; it does not touch the data already in your bucket.

Security & Privacy

  • Credentials stay on the device. Endpoints, bucket names, and access keys are stored in your platform's secure keychain — not in the dive database, and never transmitted to Submersion.
  • Your data lives in your storage. The shared library is held in the cloud account you control. Anyone who has your storage credentials can read it, so keep them safe and scope them narrowly (see step 3 of the R2 example below).
  • Encrypted in transit. Submersion talks to S3-compatible storage over HTTPS. If you enter a plain http:// endpoint, the app warns you that credentials and dive data will travel unencrypted — only do this on a trusted local network.
  • Encrypted at rest. Cloudflare R2, like most S3 providers, automatically encrypts stored objects at rest. Submersion does not add its own separate encryption layer on top, so a private bucket and a tightly scoped access token are your main protections.

Example: Cloudflare R2 (S3-Compatible)

Cloudflare R2 is a convenient S3-compatible backend: it has a generous free monthly tier, charges no egress fees, and works on every platform Submersion supports. This walkthrough sets it up end to end.

Terminology: R2 has no separate "tenancy" to create — your Cloudflare account is the tenant. Your account's ID becomes part of the storage endpoint (https://<account-id>.r2.cloudflarestorage.com), which Cloudflare shows you when you create your keys — so you will not need to look it up separately.

1. Enable R2

  1. Sign in at dash.cloudflare.com (create a free account if you do not have one).
  2. In the sidebar, go to Storage & databases → R2 → Overview.
  3. Complete the checkout flow to add an R2 subscription. R2 includes a free monthly allowance; you may be asked to put a payment method on file before the bucket tools unlock.

2. Create a Bucket

  1. On the R2 page, select Create bucket.
  2. Enter a bucket name — lowercase letters, numbers, and hyphens; 3–63 characters; it cannot start or end with a hyphen. For example, my-dive-log.
  3. Optionally choose a Location to keep data near you. For strict data-residency needs, choose Specify jurisdiction (for example, EU) instead — note that this changes your endpoint hostname (see Jurisdiction Endpoints below).
  4. Create the bucket and note its name — you will enter it in Submersion.

3. Create API Credentials (Access Keys)

  1. From the R2 Overview page, open API Tokens (the Manage R2 API Tokens link in the account details area).
  2. Select Create Account API token. An account token stays valid until you revoke it, which is what you want for a long-lived sync setup.
  3. For Permissions, choose Object Read & Write — this lets Submersion read, write, and list objects, but not manage your other buckets.
  4. Choose the option to apply the token to specific buckets, and select the bucket you created. (Limiting a token to one bucket is good security hygiene.)
  5. Create the token. Cloudflare now shows you three values:
    • Access Key ID
    • Secret Access Key
    • S3 endpoint (https://<account-id>.r2.cloudflarestorage.com)
Copy the Secret Access Key now. Cloudflare displays it only once. Copy all three values somewhere safe before leaving the page — if you lose the secret, you will have to create a new token.

4. Configure Submersion (First Device)

  1. In Submersion, open Settings → Cloud Sync and choose S3-Compatible Storage.
  2. Fill in the four main fields:
Field What to enter
Endpoint URL The S3 endpoint from step 3, e.g. https://<account-id>.r2.cloudflarestorage.com
Bucket The bucket name from step 2, e.g. my-dive-log
Access Key ID From step 3
Secret Access Key From step 3 (tap the eye icon to reveal and check it)
  1. Leave the Advanced section alone. Submersion auto-detects the correct Region (auto) for R2 and selects the right addressing mode automatically; the default Key prefix (submersion-sync/) keeps Submersion's files tidy inside the bucket.
  2. Tap Test Connection. Submersion writes a tiny probe object to the bucket, reads it back, and deletes it to confirm the credentials work. You should see Connection successful.
  3. Tap Save.
  4. Run Sync Now to seed your library into the bucket.

5. Repeat on Your Other Devices

Enter the same four values on each additional device (Settings → Cloud Sync → S3-Compatible Storage), tap Test Connection, then Save. On the first sync, choose Merge and Sync at the Combine Libraries? prompt. All of your devices now share one log through R2.

R2 Troubleshooting

Problem What to try
Test Connection fails with an access or signature error Re-check the Access Key ID and Secret Access Key for stray spaces. Confirm the token's permission is Object Read & Write and that it is scoped to this bucket.
Test Connection reports a region problem Open the Advanced section and check the Region field; for R2 it should auto-detect to auto. Re-run the test.
The endpoint is rejected as invalid The endpoint must be a full https:// URL with nothing after the hostname — just https://<account-id>.r2.cloudflarestorage.com, not a /bucket path. The bucket name goes in its own field.
A dive appears twice after adding a device That dive was logged separately on both devices before they were merged. Delete the duplicate; the removal syncs to the others.
No dives appear on the new device Make sure you tapped Merge and Sync at the Combine Libraries prompt, and that every device uses the same bucket and keys.

Clone this wiki locally