nexus-platform
The main monorepo. A Cargo workspace containing the Rust apps, the shared crates, and deploy manifests. The admin UI lives in its own repo, nexus-ui.
Cargo workspace
[workspace]
members = [
"apps/nexus-core",
"apps/nexus-worker",
"apps/nexus-agent-runner",
"apps/nexus-telegram",
"crates/nexus-domain",
"crates/nexus-db",
"crates/nexus-events",
"crates/nexus-board",
"crates/nexus-board-plane",
"crates/nexus-agent-runtime",
"crates/nexus-ai-runtime",
"crates/nexus-memory",
"crates/nexus-skills",
"crates/nexus-llm",
"crates/nexus-git",
"crates/nexus-k8s",
"crates/nexus-auth",
"crates/nexus-observability"
]
resolver = "2"
The admin console is not in this repo — it is the standalone
nexus-ui Next.js app, which talks to nexus-core over REST.
Apps
| App | Role | Key libraries |
|---|---|---|
nexus-core | HTTP API + orchestration | axum, tokio, tower, tower-http, serde, anyhow, thiserror, tracing, utoipa, jsonwebtoken, argon2, validator |
nexus-worker | Background scheduling/sync | tokio, async-nats, mongodb, serde, tracing, cron, backoff, futures |
nexus-agent-runner | Generic runtime in K8s Jobs | tokio, reqwest, serde, schemars, tracing, async-trait, clap, duct, tempfile, ignore, walkdir, similar |
nexus-telegram | Command gateway | teloxide, tokio, serde, tracing, reqwest |
Shared crates
| Crate | Role | Key libraries |
|---|---|---|
nexus-domain | Pure domain types (zero DB/HTTP) | serde, schemars, uuid, chrono, strum, validator |
nexus-db | MongoDB repository layer | mongodb, bson, serde, futures, thiserror, tracing |
nexus-events | Internal event bus | async-nats, serde, tokio, tracing |
nexus-board | Generic board abstraction (trait) | async-trait, serde, thiserror, anyhow |
nexus-board-plane | Plane implementation | reqwest, serde, async-trait, governor, tracing, hmac, sha2 |
nexus-agent-runtime | Agent execution abstraction (trait) | async-trait, serde, tokio, thiserror |
nexus-ai-runtime | Provider-adapter library: AgentBackend trait + API/CLI backends | genai, reqwest, tokio, schemars, serde, async-trait |
nexus-k8s | Kubernetes runtime impl | kube, k8s-openapi, serde, tokio, futures, tracing |
nexus-skills | Skill registry | serde, serde_yaml, pulldown-cmark, schemars, jsonschema, semver |
nexus-memory | Memory system | mongodb, serde, regex, rust-stemmers (opt), reqwest (opt, embeddings) |
nexus-llm | LLM provider abstraction | reqwest, serde, async-trait, tokio, backoff, tiktoken-rs (opt) |
nexus-git | Git / PR operations | git2 or gix, reqwest, octocrab (opt), duct, tempfile |
nexus-auth | Auth + permissions | jsonwebtoken, argon2, rand, serde, axum-extra, tower-http |
nexus-observability | Metrics, logs, traces | tracing, tracing-subscriber, opentelemetry, opentelemetry-otlp, metrics, metrics-exporter-prometheus |
See Technical: crates for the trait definitions and the rationale behind each boundary.
Why a workspace, not many repos
A workspace gives clean crate boundaries without Git-repo chaos: shared types
in nexus-domain, one place to bump dependencies, atomic cross-crate changes.
Split a crate into its own repo only when it needs an independent release
cadence.
Related
- Technical overview · Architecture
- nexus-agent-images — the images the runner uses
- nexus-gitops — how this repo's images get deployed