Domain · Specifications

Neith Domain — Technical Specifications

The table below lists every third-party crate that the foundational six workspaces depend on, together with the pinned version.

12sections33 minread

On this page

Technical specification for the Neith sovereign runtime kernel: Cargo workspace organization, public Rust API contracts, the type system of the foundational core workspace, build targets, and integration interfaces.

Status: IMPLEMENTED. Neith is a polyglot domain consisting of ~60 Cargo workspaces under libs/neith/ plus a small set of standalone TypeScript packages. The crate workspaces contain real, production-quality Rust — for example the core workspace alone spans ~19,600 lines across six crates, and the audio-runtime workspace spans ~74,000 lines. This document is grounded in the source of the foundational core, crypto, hal, net, renderer and ui workspaces, which were read directly. Crates outside those six workspaces are inventoried by name and described from their Cargo.toml manifests and crate-level documentation; their exhaustive type surfaces are not enumerated here. Any item below labelled (planned) does not yet exist in source.


This document serves as the engineering reference for Neith's public API surface and workspace organization. A new engineer should read features.md first for a conceptual overview of what each workspace does, then return here when they need the actual types, method signatures, enums, and configuration parameters that code must use.

The document is organized from the ground up: the technology stack table comes first (what versions of what libraries underpin everything), then the workspace inventory (what exists in source), then the full type surfaces of the six foundational engine workspaces in dependency order — core first, then crypto, then hal, net, renderer, and ui. Build integration and the sovereignty invariant close the document.


Technology Stack#

The table below lists every third-party crate that the foundational six workspaces depend on, together with the pinned version. Anything not listed here is either a Neith-internal crate (no third-party dependency) or is used only in the extended workspaces (audio-suite, creative tools, etc.) that are inventoried separately.

Layer Technology
Language Rust, 2021 edition (edition.workspace = true)
Workspace versioning version = "0.1.0", license = "Apache-2.0" (workspace pkg)
Async runtime Custom work-stealing executor on crossbeam-deque + mio
Concurrency crates crossbeam-deque, crossbeam-channel, crossbeam-utils, parking_lot
Serialization serde + serde_json + rmp-serde (MessagePack) + ciborium (CBOR)
Compression lz4_flex, zstd
Hashing (core) blake3
Logging / tracing log, tracing, tracing-subscriber, opentelemetry 0.27
Error handling thiserror 2.0, anyhow
TLS rustls 0.23 (with ring), rustls-pki-types, webpki-roots, rcgen
Audio backend cpal 0.15 (in neith-audio-hal)
Accessibility accesskit 0.24 (in the ui workspace)
Build orchestration Cargo workspaces driven by Nx nx:run-commands executor
Test framework Rust built-in #[test] (extensive per-crate mod tests)

Common misconceptions to avoid: the renderer/hal crates do not depend on wgpu, and neith-physics does not depend on rapier3d. neith-gpu is a self-contained GPU abstraction with its own Backend enum and handle types; neith-physics implements its own broadphase, GJK/EPA narrowphase, and constraint solver over plain [f32; 3] math types. The only external real-time crate actually used in the six core workspaces is cpal (audio HAL). There is also no wasm-bindgen or napi-rs dependency in the core six workspaces — the engine crates are consumed as native Rust crates, not via WASM/Node bindings.


Workspace Organization#

Neith is not six workspaces — libs/neith/ now contains roughly 290 workspace directories, each with its own Cargo.toml ([workspace] manifest), crates/ directory, project.json (Nx wiring), and usually a rust-toolchain.toml. A small number of directories are standalone TypeScript packages instead (they carry package.json + tsconfig.json + src/). The tables below inventory the foundational, audio, and creative workspaces; the sovereignty-closure families (Phases 156–174) are inventoried in the "Closure workspace families" section below. Consult features.md's sovereignty roadmap section for the per-phase capability envelopes and for the later-phase workspaces that do not yet have directories.

Foundational engine workspaces (six)#

Workspace Crates
core/ neith-runtime, neith-alloc, neith-serde, neith-reflect, neith-events, neith-log
crypto/ neith-sym, neith-asym, neith-hash, neith-rand, neith-tls
hal/ neith-gpu, neith-audio-hal, neith-input, neith-sensor, neith-camera, neith-net-hal, neith-storage
net/ neith-transport, neith-game-net, neith-webrtc, neith-http
renderer/ neith-render-graph, neith-gpu-driven, neith-pbr, neith-material-graph, neith-gi, neith-shadows, neith-lighting, neith-virt-geom, neith-postfx, neith-atmosphere, neith-physics, neith-audio, neith-ecs, neith-scripting, neith-animation, neith-gaussian-splatting
ui/ neith-render2d, neith-text, neith-layout, neith-widgets, neith-animation, neith-theme

The renderer/ workspace is a 16-crate workspace — it contains not only the ten rendering crates but also neith-physics, neith-audio, neith-ecs, neith-scripting, neith-animation and neith-gaussian-splatting as workspace members. The ui/ workspace also has a crate named neith-animation; it is distinct from the renderer's neith-animation crate.

Game-AI, scene, asset, and platform workspaces#

The workspaces below extend the foundational six with higher-level engine capabilities. Each follows the same structure: a Cargo.toml workspace manifest, a crates/ directory, and a project.json for Nx integration.

Workspace Crates
ai-runtime/ neith-navigation, neith-behavior-tree, neith-ai-fsm, neith-perception, neith-crowd, neith-ml-inference, neith-llm, neith-npc
scene/ neith-scene-graph, neith-level-stream, neith-world
assets/ neith-asset-format, neith-asset-import, neith-asset-proc, neith-asset-stream, neith-asset-registry
particles/ neith-particle-core, neith-vfx-graph
procgen/ neith-diff-procgen, neith-inverse-procgen, neith-jfa, neith-neuro-facade, neith-neural-flora, neith-scene-agent, neith-nca, neith-physarum, neith-texture-synth, neith-terrain-ml, neith-tiling, neith-wave-noise
weaver/ neith-copernicus, neith-node-graph, neith-geo-nodes, neith-terrain, neith-building
embedded/ neith-embedded-rtos, neith-embedded-sync, neith-embedded-hal, neith-embedded-net, neith-embedded-fs, neith-embedded-security, neith-embedded-power, neith-embedded-sensors, neith-embedded-device
android/ neith-android-core, neith-android-ui, neith-android-privacy, neith-android-perf, neith-android-creative, neith-android-hal, neith-android-connectivity, neith-android-build
vr-os/ neith-vr-runtime, neith-vr-input, neith-vr-display, neith-vr-tracking, neith-vr-guardian, neith-vr-mixed-reality, neith-vr-audio, neith-vr-social, neith-vr-app
browser/ neith-browser-engine, neith-browser-rendering, neith-browser-layout, neith-browser-script, neith-browser-webapi, neith-browser-webgl, neith-browser-media, neith-browser-net, neith-browser-storage, neith-browser-shell
linux/ neith-distro-core, neith-pkg-manager, neith-overlay-manager, neith-kernel-builder, neith-workload-tuner, neith-update-agent, neith-shell, neith-services, neith-audio, neith-graphics, neith-storage, neith-network, neith-security, neith-pkg, neith-settings, neith-creative, neith-installer (plus kernel/, modules/, iso/, packages/, partitions/, flake.nix)

