Rust ecosystem architecture
System and language review current to Rust 1.98.0 (2026-08-20), using the Rust 2024 edition and an ecosystem snapshot dated 2026-09-03. This is the atlas’s first data-backed ecosystem map: the component register and relationship graph are published as rust-ecosystem.json.
Rust is best understood as three coupled systems. The language makes ownership, aliasing, trait obligations, and thread-transfer properties visible to the compiler. The toolchain makes the package graph, target, edition, and build profile reproducible enough to automate. The ecosystem supplies the policy-heavy layers the standard library deliberately does not choose: async execution, HTTP, serialization formats, database access, UI, device traits, and foreign-language glue. Collapsing those systems into a list of syntax features misses where real architecture decisions live.
Scope and review findings¶
A structural map of the official Rust toolchain, compiler, package and publication systems, runtime boundaries, and representative community integration layers. It is complete for the relationships listed here, not an exhaustive catalogue of crates. “Official” in this page means distributed or operated by the Rust Project; it does not mean that every community crate shown is endorsed by the project. Community entries are included because they reveal architectural seams, and alternatives remain possible at each seam.
Most cohesive layer
The rustup–Cargo–rustc–rustdoc toolchain uses one package model and one command surface from local edit through test, documentation, and publication.
Most important split
async fn and Future are stable
contracts, but scheduling, I/O, timers, and task policy come from a selected runtime such as Tokio.
Largest hidden trust edge
Dependencies can execute as
build.rs programs or procedural macros on the build host. A lockfile fixes versions; it does not
make that execution inert.
Strongest design boundary
Safe APIs can hide unsafe implementations, but their soundness rests on invariants enforced by types, validation, and module privacy.
Primary scaling cost
Generics, feature combinations, macro expansion, native dependencies, and linking turn compile time and cache reuse into system concerns on large graphs.
Uneven maturity is structural
CLI, serialization, and server foundations have well-established interfaces; GUI, some embedded targets, and cross-language packaging remain more platform-specific.
Findings synthesized from the map and the primary sources below, especially The rustup book: Components; Cargo internals overview; Rust Compiler Development Guide: Overview; The Rust Programming Language: Async and Await; The Cargo Book: Build Scripts; The Rustonomicon: Working with Unsafe.
The language architecture¶
Rust’s surface combines imperative control flow with algebraic data types, closures, iterators, pattern matching, generics, and traits. Its deeper organizing rule is that properties normally left to runtime convention are moved into static interfaces: whether a value may be moved, borrowed, shared across threads, called dynamically, or used after a possible failure. Type inference removes many annotations but does not weaken those checks.
Rust 2015, 2018, 2021, and 2024 are compatibility editions, not separate runtimes. Each crate chooses an edition; crates from supported editions link together, while edition-gated parsing and migration lints permit otherwise incompatible surface changes without splitting the package graph. Stable language and library releases continue on the toolchain cadence independently of editions. Sources: Rust Edition Guide: What are editions?; Announcing Rust 1.98.0; The Rust Reference.
Ownership, borrowing, and resource lifetime¶
Every value has an owner. Assignment or argument passing moves a non-Copy value unless an API
borrows it; a shared reference &T permits observation, while an exclusive reference
&mut T permits mutation without competing access. Lifetimes express relationships between
references; they do not extend the lifetime of the underlying value. Non-lexical lifetime analysis usually
ends a borrow at its last use rather than the closing brace.
fn normalized(mut bytes: Vec<u8>) -> Vec<u8> {
bytes.sort_unstable(); // exclusive borrow of the Vec
bytes.dedup(); // the same owner continues to hold it
bytes // move ownership to the caller
}
let raw = vec![3, 1, 3];
let clean = normalized(raw);
// raw is no longer usable; clean owns the allocation.
Drop turns the same model into general resource management: files, locks, sockets, mappings,
and transactions can release deterministically when their owner leaves scope. Rc and
Arc add shared ownership through reference counts; Cell, RefCell, locks,
and atomics move selected exclusivity checks to runtime or hardware. Ownership prevents use-after-free and
data races in safe code, but it does not prevent leaks, deadlocks, application races, unbounded queues, or
incorrect cleanup policy.
Types, traits, errors, and dispatch¶
struct composes products and enum defines tagged sums. Pattern matching makes the
set of variants explicit and exhaustiveness-checked. Option<T> represents absence and
Result<T, E> represents recoverable failure without a distinguished null reference or checked
exception channel. The ? operator returns a residual through the surrounding function’s error
type; it does not throw across an arbitrary stack boundary.
A trait is a behavioral interface. Generic bounds select static dispatch and monomorphization by default;
dyn Trait selects a runtime vtable boundary. Associated types let a trait name types that belong
to one implementation, and the coherence/orphan rules prevent two external crates from defining competing
implementations for the same external trait and type. These rules make global method resolution predictable,
at the cost of requiring newtype adapters or coordination at extension boundaries. Sources:
The Rust Programming Language: Traits; The Rust Programming Language: Error Handling.
trait Repository {
type Error;
fn load(&self, id: u64) -> Result<Option<Record>, Self::Error>;
}
fn require<R: Repository>(repo: &R, id: u64) -> Result<Record, R::Error> {
Ok(repo.load(id)?.expect("record must exist"))
}
The example deliberately separates a recoverable repository error from the application invariant asserted
by expect. Production boundaries should decide whether a panic aborts, unwinds, is caught by a
framework, or crosses an FFI boundary—those are deployment properties, not mere syntax choices.
Threads, async, and cancellation¶
Send says a value may move between threads; Sync says a shared reference may be
used from several threads. They are unsafe marker traits because an incorrect manual implementation can make
safe clients unsound, while composition lets ordinary user types receive them automatically when their fields
satisfy the contract. Arc<Mutex<T>>, channels, atomics, scoped threads, and data-parallel
crates all build on those properties. The compiler rules out data races in safe Rust, not every concurrency
bug. Source: The Rust Programming Language: Send and Sync.
An async fn returns a state machine implementing Future. Awaiting may suspend it;
progress occurs only when an executor polls it after a wake-up. Cancellation is normally drop-based: removing
a future stops future polls, so any partially completed operation must be designed for that point. Blocking an
executor worker stalls unrelated tasks; CPU-bound or blocking work belongs behind an explicit pool or process
boundary. Runtime-neutral libraries can expose futures without starting an executor, but I/O traits and
ecosystem integrations may still couple them to a runtime family.
Unsafe Rust and foreign boundaries¶
unsafe permits a small set of operations whose contracts the compiler cannot prove: raw-pointer
dereference, calls to unsafe functions, access to mutable statics, union-field access, and unsafe trait
implementations. It does not disable the borrow checker for surrounding safe operations. A safe abstraction
may use unsafe internals only if every call expressible through its safe API preserves the required invariants.
FFI adds a second type system and runtime contract. The boundary must settle ABI, layout, ownership and
allocator identity, nullability, strings, callbacks, thread affinity, unwinding, and shutdown. Raw
extern declarations expose the boundary; projects such as CXX and PyO3 generate higher-level
bridges, but cannot erase the host runtime’s rules. Source: The Rustonomicon: FFI; PyO3 user guide; CXX Rust/C++ interop.
Full system context map¶
The diagram shows every non-community component in the published graph. Lines are directional dependencies or invocations; their exact type and evidence appear in the relationship register. Community libraries are shown separately because putting replaceable application choices into the toolchain boundary would falsely imply ownership or endorsement.
The map exposes two separations that command-line tutorials hide. First, crates.io and docs.rs are network
services; Cargo and local rustdoc are tools. A local or private registry can replace the former, and
cargo doc works without the latter. Second, host and target are different machines in a
cross-build: build scripts and procedural macros execute for the host while the final crate and target standard
library are produced for the target.
Workspace, package, crate, and module model¶
A workspace shares one lockfile and output directory and can inherit dependency, package, and lint metadata. It does not merge all members into one crate: each package retains its manifest and each target its crate boundary. Crate boundaries control visibility, trait coherence, compilation, linking, feature activation, and what downstream packages see as an API. Module boundaries organize names and privacy inside that unit.
This distinction drives architecture. Split a package when versioning, ownership, deployment, build cost, features, or dependencies need an independent boundary. Split a module when names, privacy, or comprehension need one. A workspace full of tiny packages pays in compile scheduling and public contracts; one giant crate pays in invalidation, ownership ambiguity, and accidental coupling.
Cargo and rustc build architecture¶
Cargo first resolves package versions and features, then turns that graph into compilation units for a
profile and target. Resolver version 3 is the default for Rust 2024 packages and changes incompatible-Rust-
version handling. Features are additive within the resolver’s unification boundary; they should enable
capabilities, not choose mutually exclusive implementations. Cargo.lock records concrete package
versions and sources, while the manifest expresses allowed ranges.
Inside rustc, parsing and macro expansion produce an AST; lowering produces HIR for name resolution and type/trait checking, then THIR and MIR. Borrow checking operates on MIR. Optimized MIR is monomorphized and lowered to a code-generation backend, commonly LLVM, before platform linking. Queries cache dependencies and results at finer granularity, enabling incremental compilation and on-demand work; the linear drawing remains useful only as a map of representation boundaries.
Runtime and deployment shapes¶
A hosted native binary normally uses std, a platform C runtime or system API, an allocator,
unwinding or abort policy, and a linker-selected set of native libraries. A no_std binary uses
core and may add alloc, but must supply or avoid facilities that std
normally connects to the operating system. WebAssembly moves those services behind a host interface. A Python
extension or C++ bridge runs inside another language’s process and lifecycle. “No runtime” is therefore
shorthand for “no required VM or tracing collector,” not an architecture diagram.
Target support is tiered. Tier 1 targets are built and tested; Tier 2 targets are guaranteed to build but are not necessarily fully tested; Tier 3 carries no build guarantee. A target specification and standard library component are only part of cross-compilation: a compatible linker, native libraries, SDK, runner, and packaging path may still be required. Sources: rustc Platform Support; The rustup book: Cross-compilation.
Representative ecosystem layers¶
The table is a topology, not a popularity chart. It chooses components that expose distinct interfaces and design decisions; it does not assert that one crate is universally best. Exact versions are intentionally not copied into the atlas: Cargo.lock is the authority for a particular project, while each linked upstream page is the authority for its current release and compatibility contract.
| Domain | Representative components | Where the stack fits | Boundary to design explicitly | Sources |
|---|---|---|---|---|
| Command-line tools | clap, Serde, tracing | Single native binaries, typed argument models, fast startup, and straightforward cross-compilation. | Treat shell integration, platform packaging, and self-update behavior as product concerns outside Cargo. | clap documentation; Serde documentation; tracing documentation |
| Network services | Tokio, axum / Tower / hyper, Serde, tracing, SQLx / Diesel | Tokio supplies scheduling and I/O, while hyper/Tower/axum separate transport, middleware, extraction, and handlers. | Runtime choice becomes architectural: avoid blocking executor workers and propagate cancellation and backpressure deliberately. | Tokio runtime architecture; axum documentation; tracing documentation |
| Embedded and kernels | core / alloc / std, embedded-hal, OS / ABI / device | core and optionally alloc support no_std binaries; embedded-hal traits separate reusable drivers from device HALs. | Allocator, panic handler, interrupts, startup, linker script, and hardware concurrency are explicit platform responsibilities. | The Embedded Rust Book: no_std; embedded-hal documentation |
| WebAssembly | wasm-bindgen, core / alloc / std, OS / ABI / device | Rust targets Wasm while wasm-bindgen generates the JavaScript-facing import/export layer. | The browser or component host owns I/O, threading, loading, and object models; the ABI/glue boundary is part of the system design. | The wasm-bindgen Guide; rustc Platform Support |
| Native extensions and migration | PyO3 / CXX, OS / ABI / device, core / alloc / std | PyO3 and CXX wrap raw ABIs with generated conversions and safer host-language APIs. | Ownership, exceptions or panics, threading, allocator identity, and ABI compatibility must be specified at every foreign edge. | PyO3 user guide; CXX Rust/C++ interop; The Rustonomicon: FFI |
| Data-backed applications | Serde, SQLx / Diesel, async runtime | Serde defines format-independent data traits; SQLx and Diesel offer different compile-time boundaries for database access. | Schema migration, connection-pool behavior, transaction ownership, and offline query metadata remain operational design choices. | Serde documentation; SQLx documentation; Diesel documentation |
| GUI and games | egui / Bevy, OS / ABI / device | egui offers immediate-mode interfaces; Bevy supplies a plugin-oriented ECS application and game architecture. | Platform windows, GPU APIs, assets, frame scheduling, and web/native feature sets broaden the dependency and build graph quickly. | egui documentation; Bevy documentation |
| Testing and supply-chain assurance | proptest / Criterion, audit / deny / vet, Cargo | Property tests and statistical benchmarks cover behavior and performance; audit, deny, and vet cover dependency risk from different angles. | No single tool establishes trust: advisories, licences, source policy, maintainer review, unsafe code, and reproducibility are separate claims. | proptest documentation; Criterion.rs documentation; RustSec Advisory Database; cargo-deny documentation; cargo-vet documentation |
8 application domains derived from rust-ecosystem.json. Components may appear in several domains because serialization, diagnostics, runtimes, and platform boundaries are cross-cutting.
Several patterns recur. Serde separates data-model traits from formats. Tower separates a service interface from HTTP routing and transport. embedded-hal separates portable drivers from chip HALs. wasm-bindgen, PyO3, and CXX generate code around host boundaries. These are all instances of the same architectural move: put a stable typed interface at the seam, then let concrete platform integration vary behind or around it.
Supply-chain and execution boundaries¶
| Boundary | What crosses it | What the mechanism establishes | What it does not establish |
|---|---|---|---|
| Registry archive | Downloaded source bytes | Index checksum; locked version/source | Maintainer intent, review quality, or absence of malicious logic |
| build.rs | Native program on the build host | Cargo scheduling and declared rerun inputs | Sandboxing; Cargo does not make arbitrary build code safe |
| Procedural macro | Compiler-loaded host code over token streams | Typed expansion is checked afterward | The macro process itself is trusted code with host access |
| unsafe module | Unchecked operations in the target artifact | A safe public API can enforce invariants | Soundness if safe surrounding code can violate those invariants |
| Native dependency / FFI | Foreign compiler, linker, ABI, and runtime | Explicit extern types and wrappers | Layout, ownership, unwinding, and behavior outside Rust’s model |
| Async runtime | Scheduler, driver, timers, task lifecycle | Future polling and Send/Sync constraints | Application cancellation, fairness, blocking, and backpressure policy |
Trust-boundary review. The distinctions are intentionally non-overlapping: reproducibility, byte integrity, vulnerability status, licence policy, code review, and memory safety are different claims. Sources: The Cargo Book: Registry Index; The Cargo Book: Build Scripts; The Rust Reference: Procedural macros; The Rustonomicon: Working with Unsafe; cargo-vet documentation.
cargo audit checks resolved packages against RustSec advisories; cargo deny applies
dependency, licence, source, and advisory policy; cargo vet records and imports review evidence.
They complement rather than replace one another. A practical review also inspects feature activation,
duplicate versions, native build steps, repository ownership, release automation, unsafe usage, and whether
the lockfile and toolchain are pinned in the deployment path.
Architecture decision guide¶
| Decision | Starting position | Tradeoff to record | Sources |
|---|---|---|---|
| Does the target provide an operating system and allocator? | Use std for hosted applications; choose no_std only when the platform contract requires it. | Moving from std to alloc/core removes assumptions, but transfers allocation, panic, I/O, synchronization, and startup integration to the application. | The Embedded Rust Book: no_std; The Rust Standard Library |
| Is there enough concurrent waiting to justify an executor ecosystem? | Prefer synchronous code for small bounded flows; select and isolate one async runtime for high-concurrency I/O. | Async reduces waiting-thread cost but introduces pinning, cancellation, task-local context, blocking boundaries, and runtime coupling. | The Rust Programming Language: Async and Await; Tokio runtime architecture |
| Which components need independent package identity or dependency policy? | Start with one package and split a workspace at deployable, ownership, compile-time, or feature boundaries. | Workspaces share a lockfile and target directory, but package splits add public interfaces and can multiply feature/build combinations. | The Cargo Book: Glossary; The Cargo Book: Workspaces |
| Does variation need to be open at runtime or closed at compile time? | Use generics and enums for closed performance-sensitive variation; trait objects for runtime extension points. | Monomorphization enables inlining but grows code and compile work; dynamic dispatch stabilizes a boundary but erases concrete type information. | The Rust Programming Language: Traits |
| Which invariant cannot be represented in safe types? | Keep unsafe operations private behind a small safe API and document the invariant they rely on. | An unsafe block is local syntax, but soundness depends on surrounding state and module privacy, so line counts are not a sufficient audit. | The Rustonomicon: How Safe and Unsafe Interact; The Rustonomicon: Working with Unsafe |
| Which dependency code executes during build or enters the final artifact? | Inspect the resolved graph, minimize features, pin reproducible inputs, and apply advisory, licence, source, and review policies separately. | Cargo.lock fixes versions and registry checksums protect bytes, but neither establishes maintainer intent or the safety of host-executed build code. | The Cargo Book: Dependency Resolution; The Cargo Book: Registry Index; The Cargo Book: Build Scripts; cargo-vet documentation |
6 decisions stored with the graph. These are defaults for design review, not universal prescriptions; target constraints and measured workload evidence can reverse them.
Component and relationship register¶
The register is the lossless text view of the system map. Stable IDs are keys; names are display labels. The build rejects duplicate IDs, dangling endpoints, unknown layers, unsupported relationship kinds, missing citations, unused sources, and community components that appear in no domain.
Components¶
| Stable ID | Component | Layer | Status | Responsibility | Evidence |
|---|---|---|---|---|---|
crates-io | crates.io | Public services | official-service | Default Cargo registry and permanent archive for published crate versions; index entries carry checksums and yank state. | The Cargo Book: Publishing on crates.io; The Cargo Book: Registry Index |
docs-rs | docs.rs | Public services | official-service | Sandboxed documentation builder and host for libraries published to crates.io. | About docs.rs; docs.rs build model |
rustup | rustup | Distribution | official-tool | Installs and selects stable, beta, nightly, archived, or custom toolchains and target libraries. | The rustup book: Toolchains; The rustup book: Components |
cargo | Cargo | Authoring | official-tool | Owns package metadata, dependency and feature resolution, build planning, compiler invocation, testing, documentation, and publication commands. | The Cargo Book: Why Cargo Exists; Cargo internals overview |
rust-analyzer | rust-analyzer | Authoring | official-tool | Language Server Protocol implementation with an incremental semantic model of crates and source files. | Rust tools; rust-analyzer manual |
quality-tools | fmt + Clippy + test | Authoring | official-tool | Standard formatting, compiler-integrated linting, unit/integration/doc-test execution, and fix suggestions. | Rust tools; The rustup book: Components |
rustdoc-miri | rustdoc + Miri | Authoring | official-tool | Generates API documentation and interprets MIR to detect classes of undefined behavior; Miri remains an optional component. | The rustup book: Proxies; Miri |
resolver | Cargo resolver | Build-time code | official-tool | Selects compatible package versions, creates the lock graph, and computes activated features for compilation. | The Cargo Book: Dependency Resolution; The Cargo Book: Features |
build-script | build.rs | Build-time code | project-code | A package-defined program compiled for and executed on the host; communicates compiler and linker configuration through Cargo instructions. | The Cargo Book: Build Scripts |
proc-macro | proc macro | Build-time code | project-code | Host-loaded compiler plugin crate that receives and returns token streams during expansion. | The Rust Reference: Procedural macros |
rustc-front | rustc front end | Compiler | official-tool | Lexes, parses, expands macros, resolves names, lowers the AST to HIR, and performs type and trait checking through compiler queries. | Rust Compiler Development Guide: Overview |
mir | MIR + borrow check | Compiler | official-tool | Runs exhaustiveness and borrow checking over typed intermediate forms, then MIR optimization and monomorphization collection. | Rust Compiler Development Guide: Overview |
backend-linker | backend + linker | Compiler | external-boundary | Translates monomorphized MIR to backend IR and machine objects, then combines objects and native libraries into the target artifact. | Rust Compiler Development Guide: Overview; rustc Codegen Options: linker |
core-alloc-std | core / alloc / std | Runtime boundary | official-library | Layered standard libraries: core without OS or allocation assumptions, alloc with a global allocator, and std with operating-system integration. | The Embedded Rust Book: no_std; The Rust Standard Library |
async-runtime | async runtime | Runtime boundary | community-choice | Application-selected executor, reactor, timers, and async I/O; async/await and Future do not select one for the program. | The Rust Programming Language: Async and Await; Tokio runtime architecture |
native-platform | OS / ABI / device | Runtime boundary | external-boundary | Target-specific operating system, C ABI, linker, WebAssembly host, kernel, or bare-metal device services. | rustc Platform Support; The rustup book: Cross-compilation |
serde | Serde | Community stack | community-crate | Trait- and derive-based serialization boundary shared by many formats and protocols. | Serde documentation |
tokio | Tokio | Community stack | community-crate | Executor, task scheduler, I/O driver, timers, synchronization, and asynchronous operating-system APIs. | Tokio documentation; Tokio runtime architecture |
axum-stack | axum / Tower / hyper | Community stack | community-crate | Composable routing, middleware/service abstraction, and HTTP transport stack built around Tokio. | axum documentation |
tracing | tracing | Community stack | community-crate | Structured, span-aware instrumentation suited to asynchronous and concurrent systems. | tracing documentation |
clap | clap | Community stack | community-crate | Typed command-line argument parsing through builders or derive macros. | clap documentation |
database | SQLx / Diesel | Community stack | community-crate | Two distinct database architectures: asynchronous SQL with checked queries, and a typed query-builder/ORM model. | SQLx documentation; Diesel documentation |
wasm-bindgen | wasm-bindgen | Community stack | community-crate | Bindings and glue generation between Rust-produced WebAssembly modules and JavaScript hosts. | The wasm-bindgen Guide |
embedded-hal | embedded-hal | Community stack | community-crate | Hardware abstraction traits allowing platform-agnostic embedded drivers over concrete HAL implementations. | embedded-hal documentation |
ffi-bridges | PyO3 / CXX | Community stack | community-crate | Higher-level Python and C++ interoperability layers above raw extern functions and native ABIs. | PyO3 user guide; CXX Rust/C++ interop |
gui-game | egui / Bevy | Community stack | community-crate | Immediate-mode application UI and data-driven game/application architecture with an entity-component system. | egui documentation; Bevy documentation |
test-bench | proptest / Criterion | Community stack | community-crate | Property-based test-case generation and statistics-aware microbenchmarking beyond the built-in test harness. | proptest documentation; Criterion.rs documentation |
supply-chain | audit / deny / vet | Community stack | community-crate | Advisory checking, licence/source policy, and review-based dependency auditing over Cargo metadata and lockfiles. | RustSec Advisory Database; cargo-deny documentation; cargo-vet documentation |
All 28 components in data/rust-ecosystem.json. Status distinguishes official project surfaces from community choices and external boundaries; colour continues to classify, never rank.
Relationships¶
| Stable ID | From | Relation | To | Meaning | Evidence |
|---|---|---|---|---|---|
rustup-installs-cargo | rustup | installs | Cargo | installs a channel-specific Cargo component | The rustup book: Components |
rustup-installs-rustc | rustup | installs | rustc front end | selects and proxies the active compiler toolchain | The rustup book: Toolchains; The rustup book: Proxies |
rustup-installs-quality | rustup | installs | fmt + Clippy + test | adds rustfmt and Clippy components | The rustup book: Components |
rustup-installs-doc-miri | rustup | installs | rustdoc + Miri | provides rustdoc with rustc and optionally installs Miri | The rustup book: Components; The rustup book: Proxies |
cargo-queries-registry | Cargo | fetches | crates.io | queries index metadata and downloads checksummed crate archives | The Cargo Book: Registry Index |
cargo-resolves | Cargo | invokes | Cargo resolver | computes package versions and activated features | The Cargo Book: Dependency Resolution; Cargo internals overview |
resolver-locks | Cargo resolver | produces | Cargo | returns the concrete dependency graph recorded in Cargo.lock | The Cargo Book: Dependency Resolution |
cargo-runs-build-script | Cargo | executes | build.rs | compiles and executes package build scripts on the host | The Cargo Book: Build Scripts |
cargo-loads-proc-macro | Cargo | builds | proc macro | builds procedural macro crates for the host | The Cargo Book: Build Cache; The Rust Reference: Procedural macros |
build-script-configures-rustc | build.rs | configures | rustc front end | emits cfg, environment, search-path, and linker instructions | The Cargo Book: Build Scripts |
proc-macro-expands-rustc | proc macro | expands | rustc front end | transforms token streams during macro expansion | The Rust Reference: Procedural macros; Rust Compiler Development Guide: Overview |
cargo-invokes-rustc | Cargo | invokes | rustc front end | runs rustc once per compilation unit with dependency metadata | The Cargo Book: Why Cargo Exists; Cargo internals overview |
cargo-invokes-tools | Cargo | invokes | fmt + Clippy + test | provides common test, lint, format, check, and fix workflows | Rust tools |
cargo-invokes-rustdoc | Cargo | invokes | rustdoc + Miri | runs documentation and Miri subcommands through toolchain proxies | The rustup book: Proxies |
analyzer-reads-cargo | rust-analyzer | models | Cargo | loads Cargo projects and crate graphs for editor analysis | rust-analyzer manual |
front-lowers-mir | rustc front end | lowers-to | MIR + borrow check | lowers typed HIR through THIR into MIR | Rust Compiler Development Guide: Overview |
mir-codegen | MIR + borrow check | lowers-to | backend + linker | monomorphizes and lowers optimized MIR to backend IR and objects | Rust Compiler Development Guide: Overview |
backend-targets-platform | backend + linker | targets | OS / ABI / device | emits and links artifacts for a target triple and ABI | rustc Platform Support; rustc Codegen Options: linker |
std-targets-platform | core / alloc / std | integrates-with | OS / ABI / device | std exposes target operating-system services while core can run without them | The Embedded Rust Book: no_std; rustc Platform Support |
docs-rs-reads-crates | docs.rs | fetches | crates.io | builds documentation for packages released through crates.io | About docs.rs; docs.rs build model |
tokio-is-runtime | Tokio | implements | async runtime | supplies an executor, scheduler, I/O driver, and timers | Tokio runtime architecture |
tokio-targets-os | Tokio | integrates-with | OS / ABI / device | drives operating-system event queues and blocking boundaries | Tokio documentation |
axum-uses-tokio | axum / Tower / hyper | depends-on | Tokio | uses Tokio and hyper, with Tower as the middleware/service boundary | axum documentation |
axum-uses-serde | axum / Tower / hyper | integrates-with | Serde | commonly maps typed request and response bodies through Serde formats | axum documentation; Serde documentation |
tracing-observes-tokio | tracing | integrates-with | Tokio | adds span-aware diagnostics across asynchronous tasks | tracing documentation |
database-uses-runtime | SQLx / Diesel | integrates-with | async runtime | SQLx uses an async runtime while Diesel's core query model is synchronous | SQLx documentation; Diesel documentation |
serde-uses-proc-macro | Serde | expands | proc macro | derive support generates trait implementations at compile time | Serde documentation |
clap-uses-proc-macro | clap | expands | proc macro | derive support generates typed argument parsing declarations | clap documentation |
wasm-targets-host | wasm-bindgen | targets | OS / ABI / device | generates WebAssembly and JavaScript glue for a host boundary | The wasm-bindgen Guide |
embedded-uses-core | embedded-hal | depends-on | core / alloc / std | supports no_std drivers over target-specific HAL implementations | embedded-hal documentation; The Embedded Rust Book: no_std |
ffi-targets-native | PyO3 / CXX | integrates-with | OS / ABI / device | crosses Python or C++ runtimes through generated native interfaces | PyO3 user guide; CXX Rust/C++ interop |
gui-game-targets-platform | egui / Bevy | targets | OS / ABI / device | builds event-loop, graphics, UI, and game artifacts for native or web targets | egui documentation; Bevy documentation |
test-bench-invoked | fmt + Clippy + test | extends | proptest / Criterion | extends built-in tests with generated cases and statistical benchmarks | proptest documentation; Criterion.rs documentation |
supply-chain-reads-cargo | audit / deny / vet | audits | Cargo | evaluates Cargo metadata, sources, and lock graphs against advisories or policy | RustSec Advisory Database; cargo-deny documentation; cargo-vet documentation |
All 34 typed relationships in data/rust-ecosystem.json. Every endpoint resolves to exactly one component above.
Evolution, governance, and limits¶
Rust evolves through the RFC process and teams with separate language, compiler, library, tool, crates.io, infrastructure, and other responsibilities. Stable releases promise compatibility; nightly features and project goals are work in progress, not commitments to ship. The 2026 goals provide a useful map of active investment, but this page does not turn an accepted goal into a stable feature. Sources: Rust governance; Rust Project Goals 2026.
This review does not rank every crate, reproduce crates.io metrics, or claim that representative libraries are mandatory. It also does not claim a fully formal Rust memory model: unsafe-code rules and aliasing details continue to be refined, and the Reference takes precedence where secondary material differs. The map records durable interfaces and explicit boundaries so dated package choices can change without redrawing the language.
The next useful extensions are other ecosystem records using the same component/relationship contract, graph-diff views across snapshot dates, and cross-language queries such as “where can dependency code execute during a build?” or “which languages require an application-selected async runtime?” Those additions should extend the data and validator before extending the page.
Sources¶
Primary project documentation is used for the toolchain and language. Community components point to their own maintained documentation. Accessed for this snapshot on 2026-09-03.
- Announcing Rust 1.98.0, Rust Release Team.
- The Rust Reference, The Rust Project.
- The Rust Programming Language: Understanding Ownership, The Rust Project.
- The Rust Programming Language: Traits, The Rust Project.
- The Rust Programming Language: Error Handling, The Rust Project.
- The Rust Programming Language: Send and Sync, The Rust Project.
- The Rust Programming Language: Async and Await, The Rust Project.
- Rust Edition Guide: What are editions?, The Rust Project.
- rustc Platform Support, The Rust Project.
- rustc Codegen Options: linker, The Rust Project.
- The rustup book: Toolchains, The Rust Project.
- The rustup book: Components, The Rust Project.
- The rustup book: Proxies, The Rust Project.
- The rustup book: Cross-compilation, The Rust Project.
- The Cargo Book: Glossary, The Rust Project.
- The Cargo Book: Why Cargo Exists, The Rust Project.
- The Cargo Book: The Manifest Format, The Rust Project.
- The Cargo Book: Commands, The Rust Project.
- The Cargo Book: Workspaces, The Rust Project.
- The Cargo Book: Dependency Resolution, The Rust Project.
- The Cargo Book: Features, The Rust Project.
- The Cargo Book: Profiles, The Rust Project.
- The Cargo Book: cargo test, The Rust Project.
- The Cargo Book: cargo doc, The Rust Project.
- The Cargo Book: SemVer Compatibility, The Rust Project.
- The Cargo Book: Lints, The Rust Project.
- The Cargo Book: cargo metadata, The Rust Project.
- The Cargo Book: Build Scripts, The Rust Project.
- The Cargo Book: Build Cache, The Rust Project.
- The Cargo Book: Publishing on crates.io, The Rust Project.
- The Cargo Book: Registry Index, The Rust Project.
- Cargo internals overview, The Rust Project.
- The Rust Reference: Procedural macros, The Rust Project.
- Rust Compiler Development Guide: Overview, The Rust Project.
- Rust tools, The Rust Project.
- rust-analyzer manual, The Rust Project.
- Miri, The Rust Project.
- About docs.rs, The Rust Project.
- docs.rs build model, The Rust Project.
- The Embedded Rust Book: no_std, The Rust Project.
- The Rust Standard Library, The Rust Project.
- The Rustonomicon: How Safe and Unsafe Interact, The Rust Project.
- The Rustonomicon: Working with Unsafe, The Rust Project.
- The Rustonomicon: FFI, The Rust Project.
- Serde documentation, Serde project.
- Tokio documentation, Tokio project.
- Tokio runtime architecture, Tokio project.
- axum documentation, Tokio project.
- tracing documentation, Tokio project.
- clap documentation, clap project.
- SQLx documentation, launchbadge.
- Diesel documentation, Diesel project.
- The wasm-bindgen Guide, wasm-bindgen project.
- embedded-hal documentation, Rust Embedded.
- PyO3 user guide, PyO3 project.
- CXX Rust/C++ interop, CXX project.
- egui documentation, emilk.
- Bevy documentation, Bevy project.
- proptest documentation, proptest project.
- Criterion.rs documentation, Criterion project.
- RustSec Advisory Database, RustSec.
- cargo-deny documentation, Embark Studios.
- cargo-vet documentation, Mozilla.
- Rust governance, The Rust Project.
- Rust Project Goals 2026, The Rust Project.