COOLJAPAN
← All posts

IPFRS 0.2.0 Released — Local-First Becomes a Real Distributed P2P Node

IPFRS 0.2.0, the Network Release, turns the Pure Rust InterPlanetary File System into a fully distributed node: libp2p with QUIC, a Kademlia DHT, Bitswap and a custom TensorSwap protocol, a Semantic DHT, GossipSub, and Apache Arrow zero-copy tensor streaming.

release ipfrs ipfs distributed dht p2p libp2p bitswap

A file system is not really interplanetary until the planets can talk to each other.

Today we released IPFRS 0.2.0 — the Network Release that turns local-first IPFRS into a fully distributed InterPlanetary File System node, with real libp2p P2P networking, a Kademlia DHT, Bitswap and TensorSwap block exchange, and a Semantic DHT.

No C. No Go. No Fortran. The IPFS world still runs on go-ipfs / Kubo and js-ipfs, on libp2p stacks written in Go and C, on daemons you bolt onto your infrastructure. IPFRS reimplements that whole networking story in Pure Rust — QUIC, Noise, Kademlia, Bitswap, GossipSub — and still compiles to a single static binary (or WASM) that runs everywhere, from a datacenter to a phone.

Why IPFRS 0.2.0 is a game changer

In 0.1.0, IPFRS was an excellent local store — but it was an island. The classic IPFS answer to “make it distributed” is a heavyweight Go daemon and a static file warehouse that knows hashes and nothing else. 0.2.0 is the release where IPFRS stops being local-first and becomes a peer in a real network — without giving up the semantics that make it different.

The concrete wins:

Technical Deep Dive: the networking stack

The headline of 0.2.0 is everything between nodes.

1. The libp2p transport layer. QUIC first (multiplexed, sub-millisecond handshakes), TCP as fallback, Noise for authenticated encryption, Yamux for stream multiplexing, Ed25519 for persistent Peer IDs, plus a connection manager, AutoNAT, and the Identify protocol. This is a complete Pure Rust libp2p stack.

2. The Kademlia DHT. DHT bootstrap from well-known peers; auto-provide on add_bytes() / add_file(); DHT fallback on a get() miss; provider records with TTL; iterative closest-peer lookups over the XOR metric. Content discovery is now a network property, not a local lookup.

3. Block and tensor exchange. Bitswap (/ipfs/bitswap/1.2.0) handles general blocks: want-list management with dedup, block broadcasting, session-based transfer with timeout and retry, and bandwidth-aware peer scoring. TensorSwap (/ipfrs/tensorswap/1.0.0) handles ML payloads: chunked streaming with flow control, resume from the last ACK’d chunk, and metadata framing (dtype, shape, strides) in the header. GossipSub (/meshsub/1.1.0) carries block-announcement topics and content-routing events through the mesh, with a fan-out cache for high-churn dedup.

4. The Semantic DHT. HNSW search integrated with Kademlia routing: VectorAnnotatedRecord provider records carry embeddings, proximity-aware lookups prefer semantically similar peers, embeddings propagate across the network, and put_with_vector() / search_similar() work over the DHT. get_routing_convergence() reports health; efficient_partial_sync() gossips only the changed embedding regions; SemanticDhtMetrics and TTL eviction keep it bounded.

5. The modular node. The old single 2,477-line node.rs is now a node/ directory: node/core.rs (lifecycle, config, startup, shutdown), node/network.rs (the swarm event loop and peer management), node/dht.rs (Kademlia ops), node/exchange.rs (Bitswap sessions), and node/health.rs.

Getting Started

Build from source and install the CLI:

git clone https://github.com/cool-japan/ipfrs
cd ipfrs
cargo install --path crates/ipfrs-cli

Now join the network and let the DHT do the work:

ipfrs bootstrap                          # join the IPFS DHT
CID=$(ipfrs add bigmodel.safetensors)    # auto-announced to the DHT
ipfrs swarm peers
ipfrs dht findprovs $CID

The same flow from Rust, with the DHT handling discovery:

use ipfrs::{Node, NodeConfig};

#[tokio::main]
async fn main() -> ipfrs::Result<()> {
    let mut node = Node::new(NodeConfig::default())?;
    node.start().await?;

    // add_bytes auto-provides the CID to the Kademlia DHT
    let cid = node.add_bytes(b"Hello, distributed IPFRS!").await?;

    // find_providers now returns real peers across the network
    let providers = node.find_providers(&cid).await?;
    println!("{} provider(s) for {}", providers.len(), cid);

    Ok(())
}

What’s New in 0.2.0

Tips

This is the backbone

IPFRS is now the distributed, content-addressed storage and DHT backbone of the COOLJAPAN ecosystem. It compresses blocks with OxiARC, serializes with OxiCode (oxicode), and streams tensors zero-copy via Apache Arrow — which makes it a natural place to serve model weights for the broader Pure Rust ML stack, from ToRSh and TenfloweRS to OxiMedia, over the same Arrow-on-TensorSwap path.

Repository: https://github.com/cool-japan/ipfrs

Star the repo if a Pure Rust IPFS node — real P2P, a real DHT, and semantics built in — is the distributed foundation you want to build on. Pure Rust distributed storage is here — fast, safe, and sovereign.

KitaSan at COOLJAPAN OÜ June 16, 2026

↑ Back to all posts