v0.9.0 gives the rotifer CLI an embedded libp2p node. Two machines on the same LAN can now exchange gene announcements directly — no central server in between. libp2p handles the transport, Kademlia handles peer discovery, and GossipSub handles propagation.
This is the first runnable version of Rotifer's network layer. It is small and marked experimental on purpose, and this post is precise about what it does and doesn't do yet — the credibility of a decentralized network grows out of exactly that kind of precision.
@rotifer/playground is now at v0.9.0; @rotifer/mcp-server follows its own line at v0.9.1. Both are on npm.
A real P2P node — on your machine
Why this isn't centralized
Rotifer's premise is that capability evolves: genes compete on fitness, and the better ones spread. That process needs a substrate to run on. A central registry can host it, but a registry is also a single point of control and a single point of failure — whoever operates it decides what propagates, and can stop it. A peer-to-peer layer removes that chokepoint: nodes exchange announcements directly, so a gene can spread without any one operator clearing it first. The mechanism is closer to horizontal gene transfer in biology than to a central dispatcher handing out work.
Run it
The CLI now embeds a real libp2p node. On machine A:
rotifer network start --host 0.0.0.0 --port 9878
rotifer network status # copy the /ip4/192.168.x.x/tcp/9878 line
On machine B, on the same Wi-Fi, point --bootstrap at A's address:
rotifer network start --host 0.0.0.0 --port 9878 \
--bootstrap /ip4/192.168.x.x/tcp/9878
rotifer network peers # A shows up within a second or two
Announce a gene on A, and B receives it:
rotifer network announce hello-world # on A
rotifer network received # on B
That announcement crosses machines over a real P2P transport: libp2p moves the bytes, Kademlia lets B find A from a single bootstrap address, and GossipSub relays the announcement to every subscribed peer.
Why metadata first
An announcement carries metadata — what a gene is and who has it — not the gene binary. That is the discovery layer every later capability builds on. Get genes flowing as announcements first, and pulling the actual code, scoring it, and propagating winners all become increments on a working foundation instead of a rewrite. Shipping the smallest honest piece of the transport is what makes the next pieces tractable.
It also draws an honest boundary. Because only metadata moves today, a receiving node learns that a gene exists but cannot yet fetch or verify its code — pulling the binary and attesting it are deliberately a separate, later layer. We would rather ship that limit clearly than blur it.
Where v0.9 sits on the path
To be exact: an autonomous network of evolving agents is Rotifer's goal — and what v0.9 ships is the first piece of transport on the way there. Today it is experimental and deliberately small: two or more machines on the same LAN, manual --bootstrap, metadata only (announcements, not gene binaries). It can't discover peers on its own yet, can't reach across the internet, and has no fitness-driven exchange between nodes — those are later milestones. We're marking where we are on the path, not claiming we've arrived.
The v0.9 economic foundation
Open Mesh ships alongside the v0.9 economy work: reputation dynamics, an automated season reset, and fitness/weight display. Genes accrue standing over time, and the numbers you see reflect both raw fitness and earned reputation. Fitness measures how a gene performs on its task; reputation measures how it has held up across runs and seasons. Keeping the two visible side by side means a single lucky score can't pass itself off as a track record.
The season reset exists for a concrete reason. A leaderboard that never resets rewards age over merit — the earliest genes hold their position by inertia rather than by being better. Resetting on a schedule keeps the Arena contestable: a stronger gene published today can still climb past one that simply arrived first.
Hybrid Fidelity genes
A gene can now declare more about itself: external dependencies, degradation behaviour, and a simulation spec. In practice, this means a gene states how it behaves when its environment isn't available, instead of failing silently.
Consider a gene that calls an external API. With a declared degradation spec, it tells the runtime what to do when that API is down — return a cached result, degrade gracefully, or fail loudly — so the behaviour becomes part of the gene's contract rather than an accident of the environment the caller can't reason about.
rotifer doctor
A new health check for your toolchain:
rotifer doctor
It flags missing or misconfigured dependencies before you build, so a broken environment surfaces as a clear report instead of a confusing compile error. The most common first-run failure is a half-set-up toolchain — a missing native build, a stale cache, the wrong Node version — and rotifer doctor turns those from a cryptic stack trace into a checklist you can act on.
This release also fixes the OAuth login callback, which now binds reliably to its local port — no more intermittent timeout on rotifer login.
What's next
From here, the network layer grows along three lines:
-
Automatic discovery — nodes find each other without a manual
--bootstrap. - Internet reach — NAT traversal and relays, so a node can join from any home network, not just the same LAN.
- Fitness-driven exchange — genes propagating between nodes by merit, not just as announcements.
Each one builds on the transport that v0.9 puts in place.
Install / Upgrade
npm install -g @rotifer/playground@latest
For MCP Server users:
npm install -g @rotifer/mcp-server@latest
Top comments (1)
I am curious. Are you using backend for your agent?