IngotCluster
Iroh (iron, P2P QUIC) and Zenoh (brokered zenohd) in one Elixir cluster package.
gale — Phoenix HTTP/3
ingot_cluster — Iroh + Zenoh (Hex: `ingot_cluster`)
dusk — Zenoh + Iroh
orian — BLAKE3 / S3 / S5 storage
zeiroh — Phoenix FLAME overlay
{:ingot_cluster, "~> 0.1", hex: :ingot_cluster}
mix ingot_cluster.install
# prefers a Burrito single binary (ERTS inside); else Mix escript
# mix ingot_cluster.binary # burrito_out/ingot_<os>
# Linux/macOS: ~/.local/bin Windows: %LOCALAPPDATA%\elixcoder\bin
ingot_cluster backends
ingot_cluster match "a/**" a/b
ingot_cluster hash ./file --algo blake3
ingot_cluster put ./file
Inside a Mix project: mix ingot_cluster backends.
{IngotCluster,
iroh: [alpns: ["ingot_cluster/1"]],
zenoh: [connect: "tcp/127.0.0.1:7447", key: "ingot_cluster/cluster/**"]}
Add one of these in the host app (rustler pin clash if both):
{:iroh_beam, "~> 0.2"} # Iroh
{:zenohex, "~> 0.10"} # Zenoh
Zig NIF: key-expr match, FNV hash64, BLAKE3, XXH3. See HASH.md.
Fast path: orian. Built-in:
{:ok, cid} = IngotCluster.Storage.put(body) # memory, BLAKE3 CID
IngotCluster.Storage.put(body, backend: :s3, bucket: "b", unsigned: true, host: "127.0.0.1:9000", scheme: "http")
IngotCluster.Storage.put(body, backend: :s5, endpoint: "http://127.0.0.1:5050")
MIT. https://github.com/niranjanaryan/ingot_cluster
libcluster
config :libcluster,
topologies: [
iron: [strategy: IngotCluster.Strategy.Iroh, config: [alpns: ["ingot_cluster/1"]]],
zenoh: [
strategy: IngotCluster.Strategy.Zenoh,
config: [connect: "tcp/127.0.0.1:7447", key: "ingot_cluster/cluster/nodes"]
]
]
Optional {:libcluster, "~> 3.5"} in the host app.
Phoenix FLAME
config :flame, :backend, {IngotCluster.FLAME.Backend,
provisioner: :local, # :docker | :fly | :k8s | :ec2
overlay: :both,
live: false}
provisioner is not Fly-only: local, Docker CLI, FLAME.FlyBackend,
FLAMEK8sBackend, FlameEC2. Host app adds the matching Hex package.
overlay::iroh, :zenoh, or :both. Optional {:flame, "~> 0.5"}.
Limits: this boots a local runner Task and may advertise {node, pid}
on Zenoh. It does not start FLAME.Terminator, set FLAME_PARENT, or
provision a remote BEAM node. Iroh/Zenoh cannot replace Fly/K8s boot; they
can only discover existing nodes. Full eval: EVAL.md. Scaling (provision + overlay):
SCALING.md.
libcluster strategies currently connect a staticconfig[:nodes] list;
they do not yet subscribe to live Iroh/Zenoh membership.