Intro

Ranvier is a Typed Decision Engine.

It is not a web framework. It is a structural layer that keeps execution explicit, inspectable, and safe to refactor. Your Rust code becomes a circuit. Ranvier turns on the lights.

Axon Schematic Outcome Ingress/Egress

Execution is explicit

Axon chains describe the exact order of decisions. No hidden middleware and no implicit control flow.

Structure is inspectable

Schematic captures nodes and edges without executing the runtime. It is the artifact for diff, validation, and visualization.

Control flow is data

Outcome models branch, jump, emit, and fault as explicit results. You can audit and replay decisions without guessing.

The Contract

Core stays protocol-agnostic. HTTP lives in the adapter layer.
Schematic never executes runtime logic. It is read/validate/visualize only.
Flat API is allowed, but it must not hide complexity. We isolate it.

Resources Stay Explicit

Ranvier does not hide state behind global middleware. Shared resources live in a typed Bus or an explicit resource bundle, and every transition chooses when to read them.

Bus is type-indexed and opt-in. No implicit injection.
Resources are wired at ingress, not magically discovered at runtime.
Capability rules can be layered without changing core contracts.

Ingress / Egress Boundaries

Ingress adapts protocol requests into the initial state.
Axon executes the decision flow with typed transitions.
Egress maps Outcomes back into protocol responses.

Schematic Diff & Validation

Schematic is a static artifact. You can diff and validate circuits in CI before runtime, without executing the system.

Trust & LLM Boundaries

AI can propose structure, but it does not mutate runtime logic. Every change remains explicit, reviewable, and validated against the Schematic.

If you are looking for a batteries-included framework, Ranvier is not it. If you want your runtime logic to remain visible and verifiable, you are in the right place.
use ranvier::prelude::*;

let axon = Axon::simple::<anyhow::Error>("Hello")
    .then(Hello);

Ranvier::http()
    .bind("127.0.0.1:3000")
    .route("/", axon)
    .run(())
    .await?;
Next path: /tutorial for first run, then /manual for product-level manuals.