Whispers is a self-organizing, belief-driven mesh where nodes propose, verify, and evolve solutions through dynamic, decentralized consensus.
It's a simple idea, but I think it's rather beautiful: nodes find one another via Multicast DNS (mDNS) and exchange information via Conflict-free Replicated Data Types (CRDTs).
There's more to it than that, a lot more, but we'll get there when we get there 🙂
"I had hoped we could come here and learn to play Flappy Bird together."
- Vito Corleone, The Godfather
The first application of Whispers is a distributed neuroevolution system that learns to play Flappy Bird. Each node in the mesh runs its own evolutionary loop, training a small neural network (4 inputs → 6 hidden → 1 output) to navigate pipes. When a node discovers a better-performing genome, it gossips the weights to its peers.
The twist: nodes don't just trust claimed fitness scores. The AuditedMap CRDT requires incoming genomes to implement a Merit trait, which means receiving nodes re-evaluate the genome's fitness before accepting it. This prevents nodes from (profitably) lying about how good their solutions are. Fitness is calculated as a geometric mean across multiple seeded game runs, which penalizes lucky flukes and rewards consistent performance.
Nodes can adopt superior genomes from the network, crossbreed with peers, or occasionally sample weaker genomes for diversity. The result is a distributed genetic algorithm where the mesh collectively evolves toward better Flappy Bird players. Visit /play on any node to watch the current best genome in action.
To run a Whispers mesh, just check out the repository and enter:
RUST_LOG=debug cargo run(Some release process will manifest at some point.)
That launches a single node, but a mesh of one node isn't particularly interesting.
If you launch a second, third, fourth, etc, then those nodes should discover each other and begin gossipping with one another. You won't see much of this unless you set the RUST_LOG environment variable as described above.
Alternatively, you can run ./easy_cluster.sh x, where x is some number of nodes you would like to run simultaneously in a self-configuring cluster, e.g. 3, 8, etc.

