Technology · Architecture

App, nodes, node network

Gather has two parts: the app on your phone, and nodes connected to each other as peers. The app connects to only one entry node; the nodes form a network that relays and temporarily stores ciphertext.

App

  • Written in Flutter: one codebase for both Android and iOS.
  • All encryption and decryption happen inside the app, and keys are kept in the system's secure storage.
  • User data such as groups, blocklists, favorites and tags is kept only on the phone or in encrypted backups, never handed to the nodes.
  • Branded builds are supported: the same code can produce apps for different brands.

How the app connects to a node

  • It connects to an entry node over encrypted WebSocket (TLS).
  • The app does not rely on a TLS certificate to identify a node: it sends the node a random number, the node signs it with its own Ed25519 key, and the app checks that the public key yields the node ID, then checks the operator attestation and the release manifest.
  • The app ships with several entry points; when the current node is unavailable it switches to the next one automatically.

Between nodes

  • go-libp2p and Kademlia DHT, with connections encrypted by TLS or Noise, and support for NAT detection, hole punching and relays.
  • A purpose-built gossip layer spreads heartbeats and release manifests between nodes, with a bounded reach.
  • Node discovery is sharded, so the whole network never queries the same node.
  • No seed nodes are built into the code; seeds are read only from configuration.

Operations

  • Operators can run a private aggregation among their own nodes: only allowlisted counts and enumerations are reported, without addresses or IPs, and reports are signature-verified and replay-protected.
  • Node binaries use a reproducible build process and come with a software bill of materials (SBOM).