Skip to content

Cross-device sync

A serverless, LAN-based sync between your own devices — no cloud, no account. Your desktop runs as a private hub on your home network, and your phone (or any browser on that network) follows the same library.

How it works

Sync runs entirely over your own local network. One desktop acts as the hub, and other devices — your phone, or a browser — sync to it. Nothing leaves your network: there is no Pyre server in the middle, no sign-in, and no copy of your data sitting in the cloud. Everything stays device-to-device.

The model is deliberately simple: the desktop holds the canonical library and exposes it over a small LAN HTTP server; clients pull changes from it and push their own back.

Warning

LAN sync is a beta / hardening area. The server is off until you turn it on — enable it deliberately, and only on a network you trust. Treat it like opening a small service on your home LAN, not like a feature you leave running on a public Wi-Fi.

The desktop hub

A desktop Pyre (Windows / Linux / macOS) can run a built-in LAN HTTP server. It is off by default — you opt in explicitly under the desktop's Network settings. When you enable it you choose:

  • the port the server listens on, and
  • whether it binds to the LAN (reachable by other devices on your network) or only to localhost (this machine only).

With the server on, your PC becomes your private sync hub.

Pairing a device with a QR code

To connect a phone, the desktop shows a QR code along with the host, port, and a pairing token. On the phone you either:

  • scan the QR code with the camera, or
  • type the host, port, and token in manually.

The token is a bearer token that authorizes that one device. The desktop can revoke a device's token at any time, which immediately disconnects it.

The mobile sync loop

Once paired, the mobile app keeps itself in step automatically. It pulls then pushes changes:

  • on a recurring timer,
  • whenever the app resumes from the background, and
  • on demand via Force sync now.

Merges use last-write-wins per record, decided by each record's modification time (mtime), across characters, personas, chats, presets, and lorebooks. So whichever device touched a record most recently wins for that record — not the whole library.

Note

Sync skips pushing during an in-flight generation, so a reply that is still streaming in won't get half-synced mid-stream.

What syncs, and how finely

Sync is per-record and per-message, not all-or-nothing:

  • Individual messages carry their own mtime, so editing one message in a long chat doesn't have to resend the entire conversation.
  • Deletions propagate as tombstones, so a record you delete on one device also disappears on devices that were offline when you deleted it — they pick up the deletion the next time they connect.
  • Attachments (avatars, images) sync content-addressed by hash, so the same image is only transferred once and is matched by content rather than by name.

This keeps sync efficient and conflict-resistant even across long-disconnected devices.

Using Pyre from a browser (web / PWA via the desktop)

A browser can load the Pyre web app directly from the desktop server — point it at http://<pc>:<port>/ on your LAN — and chat through it. The key detail is where the API call happens: the desktop makes the upstream LLM request using its own securely-stored key and streams the tokens back to the browser.

That means the browser never sees your API key. You get Pyre from any browser on your network without copying secrets onto that device.

Status and safety signals

  • A status pill shows the current state — idle, syncing, success, or offline.
  • A schema-version mismatch nudge warns you when the other device is on a newer build, so you don't sync mismatched data shapes.
  • Graceful 401 handling: if the desktop revokes a device's token, that device auto-disconnects cleanly instead of failing in the background.

See also