Audio-suite workspaces#

The audio suite is a collection of Cargo workspaces covering the full professional audio stack from driver HAL to DAW features. These are all present in source. Their crate-level type surfaces are not enumerated in this document but are described in features.md under Phases 132–133.

audio-runtime/, audio-graph/, audio-fileio/, audio-telemetry/, audio/ (crate neith-diff-audio), midi-io/, net-audio/, controllers/, vst3-host/, au-host/, lv2-host/, clap-host/, plugin-sandbox/, plugin-validator/, composer/ (crates neith-daw-core, neith-mixer, neith-midi, neith-synth, neith-spatial-audio), notation/, session-view/, comping/, restoration/, pitch/, mastering/, synth-advanced/, modular/, patch-lab/, live-code/, scoring/, sample-content/, dj/, adr-foley/, foley/, realtime-assist/.

Creative-tool workspaces#

The creative tools are Cargo workspaces (not npm packages) that implement the Blender-class 3D creation suite. See features.md Phase 44 for the feature description of each tool.

sculptor/ (crates neith-mesh-edit, neith-sculpt, neith-uv, neith-tex-paint, neith-sculptor-render), animator/ (crates neith-motion, neith-rig, neith-timeline, neith-mocap, neith-facial), cutter/ (crates neith-video-timeline, neith-vfx, neith-color-grade, neith-export), forge-core/ (crate forge-doc-graph).

Standalone TypeScript packages#

These directories are TypeScript libraries (package.json + src/), not Cargo workspaces. They provide infrastructure concerns — cloud management, observability, domain integration adapters — that do not belong in the Rust crates. Each is built with tsup/tsc and participates in the Nx graph via a project.json, but it does not expose any Rust bindings.

Package name Purpose (from package.json)
cloud/ @neith/cloud Cloud infrastructure management — Kubernetes, GPU, storage, network
docs/ @neith/docs Documentation system — developer docs, user guides, API docs
observability/ @neith/observability Observability infrastructure — metrics, logging, distributed tracing
security/ @neith/security Security infrastructure — identity & access, secrets, compliance
qa/ @neith/qa QA infrastructure (private package)
testing/ @neith/testing Test infrastructure — unit, integration, E2E, performance
training/ @neith/training Training/education — courses, onboarding, certifications
release/ @neith/release Release tooling (private package)
integration-bellona/ @neith/integration-bellona Bellona (build & engine) integration
integration-hathor/ @neith/integration-hathor Hathor (worldbuilding) integration
integration-isis/ @neith/integration-isis Isis (generative AI factory) integration
integration-maya/ @neith/integration-maya Maya (game engine / metaverse) integration
integration-sophia/ @neith/integration-sophia Sophia integration (private package)
integration-yemaya/ @neith/integration-yemaya Yemaya (creative studio) integration

The core/ and scene/ workspaces additionally carry a package.json (@neith/core, etc.) alongside their Cargo manifest; this declares the Nx project so the Rust workspace participates in the Nx graph. It does not indicate a published JavaScript surface.

Closure workspace families (Phases 156–174)#

The sovereignty-closure phases are present in source as workspace families under libs/neith/ (roughly 200 workspaces beyond the foundational/audio/ creative sets above). Each family's per-phase capability envelope is in features.md; the family members are:

Phase Family Workspaces
156 gpen-* anim, lineart, modifier, object, rig, shade, storyboard, testing, tools, vr
157 sim-* cloth, core, farm, forces, games, gas, liquid, mpm, ocean, particles, render, rigid, surface, validation
158 vse-* audio, conform, core, effects, ingest, playback, render, review, storyboard, testing, transitions
159 oss-* abstraction, anti-cheat, identity, matchmaking, observability, pixel, prediction, presence, replay, replication, rpc, session, testing, transport, voice
160 profiler-* asset, audio, capture, crash, gpu, memory, net, physics, sample, shader, stat, testing, timing, ui
161 vfx-* attribute, core, data-interfaces, editor, library, modules, perf, renderers, sim, spawn, testing
162 dh-* animator, bodyrig, clothing, core, creator, ethics, eyes, facerig, retarget, sdk, sim, skin, testing, voice
163 vp-* broadcast, camera, cluster, color, control, core, frustum, mr, pipeline, record, scene, testing, wall
164 liveops-* ads, analytics, attribution, cloud-save, compliance, conformance, crm, cs, economy, experiments, iap, portal, remote
165 market-* buyer-portal, catalog, commerce, conformance, creator, creator-analytics, discover, dl, licensing, moderation, review, sdk
166 spatial-* anchors-collab, audio, avatars, conformance, core, input, os, physics, render, sdk, volumes
167 audio-* (engine) accessibility, bus-graph, conformance, dialogue, environment, mix, music, profiler, source, spatial, synth, tooling, voice (the audio-graph/audio-runtime/audio-fileio/audio-telemetry runtime crates are shared with Phases 132–133)
168 gi-* ao, conformance, core, emissive, lightmap, lumen, probe, sdfgi, shadow, sky, volumetric, voxel
169 compute-* abstraction, conformance, debug, dispatch, lang, memory, ml, render, resources, sdk, sim, wave
170 sculpt-*, npr-* sculpt: brushes, core, export, face-sets, layers, mask, polypaint, retopo, testing, topology; npr: cel, inking, line
171 engine-* (shipped subset) engine-verse, engine-lwc, engine-level-instances, engine-megalights, engine-rvt, engine-lights (the rest of 171 and all of the 172–174 engine-*/dcc-* package surface is planned)

Note the engine-audio family (Phase 167) deliberately names its bus/graph crate audio-bus-graph to avoid colliding with the Phase-132 audio-graph runtime workspace.


core Workspace — Sovereign Runtime Kernel#

The core workspace is the bedrock every other Neith crate builds on. It provides the async executor that runs all tasks, the memory allocators that serve all subsystems, the serialization layer that crosses all boundaries, the reflection system that powers editors and scripting, the event bus that connects subsystems, and the diagnostics layer that makes everything observable. No Neith crate may depend on a third-party async runtime instead of neith-runtime, and no Neith crate may use serde directly instead of routing through neith-serde.

libs/neith/core/Cargo.toml declares the workspace, pins all third-party dependency versions in [workspace.dependencies], and sets three Cargo profiles: dev/test at opt-level = 0, release with lto = true, codegen-units = 1, opt-level = 3. The six member crates path-depend on each other via neith-runtime = { path = "crates/neith-runtime" } style entries.

neith-runtime — Async Executor#

neith-runtime is a custom work-stealing async executor designed for game engines and real-time systems. Unlike Tokio, it has no implicit global thread pool and makes no assumptions about blocking I/O patterns — tasks carry explicit priority levels, and the executor can be driven from a game loop's fixed-tick cadence. A consumer creates exactly one Runtime instance, spawns tasks onto it, and drives it with block_on or from a dedicated thread.

