Open source / distributed messaging

Shared infrastructure.
Endpoint encryption.

EpochGrid combines NATS messaging infrastructure with MLS end-to-end group encryption. The fabric routes and stores messages. Devices hold the keys and read the content.

Project snapshot / 01
Transport
NATS + JetStream
Encryption
MLS via OpenMLS
Implementation
Rust · CLI + TUI

01 / Purpose

Why EpochGrid?

Separate the messaging fabric from the keys that make a conversation readable.

01

Infrastructure has a defined role

NATS handles routing, authentication and persistence. The identity service manages public registration metadata, without an application decryption path.

02

Group state stays at the edge

OpenMLS manages cryptographic membership. Independent device keys and authenticated Welcome messages connect directory identity to the group.

03

Failure is part of the workflow

Durable inboxes, a ciphertext outbox and local transactions support offline catch-up and tested process restart boundaries.

02 / Implementation

A working, deliberately scoped system

Implemented

Identity and discovery

Independent NATS and MLS keys; signed registrations and operator-authorized enrollment.

Implemented

Encrypted group messages

Authenticated Welcome joining and MLS PrivateMessages for the two-device development flow.

Implemented

Durable delivery and history

JetStream ciphertext, retryable sends, local transcripts and offline catch-up.

Implemented

A persistent terminal client

Channel navigation, message composition, history, unread counts and automatic reconnect.

Implemented describes repository code, not production readiness. Acceptance evidence (external) · Terminal client (external)

03 / Message path

One fabric. Distinct trust boundaries.

Content encryption, broker permissions and local storage provide different protections.

Message content is encrypted at the endpoints. Clients exchange MLS ciphertext through NATS and JetStream. A separate service manages public identities and provisions streams and consumers. Each endpoint decrypts and retains its own plaintext history. The broker still sees routing and traffic metadata; the loopback development transport has no TLS.
Inspect the security layers →

04 / Foundations

A small set of substantial building blocks

RustShared core, CLI and service
NATSTransport and durable streams
OpenMLSGroup cryptographic state
SQLiteTransactional device storage
Roles, rationale and tradeoffs →

Build with the project

Start with the code. Help refine the boundaries.

Run the development flow, examine the threat model, or discuss a focused change with the maintainers.