Skip to content

IFM Developer Tools

Developer-facing products for building and operating IFM nodes. These are not public demos — the public demos (Station System, Relay Station, Radio Listener) live in docs/demos.

ToolTypePurposeAudience
Node UITerminal/TUI (Rust + ratatui)Live node monitoring & controlNode operators, developers
CLIifm binaryScripted node operationsDevelopers, automation
SDK@ifm/sdk packageJavaScript/TypeScript APIApplication developers

Node UI (terminal dashboard)

A ratatui dashboard embedding a real node (libp2p QUIC by default) with Topology · Frequencies · Packets · Health · Logs tabs.

bash
cargo run --example node_ui
KeyAction
Tab / 1-5Switch tabs
j / k / / Navigate lists
t / lTune / leave a frequency
bBroadcast a message
pSend a ping packet
rRefresh
q / Ctrl+CQuit

Logs are captured from tracing into the Logs tab. Default filter: ifm=debug,warn (override with RUST_LOG), so chat/presence traffic and peer connect/disconnect events are visible while DNS/mDNS TRACE spam stays hidden.


CLI

The ifm binary exposes scripted node operations:

bash
cargo build --release --workspace

ifm init                    # create identity + storage (~/.ifm)
ifm connect                 # connect the node
ifm tune 91.700             # tune to a public frequency
ifm tune private.team --key "base64secret=="   # protected frequency
ifm broadcast "Hello, IFM!" # broadcast text on chat.general
ifm broadcast @notes.txt --type file           # send a file
ifm send hello.txt          # send a file's contents
ifm speak                   # interactive broadcast from stdin
ifm peers                   # list known peers
ifm scan                    # scan visible frequencies
ifm stats                   # node statistics
ifm leave                   # leave the current frequency
ifm disconnect              # disconnect from the mesh

Full reference: CLI docs.


SDK

The @ifm/sdk TypeScript package — the application-facing API:

typescript
import { IFM } from "@ifm/sdk"

const radio = await IFM.create()
await radio.tune("91.700")
radio.on("message", (msg) => console.log(msg))
await radio.broadcast("91.700", "Hello, IFM!")

A smoke script exercises the full API surface (tune, broadcast, publish, sendFile reassembly, events, stats):

bash
cd packages/sdk
bun examples/smoke.mjs

Full reference: SDK docs.

Released under the MIT License.