Source: core/crates/neith-runtime/src/. The crate's lib.rs re-exports the public surface; the crate is organized into modules affinity, backpressure, cancel, channel, executor, fiber, io, local, metrics, pool, scheduler, sync, timer.

Runtime and configuration#

Runtime (executor/mod.rs) is the primary entry point and the only type most consumers need directly. It wraps an Arc<RuntimeInner> so it can be cheaply cloned and passed across subsystems. The table below lists every public method on Runtime.

Method Behaviour
Runtime::builder() -> RuntimeBuilder Construct a fluent builder.
block_on<F: Future>(&self, future: F) -> F::Output Drive a future to completion on the calling thread, polling I/O and the timer wheel while pending.
spawn<F>(&self, future: F) -> TaskHandle<F::Output> Spawn a task at TaskPriority::Normal. Requires F: Future + Send + 'static, F::Output: Send + 'static.
spawn_with_priority<F>(&self, priority: TaskPriority, future: F) -> TaskHandle<F::Output> Spawn at an explicit priority.
metrics(&self) -> RuntimeMetrics Return a snapshot of runtime counters.
shutdown_timeout(&self, timeout: Duration) Graceful shutdown, waiting up to timeout for active tasks.

Drop for Runtime calls shutdown(Duration::from_secs(5)).

RuntimeConfig is the read-only configuration snapshot returned by RuntimeBuilder::build. All fields have sensible defaults; most consumers only need to override worker_threads to match the target CPU count.

Field Type Default Meaning
worker_threads usize num_cpus::get().max(1) Number of work-stealing worker threads.
thread_name String "neith-worker" Prefix for worker thread names ({name}-{idx}).
thread_stack_size usize 2 * 1024 * 1024 (2 MiB) Per-worker thread stack size.
max_blocking_threads usize 512 Cap for the blocking thread pool.
io_poll_interval Duration 1 ms I/O reactor poll cadence.
timer_resolution Duration 1 ms Timer wheel tick resolution.

RuntimeBuilder exposes chainable setters worker_threads (asserts >= 1), thread_name, thread_stack_size, max_blocking_threads, io_poll_interval, and build() -> Result<Runtime, RuntimeError>.

