--- title: "Component Overview" slug: overview description: "" summary: "" date: 2025-03-14T14:14:35+01:00 lastmod: 2025-03-14T14:14:35+01:00 draft: false weight: 32 toc: true --- This diagram gives an overview over the different crates in the repository, the different contained components and the dependencies in between them. If you scroll further down, you find a textual description of what each component does. Check the individual documentation pages for more details. {{< inline-svg src="crate-diagram.svg" width="800px" height="800px" class="svg-inline-custom" >}} ## Castore `snix-castore` is a content-addressed data storage / syncing engine. It uses a merkle structure to store filesystem trees, as well as a chunked blob storage for individual file contents. It is not Nix-specific. ## Store `snix-store` is a Nix store implementation using `snix-castore` for the underlying data structure. It only stores metadata like store path names, nar hashes, references, signatures etc, and offloads content storage to `snix-castore`, by storing the root node describing the contents. There's also a CLI entrypoint that can be used to host a gRPC server endpoint, copy into a store, or mount a store as a FUSE/virtiofs. ## Nix-Compat `nix-compat` is a library providing access to various data formats, protocols and concepts of Nix. It does not depend on other Snix crates, making it a low-dependency crate to include in other (non-snix) projects as well. Other snix crates are usually the primary consumers and drive new functionality in there - new formats etc. are usually "factored out into nix-compat". ## Builder The builder consumes build requests from a client, runs builds and sends logs/telemetry to the client. There currently exists an OCI builder, as well as gRPC server adapter and client implementations, allowing to run the builder both locally or remotely. ## Eval `snix-eval` is a bytecode interpreter evaluator. It knows about basic Nix language data structures and semantics, constructs bytecode and provides a VM executing this bytecode. It also provides some "core" builtins, though builtins are pluggable - you can construct an evaluator and bring your own builtins. It also defines the `EvalIO` trait and provides some very simple implementations of it, which is how the evaluator does do IO. ## Glue `snix-glue` provides some more builtins (those interacting with the Builder and Store mostly). It allows keeping `snix-eval` relatively simple. ## CLI `snix-cli` is a REPL interface, constructing an Evaluator and populating it with most builtins present in Nix. It is our main vehicle to evaluate Nixpkgs and check for differences. ## Serde `snix-serde` is a crate allowing (de)-serialisation of Rust data structures to/from Nix. It allows you to use (a subset of) Nix as a configuration language in/for your application. ## Tracing `snix-tracing` contains some common tracing / logging / progress reporting code that's used in various CLI entrypoints. ## Nar-Bridge `nar-bridge` provides a Nix HTTP Binary cache server endpoint (read-write), using `snix-[ca]store` to store the underlying data. It allows you to host your own binary cache that Nix can talk to. ## Snixbolt This uses `snix-eval`, providing a WASM bytecode explorer running in your browser.