Spanda uses a lean-core, package-first architecture. The language kernel defines contracts,
safety, verification interfaces, and runtime hooks. Domain integrations — ROS2, MQTT, GPS, SLAM,
vision, fleet, OTA, cloud — ship as optional official packages under packages/registry/.
Lean-core extraction is complete through Phase 35 (see
lean-core-roadmap.md ).
Principle
Meaning
Core = contracts
Types, safety gate, scheduler interfaces, provider traits, default simulator
Workspace crates = implementations
Parser, interpreter, transport adapters, hardware verify, fleet/OTA
Facade = stability
spanda-core re-exports the public API for external embedders
Apps = direct deps
CLI, Node, WASM, DAP, LLVM import workspace crates, not the full facade
Packages = optional domain
Vendor protocols and drivers via spanda.toml + provider traits
No feature loss
Remaining shims are thin pub use until callers migrate
flowchart TB
subgraph apps ["First-party apps"]
CLI["spanda-cli"]
NODE["spanda-node"]
WASM["spanda-wasm"]
DAP["spanda-dap"]
LLVM["spanda-llvm"]
end
subgraph pipeline ["Compile & run"]
DRIVER["spanda-driver"]
LEX["spanda-lexer"]
PAR["spanda-parser"]
TC["spanda-typecheck"]
HW["spanda-hardware"]
end
subgraph runtime ["Runtime"]
INT["spanda-interpreter"]
RT["spanda-runtime"]
ROUTE["spanda-transport-routing"]
end
subgraph facade ["Public facade"]
CORE["spanda-core"]
end
CLI --> DRIVER
NODE --> DRIVER
WASM --> DRIVER
DAP --> DRIVER
LLVM --> DRIVER
DRIVER --> LEX --> PAR --> TC
DRIVER --> INT
INT --> RT
INT --> ROUTE
CORE -.-> DRIVER
CORE -.-> INT
CORE -.-> HW
Loading
Full crate index: crates/README.md .
Concern
Crate
AST
spanda-ast
Lexer
spanda-lexer
Parser
spanda-parser
Type checker
spanda-typecheck
Diagnostics
spanda-error
SIR
spanda-sir
Concern
Crate
compile, check, run
spanda-driver
Hardware verify (verify_compatibility)
spanda-core::hardware_verify (connectivity + hardware profiles)
Deploy plan extraction
spanda-ota (shimmed as spanda_core::deploy_service)
Certification
spanda-certify
Interpreter
spanda-interpreter
RuntimeHost wiring
spanda-runtime-host
Runtime domains (extracted)
Concern
Crate
Comm bus
spanda-comm
Safety monitor
spanda-safety
HAL / SoC
spanda-hal
Concurrency
spanda-concurrency
Debugger
spanda-debug
AI registry
spanda-ai
Replay / telemetry / triggers
spanda-runtime
Concern
Crate
Adapter traits + wire
spanda-transport
RoutingCommBus + live hooks
spanda-transport-routing
ROS2 / MQTT / DDS / WebSocket
spanda-transport-{ros2,mqtt,dds,websocket}
GPS / nav bridges
spanda-connectivity, spanda-connectivity-runtime
Concern
Crate
Fleet orchestration
spanda-fleet
OTA rollout
spanda-ota
Deploy agent HTTP
spanda-deploy-http
Concern
Crate
fmt
spanda-format
lint
spanda-lint
Codegen metadata
spanda-codegen
doc / reference
spanda-docs
Project modules
spanda-modules
Concern
Crate
spanda.toml / registry
spanda-package
Provider bootstrap
spanda-providers
Security / audit
spanda-security, spanda-audit
spanda-core is a facade , not a monolith:
Re-exports spanda_driver::{check, run, compile, …}
Thin shims for deploy, fleet, connectivity adapters, transport, transport_rclrs
providers.rs facade → spanda-providers + classification
Removed (Phase 17): transport_live, transport_mqtt, transport_dds, transport_websocket
External code may keep using spanda_core::. In-repo and new integrations should prefer the owning
crate (see migration.md ).
Twenty first-party packages under packages/registry/ (GPS, Wi-Fi, ROS2, MQTT, fleet, OTA, …). Each
declares capabilities in spanda.toml and registers providers when installed.
Catalog: official-packages.md
Traits: provider-interfaces.md
Core modules are tagged in spanda_runtime::classification (mirrored in TypeScript
src/providers/index.ts):
Ownership
Description
Core
Language and platform kernel
StandardLibrary
std.* without vendor code
OfficialPackage
packages/registry/*
CompatibilityShim
Legacy spanda_core module with target package
Deprecated
Removed from core; use workspace crate