RuntimeError (thiserror):

  • ThreadSpawn(std::io::Error) — a worker thread failed to spawn (#[from]).
  • ShutDown — the runtime was already shut down.

Scheduler internals. Understanding the scheduler helps when diagnosing latency spikes. RuntimeInner holds four per-priority Injector queues (PriorityInjectors = Arc<[Arc<Injector<RawTask>>; 4]>, index 0 = Critical … 3 = Low), a Vec<Stealer<RawTask>>, a park condvar pair (Arc<(Mutex<usize>, Condvar)>) for sleeping workers, a shutdown_flag (AtomicBool), a task_counter (AtomicU64), the MetricsCollector, the IoDriver, and the TimerWheel. Each worker owns a Chase-Lev LIFO deque (Worker::new_lifo()); the worker poll loop drains its own deque (LIFO, warm cache), then steals from the global priority injectors (FIFO), then steals from a random peer, then parks on the I/O reactor.

TaskPriority (scheduler.rs)#

Every spawned task carries a TaskPriority. The scheduler processes higher priority tasks before lower priority ones within the same tick. Critical tasks are polled before all other work, making them suitable for physics ticks and input processing; Low tasks are only scheduled when nothing higher is pending.

#[repr(u8)] enum, Default = Normal:

Variant Value poll_weight() Meaning
Critical 0 u32::MAX Polled before all other work every scheduler tick.
High 1 4 Polled 4× as often as Normal.
Normal 2 1 Default scheduling weight.
Low 3 0 Background; only scheduled when nothing higher is pending.

Helpers: TaskPriority::ALL (the four variants in descending priority order), name() -> &'static str, poll_weight() -> u32, beats(self, other) -> bool (true when (self as u8) < (other as u8)). Implements Display.

TaskState (executor/task.rs)#

Tasks progress through a defined lifecycle. The TaskState enum models that lifecycle as a #[repr(u8)] value that can be read atomically without locks: Runnable = 0, Running = 1, Waiting = 2, Completed = 3, Cancelled = 4.

Fibers (fiber.rs)#

"Fibers" are cooperative coroutines built on Rust's native stackless async/await — they run as normal tasks inside the work-stealing executor. The fiber API provides named handles, explicit yield points, one-shot synchronization signals, and a counted variant for fan-out/join patterns.

  • FiberId(pub u64) — monotonically increasing fiber identifier.
  • FiberPriority — a re-export of scheduler::TaskPriority.
  • FiberState enum — externally observable lifecycle state: Runnable, Yielded, WaitingSignal, WaitingLatch, WaitingTimer, Completed, Cancelled.
  • yield_now() -> YieldNow — relinquish the executor for exactly one poll cycle, then resume.
  • yield_ticks(n: u32) -> YieldTicks — yield for exactly n cycles.
  • Signal — one-shot synchronisation primitive (fired: AtomicBool, waiters: Mutex<Vec<Waker>>). Signal::new() -> Arc<Self>, fire() wakes all waiters, is_fired() -> bool. wait_signal(Arc<Signal>) -> WaitSignal parks until fired.
  • CountedSignal — fires its inner Signal when an AtomicU64 counter reaches zero. CountedSignal::new(count: u64) -> Arc<Self>, decrement(), wait() -> WaitSignal, remaining() -> u64.

Cancellation (cancel.rs)#

  • CancellationTokennew(), cancelled() (already-cancelled token), cancel(), is_cancelled() -> bool, cancelled_future() -> CancelledFuture (a future that resolves on cancellation), child_token() -> CancellationTokenChild.
  • CancellationTokenChild — a child token whose cancellation propagates from its parent (tree propagation).
  • CancelledFuture — the future yielded by cancelled_future().

Timers (timer.rs)#

  • TimerWheel — hierarchical timer wheel. new(), insert(deadline: Instant, waker: Waker) -> Arc<AtomicBool> (returns a cancellation flag), advance() -> usize (fires due timers, returns count fired).
  • TimerHandlecancel().
  • Sleep — future created by sleep(duration: Duration) -> Sleep or sleep_until(deadline: Instant) -> Sleep.
  • timeout(...) — wraps a future with a deadline; on expiry yields Elapsed.
  • Instant — runtime instant type re-exported at crate root.

Channels (channel/)#

neith-runtime provides three async channel families for task coordination, each suited to a different producer/consumer cardinality. All three are pub use-d at the crate root:

  • mpscmpsc_channel(), MpscSender, MpscReceiver.
  • mpmcmpmc_channel(), MpmcSender, MpmcReceiver.
  • broadcastbroadcast_channel(), BroadcastSender, BroadcastReceiver.

Backpressure (backpressure.rs)#

bounded_channel() yields a BoundedSender / BoundedReceiver pair; the sender applies async back-pressure when the bound is reached.

Async sync primitives (sync/)#

  • AsyncMutex + AsyncMutexGuard
  • AsyncRwLock + AsyncReadGuard + AsyncWriteGuard
  • AsyncSemaphore + SemaphorePermit
  • AsyncBarrier + BarrierWaitResult
  • AsyncLatch

Task-local storage (local.rs)#

TaskLocal — per-task storage slot analogous to thread-local storage.

Blocking pool (pool.rs)#

BlockingPool + BlockingPoolConfig — a dynamically sized thread pool for CPU-bound / blocking work, kept off the async worker threads.

RuntimeMetrics (metrics.rs)#

RuntimeMetrics is a Clone + Default point-in-time snapshot returned by Runtime::metrics(). Use it to diagnose scheduler imbalance, excessive steal contention, or stalled tasks. The derived methods make the raw counters actionable without requiring arithmetic at the call site.

Field Type Meaning
tasks_spawned u64 Total tasks ever spawned.
tasks_completed u64 Tasks that ran to completion.
tasks_cancelled u64 Tasks cancelled before completion.
steal_successes u64 Successful work-steals.
steal_attempts u64 Total steal attempts (success + failure).
io_events u64 I/O events processed by the reactor.
timer_fires u64 Timer entries that fired.
worker_polls Vec<u64> Per-worker poll counts.

Derived methods: tasks_active() (spawned − completed − cancelled, saturating), steal_efficiency() -> f64 (successes / attempts; 1.0 if zero attempts), avg_polls_per_worker() -> f64, busiest_worker() -> Option<(usize, u64)>, idlest_worker() -> Option<(usize, u64)>, load_imbalance() -> f64 ((busiest − idlest) / busiest; 0.0 balanced, 1.0 fully unbalanced). Implements Display.

neith-alloc — Memory Allocators#

neith-alloc provides a suite of specialized allocators, each optimized for a specific access pattern. Using the right allocator for each subsystem eliminates GC pauses, reduces fragmentation, and ensures predictable allocation latency — all critical concerns for a real-time game engine. The system allocator is appropriate for setup code; everything inside a frame tick should use one of the allocators below.

Source: core/crates/neith-alloc/src/ — fifteen modules. Allocators target distinct allocation patterns:

Allocator / utility Module Exported types
Arena (frame-temporary scratch) arena Arena, ArenaScope, BumpArena
Buddy (power-of-two blocks) buddy BuddyAllocator
Memory budget budget MemoryBudget, MemoryBudgetError
Memory-mapped files mmap MemoryMappedFile
Out-of-memory handling oom OomHandler, OomPolicy, set_oom_handler
Pool (fixed-size objects) pool Handle, ObjectPool
Slab (component/entity storage) slab SlabAllocator, SlabHandle
Stack (hierarchical LIFO) stack DoubleEndedStack, StackAllocator, StackMarker
Memory tagging (debug) tag MemTag, tag_alloc, tag_free
TLSF (two-level segregated fit) tlsf TlsfAllocator
Allocation tracking track AllocationRecord, AllocationTracker
Virtual memory virt VirtualMemory, VirtualMemoryFlags

Additional modules without re-exports at the crate root: defrag (defragmentation strategies), huge (huge-page support), shared (shared memory / IPC).

neith-serde — Serialization#

neith-serde is the serialization layer used wherever Neith data crosses a boundary: writing save files, sending game state over the network, persisting editor state, or passing data between Rust and TypeScript. Its primary format is NBF (Neith Binary Format), a custom zero-copy binary format. It also supports JSON (human-readable debugging and Neith-to-JS interop), MessagePack (compact interop), and CBOR (constrained environments). All formats share the same schema definition and versioning infrastructure.

Source: core/crates/neith-serde/src/lib.rs. Modules: nbf, schema, json_ext, compress, partial, validate.

Neith Binary Format (nbf)#

NBF is a custom compact binary format designed for zero-copy deserialization: the in-memory layout matches the wire format closely enough that serialized data can be memory-mapped and accessed without a separate parsing step. Every NBF frame starts with a fixed 20-byte header that identifies the type and payload length, followed by the payload (MessagePack by default, or JSON for the debug variant).

The wire layout is:

text
[0..6]   magic       b"NEITH\x01"          (constant MAGIC)
[6..8]   version     u16 big-endian         (FORMAT_VERSION = 1; 0x8001 = JSON payload)
[8..16]  type_hash   u64 big-endian         (first 8 bytes of BLAKE3 of the type name)
[16..20] payload_len u32 big-endian
[20..]   payload     raw bytes              (MessagePack by default, or JSON)
  • MAGIC: &[u8; 6] = b"NEITH\x01", FORMAT_VERSION: u16 = 1, HEADER_LEN: usize = 20.
  • type_hash_for(type_name: &str) -> u64 — BLAKE3-derived 8-byte type hash.
  • NbfHeader { version: u16, type_hash: u64, payload_len: u32 }.
  • NbfEncoder { strict_types: bool } (default true) — encode<T: Serialize>(type_name, value) -> Result<Bytes, NbfError> (MessagePack payload), encode_json<T>(...) (JSON payload, version word 0x8001).
  • NbfDecoder { strict_types: bool } — decodes NBF frames back into typed values, validating the type hash when strict_types is set.
  • NbfError variants: BadMagic, UnsupportedVersion(u16), LengthMismatch { expected: u32, actual: usize }, TypeHashMismatch { encoded: u64, expected: u64 }, MsgPack(String), Io(String).

Schema, compression, deltas, validation#

  • schemaSchemaVersion, SchemaMigration, SchemaRegistry (versioning and migration chains for forward/backward compatibility).
  • compresscompress_lz4 / decompress_lz4, compress_zstd / decompress_zstd, CompressionLevel.
  • partialDeltaEncoder, DeltaDecoder, FieldDelta (serialize only changed fields for network state sync).
  • validateValidator, ValidationError, ValidationResult.

neith-reflect — Runtime Reflection#

neith-reflect provides runtime type metadata that enables editor property panels, scripting language bindings, automated serialization, and diff/patch workflows — all without hand-written glue code per type. Any Rust type annotated with impl_reflect_struct! (or a custom Reflect implementation) becomes inspectable at runtime: the editor can read and write its fields by name, the scripting layer can create and clone instances, and the undo/redo system can diff two instances and produce a minimal change patch.

Source: core/crates/neith-reflect/src/lib.rs. Modules: type_info, reflect, registry, access, diff, attr, impls, macros.

  • TypeKind enum — Struct, Enum, Primitive, Opaque.
  • FieldInfo { name: &'static str, type_name: &'static str, byte_offset: usize, is_optional: bool }. Constructed const-ly via FieldInfo::new(name, type_name, byte_offset); .optional() marks is_optional = true.
  • TypeInfo { type_name: &'static str, kind: TypeKind, fields: &'static [FieldInfo], size: usize, align: usize }. Constructors new_struct(...), new_primitive(...). Methods field(name) -> Option<&FieldInfo>, field_count() -> usize.
  • Reflect trait + ReflectValue (reflect module) — dynamic field inspection / mutation.
  • ReflectRegistry + RegistryError — global type registry with factory and clone support.
  • get_field / set_field + AccessError — name-keyed runtime field access.
  • ReflectDiff + FieldChange — reflection-based diff/patch (undo-redo, network delta sync).
  • AttributeMap + AttributeValue — attribute/annotation system read by editors.
  • impl_reflect_struct! macro (macros module) — derives a Reflect implementation for a struct.

neith-events — Typed Event Bus#

neith-events is the in-process messaging backbone between engine subsystems. The key design decision is that channels are typed at the Rust type level: trying to publish an event of the wrong type is a compile error, not a runtime panic. This eliminates an entire class of string-keyed event bus bugs common in other game engines.

The crate supports both synchronous delivery (for input events and physics callbacks that need to be processed immediately) and asynchronous queued delivery (for less latency-sensitive events). It also supports event sourcing patterns — where state is derived entirely from event history — enabling complete undo and deterministic replay for debugging.

Source: core/crates/neith-events/src/lib.rs (~2,555 lines, single file with inline modules). Modules: event, channel, bus, reader, filter, batch, replay, source, stats, async_dispatch, priority_channel, cancellable, weak_bus, ipc, flow_graph.

Core event types (event)#

Note that Priority values here are ordered from Low = 0 upward, which is the reverse of runtime::TaskPriority where Critical = 0. This is an intentional design choice: event priority represents urgency on a rising scale, while task priority uses a descending representation for efficient array indexing. Be careful not to confuse the two.

  • Priority enum (Serialize/Deserialize, ordered) — Low = 0, Normal = 1, High = 2, Critical = 3. Default = Normal.
  • EventMeta { sequence: u64, timestamp_ms: u64, source_id: Option<u64>, priority: Priority }. EventMeta::new(sequence) sets timestamp_ms from the system clock; builders .with_priority(p), .with_source(id).
  • EventInstance<T> { payload: T, meta: EventMeta } — a concrete event.
  • Event — blanket marker trait, auto-implemented for every Clone + Send + Sync + 'static type.

Channels and the bus#

  • EventChannel<T> (channel) — a double-buffered typed channel: writers send(payload) / send_with_meta(payload, meta) into the write buffer; swap() atomically swaps write↔read at the frame boundary; read_events() returns a guard over the stable read buffer; drain_immediate() takes all pending events without swapping. Sequence numbers assigned via an internal AtomicU64.
  • EventBus (bus) — type-erased router holding HashMap<TypeId, BoxedChannel>. register::<T>(type_name) adds a channel (idempotent), send::<T>(event) -> Result<(), BusError>, is_registered::<T>() -> bool, registered_count() -> usize.
  • BusErrorNoChannel(String) (no channel for the given type name), TypeMismatch (downcast failure).
  • SwappingBus — an EventBus variant that also stores per-type swap closures so swap_all() can swap every registered channel at the frame boundary.

Reading, filtering, batching, replay, sourcing#

  • EventCursor / EventReader (reader) — cursor-based incremental reads.
  • EventFilter / FilterResult (filter) — predicate-based routing.
  • EventBatch (batch) — collect events and submit atomically.
  • EventReplay (replay) — record events and replay deterministically for debugging.
  • EventSource / Projection (source) — append-only event log with projection and snapshots (event-sourcing pattern).
  • EventStats (stats) — per-type counts and dropped-event counts.
  • AsyncEventDispatcher / AsyncEventQueue (async_dispatch) — priority-ordered queued (async) dispatch.
  • PriorityEventChannel (priority_channel) — four-tier priority queues.
  • CancellableEvent / CancellationContext / EventChain (cancellable) — stoppable propagation chains.
  • WeakEventBus (weak_bus) — listeners held via Weak; dead listeners are auto-culled. subscribe(f) returns the Arc<ListenerFn<T>> the caller must retain; subscribe_weak(Weak<...>) registers without ownership.
  • IpcEvent / IpcEventBus / IpcEventReader (ipc) — file-based cross-process event bus.
  • EventFlowGraph (flow_graph) — DOT/Mermaid dispatch tracing.

neith-log — Diagnostics#

neith-log is the observability layer for Rust code. It bridges to the TypeScript observability stack at domain boundaries via W3C Trace Context propagation, so a span started in a Rust game-loop can be correlated with a TypeScript API call that triggered it. Log calls below the configured level are compiled out entirely in release builds, ensuring zero overhead on hot paths.

Source: core/crates/neith-log/src/lib.rs (~4,337 lines). Modules: structured, custom, error_info, level, rotate, metric, health, assert_sys, perf, crash, async_log, binary, tracing_otel, profiling, remote, analysis.

  • LogLevel enum (level) — Trace = 0, Debug = 1, Info = 2, Warn = 3, Error = 4, Fatal = 5, Off = 6 (Serialize/Deserialize, ordered). LevelFilter applies a runtime threshold.
  • StructuredLogger + LogRecord (structured) — key-value structured records, JSON output.
  • CustomLogger family (custom) — CustomLogger trait, CallbackLogger, CustomLogSink, CustomLoggerConfig, CustomLoggerRegistry, CustomLoggerError, CustomLoggerFailure, CustomLogResult.
  • error_infoDetailedErrorInfo, DetailedErrorBuilder, ErrorCategory, ErrorCause, ErrorLocation, ErrorSeverity, DetailedResult + DetailedResultExt.
  • RotationPolicy + LogRotator (rotate) — size / count / date-based rotation.
  • MetricRegistry + Counter + Gauge + Histogram (metric).
  • HealthChecker + HealthStatus + CheckResult (health).
  • PerformanceMarker + ScopeTimer (perf).
  • CrashReporter + CrashReport + BacktraceMode + DebugBacktrace (crash) — catch_unwind-based crash capture with minidump-style reports.
  • AsyncLogger (async_log) — non-blocking background writer.
  • binaryBinaryLogEncoder/BinaryLogDecoder, BinaryLogSink/BinaryLogReader, BinaryLogRecord.
  • tracing_otel — OpenTelemetry-style distributed tracing: TraceId, SpanId, SpanContext, Span, SpanEvent, SpanStatus, SpanRecord, Tracer, TracerProvider, SpanExporter, ConsoleSpanExporter, and W3CTraceContext (W3C Trace Context propagation).
  • profilingProfilingSpan, ProfilingSession, ProfilingReport, ProfilingSummary (wall / CPU / alloc reporting).
  • remoteRemoteLogSink, RemoteLogTarget, RemoteLogFormat, SyslogFormatter (RFC 5424).
  • analysisLogAnalyzer, LogPattern, AlertRule, AlertTrigger, LogStats.

crypto Workspace — Cryptographic Primitives#

The crypto workspace owns every cryptographic operation in Neith — hashing, symmetric encryption, asymmetric signatures and key exchange, random number generation, and TLS. Centralizing cryptography in a single workspace ensures consistent primitive selection, avoids duplicate dependencies on incompatible crates, and makes security audits tractable.

libs/neith/crypto/Cargo.toml pins rand, rand_core, rustls (features = ["ring"]), rustls-pki-types, webpki-roots, and rcgen. Each of the five crates is a single substantial lib.rs covering one cryptographic concern area.

  • neith-sym (~2,400 lines) — SymError and SymResult<T>. Implements AES-256-GCM from FIPS 197 primitives (S-box, MixColumns, ShiftRows, KeyExpansion present in source), ChaCha20-Poly1305 AEAD, HKDF, PBKDF2, streaming encryption, and secure memory wiping. Errors: AuthTagMismatch, AuthenticationFailed, InvalidKeyLength { expected, actual }, InvalidNonceLength { expected, actual }, CiphertextTooShort, StreamNotInitialized, ChunkTooLarge(usize), InvalidInput(String).
  • neith-asym (~5,545 lines) — AsymError and AsymResult<T>. Ed25519 signing/verification over Twisted-Edwards Curve25519 field arithmetic (prime p = 2^255 − 19, 4×u64 little-endian limbs), X25519 ECDH key exchange, key serialization, certificate-like structures. Errors: InvalidPublicKey, InvalidPrivateKey, VerificationFailed, InvalidSignatureFormat, SerializationError(String), UnsupportedAlgorithm(String).
  • neith-hash (~1,838 lines) — HashError and HashResult<T>. SHA-256 and SHA-512 (FIPS 180-4 constant tables in source), BLAKE3, HMAC, incremental hasher, Merkle trees, a content-addressable store, Argon2id password hashing, HKDF, and timing-safe comparison. Errors: EmptyInput, InvalidProof, HashNotFound(String), Argon2Error(String).
  • neith-rand (~797 lines) — RandError and RandResult<T>. NeithCsprng wraps OsRng (next_u64/next_u32); plus a hardware-RDRAND source, a deterministic ChaCha20-based RNG, UUID v4 generation, an entropy pool, a health monitor, a fork-safe RNG, bias-free sampling, a Fisher-Yates shuffle, and serializable RNG state. Errors: HardwareRngUnavailable, HealthCheckFailed(String), InvalidRange { min, max }, EmptyCharset, Serialization(String).
  • neith-tls (~3,627 lines) — TLS 1.3 / secure-channel layer built on rustls. The crate additionally contains a Noise-protocol-style secure channel whose symmetric primitives are documented in source as simulated for portability (the structure mirrors the real protocol; this is explicitly stated, not a hidden stub).

hal Workspace — Hardware Abstraction Layer#

The hal workspace is the portability layer between Neith's engine code and the physical hardware it runs on. Every platform API difference — GPU backends, audio drivers, input event formats, camera capture APIs — is absorbed here. Above the HAL, all code is platform-agnostic; below it, platform-specific backend implementations handle the details. libs/neith/hal/Cargo.toml pins cpal 0.15, rustls, bitflags, sha2, and aes-gcm. The workspace contains seven crates.

neith-gpu — GPU Abstraction#

neith-gpu is the most critical crate in the HAL workspace: all rendering code in Neith is written against the GpuDevice trait defined here, and never against a concrete backend. Switching the backend (Vulkan → Metal, for example) requires only changing the Backend variant passed at device initialization, not rewriting any rendering code.

Source: hal/crates/neith-gpu/src/lib.rs (~1,566 lines). A self-contained GPU abstraction — it defines its own backend, handle, and descriptor types rather than wrapping wgpu.

The GpuDevice trait is the central abstraction. Concrete backends implement it; renderer crates call it. The key enums, handle newtypes, and descriptor structs below define the full vocabulary of the GPU API:

  • BackendVulkan, Metal, DirectX12, WebGPU, Software.
  • DeviceTypeIntegrated, Discrete, Virtual (plus further variants).
  • Vendor — GPU vendor identification.
  • ShaderStage, ShaderSource.
  • MemoryLocation, AllocationStrategy.
  • CommandBufferState, Command.
  • LoadOp, StoreOp, ImageLayout.
  • TextureFormat.
  • PrimitiveTopology, CullMode, FrontFace, PolygonMode.
  • BlendFactor, BlendOp (Add, Subtract, ReverseSubtract, Min, Max).
  • DescriptorType, QueueFamily, PipelineVariant, FenceState (Unsignaled, Signaled).

All GPU resources are referenced via opaque integer handle newtypes. This prevents accidental mixing of handle types (e.g. passing a ShaderModuleHandle where a PipelineHandle is expected) at compile time. The full set: DeviceId(u32), ShaderModuleHandle(u64), AllocationHandle(u64), CommandBufferHandle(u64), CommandPoolHandle(u64), RenderPassHandle(u64), PipelineHandle(u64), PipelineLayoutHandle(u64), DescriptorSetHandle(u64), DescriptorLayoutHandle(u64), QueueHandle(u64), FenceHandle(u64), SemaphoreHandle(u64).

Descriptor / resource structs include DriverInfo, GpuDeviceInfo, GpuCapabilities, ShaderModule, AllocationRequest, Allocation, VmaAllocator (a VMA-style suballocator with allocate(req: AllocationRequest) -> GpuResult<Allocation>), CommandBuffer, CommandPool, AttachmentDesc, RenderPassDesc, RenderPass, BlendState, GraphicsPipelineDesc, ComputePipelineDesc, Pipeline, DescriptorBinding, DescriptorLayout, DescriptorSet, PipelineLayout, SubmitInfo, Queue, Fence.

The device interface is the GpuDevice trait (Send + Sync). Concrete backends provide a struct that implements this trait; renderer code holds Arc<dyn GpuDevice> and calls only these methods:

rust
pub trait GpuDevice: Send + Sync {
    fn id(&self) -> DeviceId;
    fn info(&self) -> &GpuDeviceInfo;
    fn capabilities(&self) -> &GpuCapabilities;
    fn backend(&self) -> Backend;
    fn allocator(&self) -> &VmaAllocator;
    fn create_shader_module(&self, source: ShaderSource, stage: ShaderStage, entry_point: &str) -> GpuResult<ShaderModule>;
    fn create_command_pool(&self, family: QueueFamily) -> GpuResult<CommandPool>;
    fn create_render_pass(&self, desc: RenderPassDesc) -> GpuResult<RenderPass>;
    fn create_graphics_pipeline(&self, desc: GraphicsPipelineDesc) -> GpuResult<Pipeline>;
    fn create_compute_pipeline(&self, desc: ComputePipelineDesc) -> GpuResult<Pipeline>;
    fn create_descriptor_layout(&self, bindings: Vec<DescriptorBinding>) -> GpuResult<DescriptorLayout>;
    fn create_descriptor_set(&self, layout: &DescriptorLayout) -> GpuResult<DescriptorSet>;
    fn create_pipeline_layout(&self, desc_layouts: Vec<DescriptorLayoutHandle>, push_constants: Vec<(ShaderStage, u32, u32)>) -> GpuResult<PipelineLayout>;
    fn create_fence(&self, signaled: bool) -> GpuResult<Fence>;
    fn create_semaphore(&self, kind: SemaphoreKind) -> GpuResult<Semaphore>;
    fn graphics_queue(&self) -> Option<&Queue>;
    fn compute_queue(&self) -> Option<&Queue>;
    fn transfer_queue(&self) -> Option<&Queue>;
    fn profiler(&self) -> &GpuProfiler;
    fn wait_idle(&self) -> GpuResult<()>;
}

A GpuInstance enumerates devices: enumerate_devices(&self) -> &[Arc<dyn GpuDevice>]. GpuError is the failure type (with GpuResult<T> alias) — variants include NoDevicesFound, DeviceNotFound(DeviceId), UnsupportedBackend(Backend), ShaderCompilation(String), OutOfMemory { requested, available }, NotRecording, NotExecutable, SubmissionFailed(String), SyncTimeout(u64), FeatureNotSupported(String), InvalidHandle, PipelineLayoutMismatch, and a descriptor-set out-of-bounds variant.

Other HAL crates#

The remaining six HAL crates follow the same pattern as neith-gpu: they define a platform-agnostic trait or type set, with platform-specific backends hidden behind it. Their sizes reflect their implementation scope:

  • neith-audio-hal (~1,301 lines) — audio device streams over cpal (CpalBackend); device enumeration and stream management.
  • neith-input (~3,336 lines, two source files) — unified input event abstraction across keyboard, mouse, gamepad, touch and XR sources.
  • neith-sensor (~671 lines) — IMU / sensor abstraction.
  • neith-camera (~1,445 lines) — camera capture abstraction.
  • neith-net-hal (~1,641 lines) — network-interface HAL.
  • neith-storage (~1,586 lines) — async file I/O and storage abstraction.

net Workspace — Networking Stack#

The net workspace provides game-optimized networking that standard TCP/HTTP libraries cannot deliver. Game networking requires sub-20ms latency, reliable delivery without head-of-line blocking, lag compensation, and delta compression. @neith/net addresses all of these. libs/neith/net/Cargo.toml pins hmac, sha1, aes, ctr, and digest. The workspace contains four crates, each targeting a different layer of the network stack.

  • neith-transport (~1,533 lines) — reliable-UDP transport: acknowledgement, retransmission, ordered/unordered channels, congestion control.
  • neith-game-net (~1,422 lines) — game networking: client-side prediction, server reconciliation, snapshot interpolation, lag compensation, delta compression, interest management, RPC.
  • neith-webrtc (~4,007 lines) — WebRTC data channels and media, including a STUN implementation.
  • neith-http (~4,965 lines) — HTTP client/server stack.

renderer Workspace — Rendering, Physics, ECS, Scripting#

The renderer workspace is the largest and most complex workspace in Neith. Its 16 crates implement everything needed for a frame: the render graph that orchestrates pass ordering, the physically-based rendering pipeline, global illumination, post-processing, and the supporting runtime systems (physics, ECS, audio, scripting, animation) that determine what to render each frame.

libs/neith/renderer/Cargo.toml is a 16-member workspace. It pins bitflags (features = ["serde"]), smallvec, slotmap, indexmap, ahash, notify (file watching for hot-reload), petgraph, and bytemuck.

neith-render-graph — Frame Graph#

The frame graph is the central coordination mechanism for the entire rendering pipeline. Rather than calling GPU commands imperatively, renderer code declares passes and their resource dependencies as nodes in a directed acyclic graph. The frame graph compiler then automatically determines execution order (via Kahn topological sort), inserts GPU pipeline barriers, and aliases transient resources to minimize GPU memory usage. The result is that renderer crates never need to write manual synchronization.

Source: renderer/crates/neith-render-graph/src/ (22 files, ~7,256 lines). A production-quality frame graph. Modules (each mapped to a build task in the crate's own doc comment): graph (builder + compiled graph), lifetime (resource lifetime management), compiler + compiler::ordering (Kahn topological sort for pass ordering), aliasing (resource aliasing / memory reuse), async_compute, transient, conditional (conditional passes, FeatureFlags), debug (visualization), serial (JSON / msgpack serialization), multiview (VR stereo), tiled (tile-based rendering), profiler (GPU + CPU timings), dynamic_res (dynamic resolution scaling), hot_reload, fragment_density (fragment density map attachments), vulkan_mobile, resource (TextureDesc, TextureFormat), pass (TextureAccess). The builder entry point is RenderGraphBuilder::new(name) with add_texture, add_graphics_pass, etc.

neith-physics — Multi-Physics Simulation#

neith-physics is a fully self-contained physics engine with no dependency on rapier3d or any other third-party physics library. It implements its own sweep-and-prune/BVH broadphase, GJK/EPA narrowphase, and iterative constraint solver from first principles. This gives Neith complete control over the physics simulation step — including deterministic reproduction, custom constraint types, and tight integration with the ECS component model — without being limited by rapier3d's API surface.

Source: renderer/crates/neith-physics/src/ (12 files, ~10,062 lines). Modules: rigid_body, character, vehicle, ragdoll, cloth, soft_body, fluid, destruction, math, collision_merge, tilemap2d.

Math types (math module) are plain arrays: Vec3 = [f32; 3], Vec4 = [f32; 4], Mat3 = [[f32; 3]; 3], Quat = [f32; 4], plus an Aabb struct.

rigid_body module key types:

  • CollisionShape enum — Sphere { r: f32 }, Box { half: Vec3 }, Capsule { r: f32, h: f32 }, ConvexHull { verts: Vec<Vec3> }, TriangleMesh { verts: Vec<Vec3>, tris: Vec<[usize; 3]> }.
  • CompoundShape — a collection of shapes with local transforms.
  • CollisionFilter { ... }new(layer: u32, mask: u32); layer/mask filtering.
  • PhysicsMaterial — restitution / friction material parameters.
  • RigidBody — fields pos: Vec3, rot: Quat, vel: Vec3, ang_vel: Vec3, mass: f32, inv_mass: f32, inertia_tensor_inv: Mat3, restitution: f32 (default 0.3), friction: f32 (default 0.5), force_accum: Vec3, torque_accum: Vec3. RigidBody::new(pos, mass) derives inv_mass (0.0 when mass <= 0.0, i.e. a static body) and a diagonal inverse inertia tensor. Methods apply_force(f: Vec3), apply_impulse(impulse: Vec3, contact_point: Vec3).
  • JointType enum — Fixed; Hinge { axis: Vec3, limits: Option<[f32; 2]> }; Slider { axis: Vec3, limits: Option<[f32; 2]> }; Ball; Spring { rest_len: f32, stiffness: f32, damping: f32 }.
  • Joint, MotorConstraint, BreakableJoint (new(joint, max_force)).
  • SapBroadphase — sweep-and-prune broadphase; BvhTree / BvhNode — a BVH broadphase alternative.
  • Narrowphase: gjk_closest_points(...), epa_penetration(...), generate_contacts(...), with ContactInfo, ContactManifold, ManifoldCache.
  • SleepState + update_sleep(...) + wake_body(...) — island sleeping.
  • Continuous collision detection: ccd_sphere_sphere(...), ccd_aabb_aabb(...).
  • InterpolatedTransform — physics-to-render interpolation.
  • PhysicsWorld — the simulation container: PhysicsWorld::new(), add_body(body: RigidBody, shape: Option<CollisionShape>) -> usize, step(dt: f32).

Other renderer-workspace crates#

The remaining renderer crates each own a specific sub-pipeline. The source sizes below give a rough sense of implementation depth; all are real, substantial crates with domain-specific algorithms (not CRUD wrappers).

Crate Source size (approx.) Scope
neith-gpu-driven 18 files, ~11,799 lines GPU-driven rendering — frustum/occlusion/Hi-Z culling, indirect draws, persistent buffers.
neith-gi 22 files, ~11,834 lines Global illumination — probes, SDF GI, reflections.
neith-pbr 9 files, ~7,175 lines Physically based rendering — GGX BRDF, IBL, area lights.
neith-postfx 18 files, ~6,549 lines Post-processing — TAA, SSAO/GTAO, bloom, DoF, tonemap.
neith-virt-geom 13 files, ~5,407 lines Virtualized (Nanite-class) geometry — GPU-resident clusters.
neith-gaussian-splatting 20 files, ~5,992 lines 3D Gaussian splatting renderer.
neith-audio 8 files, ~5,652 lines Engine audio (within the renderer workspace).
neith-material-graph 8 files, ~4,733 lines Node-based material graph.
neith-animation 7 files, ~3,775 lines Skeletal / blend-tree animation.
neith-lighting 6 files, ~3,506 lines Directional/point/spot/area lights, IES, clustered/deferred, MegaLights.
neith-scripting 4 files, ~2,863 lines Multi-language scripting — Lua, WASM, visual scripting.
neith-atmosphere 13 files, ~2,804 lines Atmospheric scattering, clouds.
neith-shadows 8 files, ~2,494 lines Cascaded / point / soft shadows.
neith-ecs 5 files, ~2,181 lines Archetype-based entity component system.

ui Workspace — GPU-Accelerated UI Toolkit#

The ui workspace provides a self-contained, GPU-accelerated UI toolkit independent of any web-technology stack. libs/neith/ui/Cargo.toml pins accesskit 0.24 (for accessibility tree integration) and bitflags. The six crates form a layered stack — neith-render2d and neith-text are the rendering foundation, neith-layout positions elements, neith-widgets provides controls, neith-animation handles motion, and neith-theme provides the design token system.

Crate Source size (approx.) Scope
neith-widgets 2 files, ~4,409 lines Retained-mode widget library.
neith-text 1 file, ~2,495 lines Font / text rendering, shaping.
neith-theme 1 file, ~2,331 lines Design-token theming system.
neith-render2d 1 file, ~2,300 lines GPU-accelerated 2D vector renderer.
neith-layout 1 file, ~1,913 lines Flexbox / grid layout engine.
neith-animation 1 file, ~1,187 lines UI animation (spring physics, gesture-driven).

Build and Nx Integration#

Every Cargo workspace has a project.json exposing Nx targets via the nx:run-commands executor. This lets the monorepo's Nx build graph treat Rust crates as first-class projects alongside TypeScript packages — dependency tracking, affected builds, and caching all work uniformly. The core workspace's project.json is representative of the pattern; every other workspace follows the same four-target structure:

Nx target Command
build cargo build --release --manifest-path libs/neith/core/Cargo.toml
test cargo test --manifest-path libs/neith/core/Cargo.toml
lint cargo clippy --manifest-path libs/neith/core/Cargo.toml -- -D warnings
fmt cargo fmt --manifest-path libs/neith/core/Cargo.toml

Each workspace pins its toolchain via a rust-toolchain.toml file. The standalone TypeScript packages instead carry a tsconfig.json, a Vitest config (vitest.config.ts) where tests exist, and a tsup build config where they ship a bundle (e.g. cloud/tsup.config.ts).

Because the worktree layout can produce duplicate Nx project names (each worktree registers the same projects), Nx sometimes fails with a duplicate project error. In that situation, bypass Nx entirely and run the Cargo commands directly (cargo build/cargo test/cargo clippy) — the commands above work identically when run from the workspace directory.


Sovereignty Invariant#

Neith is the lowest layer of the Oshun stack. The Rust workspaces import nothing from other Oshun domains or libs/shared/ — they depend only on third-party crates pinned in each workspace's [workspace.dependencies]. This keeps every Neith crate independently buildable and embeddable outside the Oshun monorepo.

The invariant is enforced architecturally, not just by convention: because libs/neith/ is a set of isolated Cargo workspaces, any attempt to add a path-dependency on another Oshun domain would require adding it to the Cargo manifest — which would be immediately visible in code review.

Downstream domains (Maya's game engine and metaverse layer, Bellona's external-engine export bridges, and others) consume Neith crates; Neith never depends on them. The TypeScript integration packages (@neith/integration-maya, @neith/integration-bellona, etc.) provide the Neith → domain boundary for TypeScript consumers; they are TypeScript libraries, not Rust crates, and do not violate the sovereignty invariant.


Acceptance Criteria#

Every change to a Neith crate must pass all five criteria below before merging. These checks are automated via the Nx lint, build, and test targets, but the final review must verify criteria 4 and 5 manually.

A change to a Neith crate is acceptable when:

  1. The crate compiles under its workspace toolchain (cargo build --manifest-path libs/neith/<workspace>/Cargo.toml).
  2. cargo clippy -- -D warnings is clean for the workspace.
  3. The crate's own #[test] modules pass (cargo test); the foundational crates carry inline mod tests exercising domain correctness (priority ordering, NBF round-trips, metric arithmetic, GJK/EPA contact generation, etc.).
  4. New public types are added to the relevant crate lib.rs re-export block so the workspace surface stays discoverable.
  5. The sovereignty invariant holds — no dependency on other Oshun domains or libs/shared/.

Planned Surface#

The Neith feature inventory (features.md) and TODO phases describe further sovereign systems that extend beyond what is specified in this document.

Where directories already exist under libs/neith/ — for example audio-runtime/, browser/, linux/, ai-runtime/, embedded/, vr-os/, and the creative-tool and audio-suite workspaces — those workspaces are present in source and inventoried in the workspace tables above. Their internal type surfaces are described in features.md but not enumerated in full here.

Items in features.md for which no directory exists under libs/neith/ — including the @neith/os-kernel, @neith/drivers, @neith/fs, and @neith/pkg operating-system packages mentioned in Phase 45, and the named packages of the Phase 132–174 sovereignty-closure roadmap that have no corresponding folder — are (planned) and are not specified here. Any such item added to the codebase should be inventoried in the workspace tables above and, if it is part of the foundational six workspaces, have its public type surface documented in this file.