Design

"raio-core stays IO-free." That's the one rule.

If a change would make core depend on a network, a filesystem, a clock, or a runtime, it belongs in a different crate. The trait seams exist so you can add real capabilities — durable storage, transport, settlement, scheme-specific QR profiles — without ever touching the root of trust. core has no network, no filesystem, and no clock, so it stays deterministic, runtime-agnostic, and trivially fuzzable.

LedgerStore

Persist the event-sourced ledger — durable today via pure-Rust redb; SQL/Postgres are welcome community crates.

KeyDirectory

Resolve an alias (or MSISDN) to an account — durable today via pure-Rust redb; SQL/Postgres are welcome community crates.

SettlementProvider

Move real money. The shipped impl is naive on purpose — production adapters (PAPSS / RTGS / mobile money) are BYO.

Transport Future

The inter-participant message bus, with ISO 20022 and GSMA Mobile Money adapters — the interoperability seam, not yet in v0.1.

Codecs & currency

Two QR standards, one currency-aware root.

Pix taught "scan to pay" with the BR Code; the interoperable sibling is EMVCo QR. Both are EMV-style TLV with the same CRC-16/CCITT-FALSE checksum, shipped as separate, self-contained codecs (no raio-core dependency). Meanwhile Money carries integer minor units and respects each currency's minor_scale() — the zero-decimal CFA franc zones (XOF, XAF, UGX, RWF, GNF) are first-class, never forced through a cents projection.