Epeaky

End-to-end encrypted chat for small circles, on a server you run.

Rooms, files and voice for a group that knows each other. Open source, MIT or Apache-2.0.

Behind the door, only ciphertext.

Features

  1. I

    Rooms

    MLS groups, held only on members' devices. Replies, reactions, edits, deletions, mentions and typing travel inside the encryption.

  2. II

    Private rooms

    A random 128-bit id the server never lists. Joined by invitation only, and an invitation must carry the device key that was asked for.

  3. III

    Files and images

    Encrypted in the browser under a fresh key per file. The server stores an opaque blob of up to 25 MB for 30 days.

  4. IV

    Voice

    A voice room in every room, up to nine people. Each audio frame is encrypted in the browser under its speaker's own key, with a counter that refuses replays.

  5. V

    Entry

    The door checks a member's pass and signs a day token it never sees. The server admits the device the token names, and its records never put a pass next to a device.

  6. VI

    Search

    Runs on the device, across everything it has read. The server has nothing to search.

One message, two views.

What the server sees

A member's device

m-4e7827479f

The server
room
general
from device
m-4e7827479f
size
0 bytes
at
--:--:--

The server sees

  • Device keys, the rooms each is in (private rooms included) and every change to a room's membership
  • When each device writes, reacts, types or talks, and how much
  • File sizes, the names of open rooms, and who is in a voice room
  • Network addresses, and which passes asked the door for tokens

Only members see

  • The words of every message, edit and reaction
  • File contents and file names
  • Voice audio
  • Which member holds which pass

The door and the server share one machine. An operator who correlates network addresses or timing can link a pass to a device. A member who needs to prevent that can reach one of them through a VPN or Tor.

The server serves the page that holds the keys. Whoever runs it could change that page. Join a den whose host you trust, or run your own.

Epeaky has not had an independent security audit. Threat model

The host keeps the door.

Entry

The host opens one or more ways in. The member list keeps only a hash of each member's pass.

Invite links

The host makes single-use links that expire. Whoever opens one is in.

Approval

Anyone with the address can ask, with a note. The host approves or declines.

Your own site

Your site checks whatever you require — a login, a membership, a token — and registers the member's pass with the den.

Install

  1. Point a domain at a server

    A Linux server, x86-64, with the domain's A or AAAA record pointing at it. Open TCP 80 and 443, and UDP 50000–50199 for voice.

  2. Run the installer

    curl -fsSL https://epeaky.zyn-network.com/install.sh | sudo bash

    Or without questions: sudo bash install.sh --domain chat.example.org --email you@example.org --yes

  3. Open the invite link it prints

    That makes you the first member. From the server, the epeaky command runs the door:

    epeaky invite 5 7
    five invite links, valid seven days
    epeaky requests
    who asked to join
    epeaky approve <id>
    let one in
    epeaky update
    the latest version

Source

github.com/zyn-io/epeaky

Small rooms, thick walls.