Crate layout, the application container, service provider DAG, and milestone plan.
Design principles
Principle
Meaning
Convention over configuration
Sensible defaults with explicit opt-out
Type safety as a feature
Generics, lifetimes, and traits replace runtime any blobs
Zero-cost ergonomics
Expressive APIs that compile away where possible
Incremental adoption
Use one crate or the full stack
Workspace layout
One crate per milestone domain; application code lives in app/:
The canonical crate inventory records 42 crates under crates/ + xtask (43 workspace packages). Cargo.toml with members = ["crates/*", "xtask"] is the mechanical source of truth.
Providers follow an explicit register → boot lifecycle with DAG ordering. The framework runs a real topological sort with typed cycle detection (BootError::DependencyCycle), and xtask check-cycles validates the workspace DAG in CI.
Unlike Goravel's global facades, state is passed explicitly: AppState reaches handlers through axum::extract::State backed by Arc/OnceLock — no global mutable statics.
Feature gates
The rustasea umbrella crate re-exports the whole framework, but several crates stay behind opt-in features so a core build never links their dependency trees (pay-for-what-you-use).