Sync

Keep your library, watch progress and settings in sync with one pairing code. Your data is encrypted on your devices. No account needed.

Hosted sync is free for 14 days, then €19 once per household. Or run your own sync server, free.

A pairing code (example)

7Q4MXK2H9CV3ZDTA8N5R

Twenty characters in four groups of five. That is the whole setup.

The pairing code

One code, made on the first device, typed on the others. It is the only secret, and it never leaves your devices.

  • Turn sync on and Lumen makes the code. Enter it on your other devices and they are linked.

  • Typos are forgiven: I and L read as 1, O reads as 0, and the separators do not matter.

  • The code is shown masked, with Show and Copy beside it, and only while sync is on.

  • Turning sync off forgets the code on that device. To link it again, enter the code once more.

What syncs

The four things that make a second device feel like the first one.

  • Library: saved titles, continue watching, watched state.

  • Progress: where you are in every episode and film.

  • Addons: which ones are installed and how they are configured.

  • Player preferences: subtitle languages, audio presets, playback settings.

What stays on the device

The pairing code, the window size and position, the diagnostic log, and anything you downloaded for offline viewing.

What the relay sees

Each device derives its keys from the code and encrypts every row before sending it. The relay stores what it is given and can read none of it.

One row of watch progress, on the way out

On your device

entity
watch
key
tt1254207:1:3
value
{"positionSecs":2537,…}

What the relay stores

space
9f3c…7b21
entity
x
row
c81a…04ef
payload
base64 ciphertext
updated
1788462601007

The space id and the row id are derived with keys only your devices hold, so the relay cannot tell which title a row belongs to, or move a row to another slot, or change its date without your devices noticing. It keeps the network address of the connecting device for the length of the request, and nothing else.

The relay we host runs at sync.lumen.movie. Devices use it unless you point them somewhere else.

Choose your sync setup

Use our hosted sync server, or run your own. Both use the same encryption and pairing code.

  • Our relay at sync.lumen.movie: free for 14 days per household, then a Lumen Pass, €19 once for that household.

  • Your own relay: free, forever, no Pass, no limit. The binary is installed beside the app.

  • Identical either way. The encryption, the pairing code and what syncs do not change.

  • If a trial ends, syncing pauses and nothing else does. Local changes are kept and sync once a Pass is active.

Let Lumen take care of the server.

All the convenience of private sync, with no relay to run or maintain. One Pass covers every personal device in your household for €19 once.

Explore Lumen Pass

Run your own relay

Everything the relay stores is ciphertext, so hosting it yourself changes who keeps the bytes, not who can read them.

  1. Run the relay

    Lumen installs lumen-relay.exe beside the app, in %LOCALAPPDATA%\Programs\Lumen. Start it on a machine your devices can reach; it listens on port 7345 and keeps its data in lumen-relay.db next to it.

    lumen-relay.exe --port 7345
  2. Put it behind TLS

    Terminate TLS with a reverse proxy. Only two routes exist, so everything else can answer 404. This is the Caddy site block we use:

    sync.example.com {
        encode gzip
        handle /v1/health { reverse_proxy 127.0.0.1:7345 }
        handle /v1/sync   { reverse_proxy 127.0.0.1:7345 }
        handle            { respond 404 }
    }
  3. Point your devices at it

    On every device: Settings, Sync across devices, Advanced, Relay address. Enter your relay's https address. A reset puts the built-in relay back.

    curl https://sync.example.com/v1/health

    The health route answers ok.

Docker

A prebuilt image is published for Linux, for both amd64 and arm64, so a Raspberry Pi or a NAS runs it as well as a server does. It is one static binary on an empty base image: about 3 MB to download, with no operating system inside it to keep patched.

docker run -d --name lumen-relay -p 7345:7345 \
  -v lumen-relay-data:/data \
  elduinar/lumen-self-host-relay

The relay speaks plain HTTP, so put it behind the same TLS proxy as above before anything outside your own network can reach it. Its data stays in the lumen-relay-data volume.

Built-in limits

Request body4 MiB
Rows per request2000
Payload per row256 KiB
Rows per space50 000

Updates to rows a space already holds always go through; only new rows count against the per-space cap.