Getting Started
Install
Section titled “Install”With a Rust toolchain:
$ cargo install efema-serverOr download the archive for your platform from the
latest release - Linux on
x86_64 and on 64-bit ARM (a Raspberry Pi), Windows and macOS on Apple silicon -
and put efema-server somewhere on your PATH.
Run it
Section titled “Run it”$ efema-server serve2026-10-08T18:36:09.749999Z INFO efema-server 0.1.0 listening on http://127.0.0.1:2451, data in /home/you/.local/share/efemaThe relay listens on the loopback interface, port 2451, and keeps its data in
your local data directory. Both have flags (serve):
$ efema-server serve --listen 127.0.0.1:8080 --data /var/lib/efemaLoopback is the default on purpose. The relay does not speak TLS and does not check who is asking yet - so before anything outside this machine reaches it, put it behind a reverse proxy and read the threat model.
Check it
Section titled “Check it”$ curl http://127.0.0.1:2451/healthokOnce devices have written to it, streams shows what the relay keeps - names,
positions, epochs and sizes, never contents:
$ efema-server streamsSTREAM ID EPOCH ENTRIES SIZE UPDATED (UTC)notes 11c3cd7e 1 3 1.7 KiB 2026-10-08 18:36photos 6964d409 2 3 144.0 KiB 2026-10-08 18:36What talks to it
Section titled “What talks to it”Apps talk to it through the Rust client library, efema:
it seals every entry on the device - there is no way to send one unsealed -
keeps the device’s cursor and waits for news.
Syncing an app shows how;
A synced folder is a complete example to run
against the relay you just started.
Anything else that speaks the protocol - CBOR over HTTP, four endpoints - is a client too, if it seals the way Sealing describes.
- Streams and cursors - the model the relay keeps.
- Threat model - what the relay can see, and what it cannot.
- Syncing an app - the client library.
- Commands - the data directory, the logs and every flag.