<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Casita | Blog</title><description>A home for your objects. Verified content-addressed storage, synchronization, and garbage collection, built in Rust.</description><link>https://casita.rs/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://casita.rs/blog/rss.xml"/><item><title>Introducing Casita: A content-addressed store for source code and build artifacts</title><link>https://casita.rs/blog/introducing-casita-a-content-addressed-store-for-source-code-and-build-artifacts/</link><guid isPermaLink="true">https://casita.rs/blog/introducing-casita-a-content-addressed-store-for-source-code-and-build-artifacts/</guid><description>Source code and build artifacts sharing verified storage, synchronization, and garbage collection.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re rewriting &lt;a href=&quot;https://nix.dev/&quot;&gt;Nix&lt;/a&gt; in Rust, and it needs to be
&lt;a href=&quot;https://casita.rs/concepts/responsibilities/&quot;&gt;split into layers&lt;/a&gt; and modernized.&lt;/p&gt;
&lt;p&gt;Its storage, build machinery, and higher-level tools can each be useful on their own.&lt;/p&gt;
&lt;p&gt;You should be able to use one layer without adopting the whole stack.&lt;/p&gt;
&lt;p&gt;That matters even more in agentic development. Agents produce more source code, more versions of it, and more build artifacts as they explore and test changes.&lt;/p&gt;
&lt;p&gt;Keeping every copy quickly becomes expensive, but throwing everything away means rebuilding or regenerating work you might need again.&lt;/p&gt;
&lt;p&gt;Developers are sharing screenshots of disks filled with &lt;code dir=&quot;auto&quot;&gt;target/&lt;/code&gt; directories in a matter of hours.&lt;/p&gt;
&lt;p&gt;It feels familiar to how Nix users who have had to garbage collect
their &lt;code dir=&quot;auto&quot;&gt;/nix/store&lt;/code&gt;: which artifacts are still useful, which ones can go, and how to reclaim space without losing what another project still needs.&lt;/p&gt;
&lt;p&gt;Casita is our first standalone layer, a &lt;a href=&quot;https://casita.rs/overview/&quot;&gt;content-addressed object store&lt;/a&gt; for source code and build artifacts, with &lt;a href=&quot;https://casita.rs/concepts/deduplication/&quot;&gt;shared storage&lt;/a&gt;, &lt;a href=&quot;https://casita.rs/concepts/verification/&quot;&gt;verification&lt;/a&gt;, &lt;a href=&quot;https://casita.rs/concepts/sync/&quot;&gt;synchronization&lt;/a&gt;, and &lt;a href=&quot;https://casita.rs/concepts/garbage-collection/&quot;&gt;garbage collection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is still pre-release and available as a Rust library and CLI. We’re targeting
Linux, macOS, and Windows.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-storage-problem-in-cargo-package-managers&quot;&gt;The storage problem in &lt;del&gt;Cargo&lt;/del&gt; package managers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Rust workspaces and throwaway checkouts can accumulate &lt;code dir=&quot;auto&quot;&gt;target/&lt;/code&gt; directories.
Deleting them discards artifacts a later build might reuse; keeping them
duplicates bytes across similar projects. &lt;a href=&quot;https://doc.rust-lang.org/cargo/guide/cargo-home.html&quot;&gt;Cargo&lt;/a&gt;
and &lt;a href=&quot;https://docs.astral.sh/uv/concepts/cache/&quot;&gt;uv&lt;/a&gt; cache downloaded
dependencies, but their caches do not manage source versions and generated
outputs across projects.&lt;/p&gt;
&lt;p&gt;We added an &lt;a href=&quot;https://github.com/cachix/cargo/commit/a393d0143a6a5ee600e2c6f87d0eb537de8954d2&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ArtifactStorage&lt;/code&gt; interface&lt;/a&gt;
so Cargo can prepare and persist registry archives, Git dependencies, and
workspace build outputs through different backends. The filesystem backend
preserves Cargo’s usual behavior.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/cachix/cargo/commit/7953f9427a3dba5eae5f3eb687d7a8ae9b78fa3b&quot;&gt;Casita backend&lt;/a&gt;
imports and restores that content through &lt;a href=&quot;https://casita.rs/integrations/ipc/&quot;&gt;local IPC&lt;/a&gt;,
while Cargo still decides what to download and build. This remains
experimental: import and restore performance has not yet matched the
filesystem backend. The &lt;a href=&quot;https://github.com/cachix/cargo/tree/artifacts%2Bcasita&quot;&gt;development branch&lt;/a&gt;
and &lt;a href=&quot;https://casita.rs/integrations/cargo/&quot;&gt;Cargo guide&lt;/a&gt; have the details.&lt;/p&gt;
&lt;section aria-labelledby=&quot;blog-repository-title&quot;&gt;&lt;div&gt;&lt;header&gt;&lt;h3 id=&quot;blog-repository-title&quot;&gt;Cargo using Casita&lt;/h3&gt;&lt;/header&gt;&lt;casita-file-flow&gt;&lt;div&gt;&lt;div role=&quot;group&quot; aria-label=&quot;Explore the artifact lifecycle&quot;&gt;&lt;button type=&quot;button&quot; data-scene=&quot;0&quot; aria-pressed=&quot;true&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Write&lt;/button&gt;&lt;button type=&quot;button&quot; data-scene=&quot;1&quot; aria-pressed=&quot;false&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Run&lt;/button&gt;&lt;/div&gt;&lt;button type=&quot;button&quot; data-play=&quot;&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; aria-hidden=&quot;true&quot;&gt;&lt;path data-play-icon=&quot;&quot; d=&quot;M8 4v16 M16 4v16&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span data-play-label=&quot;&quot;&gt;Pause&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;div&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;path data-metadata-edge=&quot;&quot;&gt;&lt;/path&gt;&lt;path data-payload-edge=&quot;0&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;A&quot; data-artifact=&quot;0&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;B&quot; data-artifact=&quot;0&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;C&quot; data-artifact=&quot;0&quot;&gt;&lt;/path&gt;&lt;path data-payload-edge=&quot;1&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;A&quot; data-artifact=&quot;1&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;C&quot; data-artifact=&quot;1&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;D&quot; data-artifact=&quot;1&quot;&gt;&lt;/path&gt;&lt;path data-payload-edge=&quot;2&quot;&gt;&lt;/path&gt;&lt;path data-chunk-edge=&quot;E&quot; data-artifact=&quot;2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div aria-hidden=&quot;true&quot;&gt;&lt;span data-write=&quot;A&quot; data-artifact=&quot;0&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-write=&quot;B&quot; data-artifact=&quot;0&quot; data-tone=&quot;B&quot;&gt;B&lt;/span&gt;&lt;span data-write=&quot;C&quot; data-artifact=&quot;0&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;span data-write=&quot;A&quot; data-artifact=&quot;1&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-write=&quot;C&quot; data-artifact=&quot;1&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;span data-write=&quot;D&quot; data-artifact=&quot;1&quot; data-tone=&quot;D&quot;&gt;D&lt;/span&gt;&lt;span data-write=&quot;E&quot; data-artifact=&quot;2&quot; data-tone=&quot;E&quot;&gt;E&lt;/span&gt;&lt;span data-read=&quot;A&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-read=&quot;B&quot; data-tone=&quot;B&quot;&gt;B&lt;/span&gt;&lt;span data-read=&quot;C&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;span data-metadata=&quot;&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;article&gt;&lt;header&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;h3&gt;Cargo&lt;/h3&gt;&lt;/header&gt;&lt;div&gt;&lt;span&gt;$ cargo build --bin uv&lt;/span&gt;&lt;div&gt;&lt;div data-output=&quot;1&quot;&gt;&lt;div&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;libuv.rlib&lt;/strong&gt;&lt;span&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 12l4 4L19 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-emitter=&quot;1&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;i&gt;&lt;/i&gt;&lt;span data-source=&quot;A&quot; data-artifact=&quot;1&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-source=&quot;C&quot; data-artifact=&quot;1&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;span data-source=&quot;D&quot; data-artifact=&quot;1&quot; data-tone=&quot;D&quot;&gt;D&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;/div&gt;&lt;p data-output-status=&quot;1&quot;&gt;Waiting&lt;/p&gt;&lt;/div&gt;&lt;div data-output=&quot;0&quot;&gt;&lt;div&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;uv&lt;/strong&gt;&lt;span&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 12l4 4L19 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-emitter=&quot;0&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;i&gt;&lt;/i&gt;&lt;span data-source=&quot;A&quot; data-artifact=&quot;0&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-source=&quot;B&quot; data-artifact=&quot;0&quot; data-tone=&quot;B&quot;&gt;B&lt;/span&gt;&lt;span data-source=&quot;C&quot; data-artifact=&quot;0&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;/div&gt;&lt;p data-output-status=&quot;0&quot;&gt;Waiting&lt;/p&gt;&lt;/div&gt;&lt;div data-output=&quot;2&quot;&gt;&lt;div&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;uv.d&lt;/strong&gt;&lt;span&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 12l4 4L19 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-emitter=&quot;2&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4h16v16H4z M8 9l3 3-3 3 M13 15h3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;i&gt;&lt;/i&gt;&lt;span data-source=&quot;E&quot; data-artifact=&quot;2&quot; data-tone=&quot;E&quot;&gt;E&lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;/div&gt;&lt;p data-output-status=&quot;2&quot;&gt;Waiting&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p data-source-status=&quot;&quot;&gt;Writing outputs&lt;/p&gt;&lt;/div&gt;&lt;/article&gt;&lt;article&gt;&lt;header&gt;&lt;i aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;&lt;h3&gt;Casita&lt;/h3&gt;&lt;/header&gt;&lt;div role=&quot;group&quot; aria-label=&quot;Storage graph: a named root, directory, file objects, blobs, and chunks&quot;&gt;&lt;div&gt;&lt;svg viewBox=&quot;0 0 600 465&quot; preserveAspectRatio=&quot;none&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M300 50V88&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M300 148 C300 180 300 173 300 205&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M300 148 C300 180 100 173 100 205&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M300 148 C300 180 500 173 500 205&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div data-build-root=&quot;&quot;&gt;&lt;strong&gt;cargo/builds/uv&lt;/strong&gt;&lt;small&gt;Named root&lt;/small&gt;&lt;/div&gt;&lt;div data-directory=&quot;&quot;&gt;&lt;strong&gt;Output directory&lt;/strong&gt;&lt;small&gt;Directory object · file entries&lt;/small&gt;&lt;/div&gt;&lt;div&gt;&lt;div data-object=&quot;0&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong title=&quot;uv&quot;&gt;uv&lt;/strong&gt;&lt;small&gt;File object&lt;/small&gt;&lt;/div&gt;&lt;div data-object=&quot;1&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong title=&quot;libuv-7872c67b79c6bf1c.rlib&quot;&gt;libuv.rlib&lt;/strong&gt;&lt;small&gt;File object&lt;/small&gt;&lt;/div&gt;&lt;div data-object=&quot;2&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong title=&quot;uv.d&quot;&gt;uv.d&lt;/strong&gt;&lt;small&gt;File object&lt;/small&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div data-blob=&quot;0&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M20 6c0 2-4 3-8 3S4 8 4 6s4-3 8-3 8 1 8 3z M4 6v12c0 2 4 3 8 3s8-1 8-3V6 M4 12c0 2 4 3 8 3s8-1 8-3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;Blob&lt;/strong&gt;&lt;small&gt;File contents&lt;/small&gt;&lt;/div&gt;&lt;div data-blob=&quot;1&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M20 6c0 2-4 3-8 3S4 8 4 6s4-3 8-3 8 1 8 3z M4 6v12c0 2 4 3 8 3s8-1 8-3V6 M4 12c0 2 4 3 8 3s8-1 8-3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;Blob&lt;/strong&gt;&lt;small&gt;File contents&lt;/small&gt;&lt;/div&gt;&lt;div data-blob=&quot;2&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M20 6c0 2-4 3-8 3S4 8 4 6s4-3 8-3 8 1 8 3z M4 6v12c0 2 4 3 8 3s8-1 8-3V6 M4 12c0 2 4 3 8 3s8-1 8-3&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;Blob&lt;/strong&gt;&lt;small&gt;File contents&lt;/small&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div data-chunk=&quot;A&quot; data-tone=&quot;A&quot;&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;small&gt;chunk&lt;/small&gt;&lt;/div&gt;&lt;div data-chunk=&quot;B&quot; data-tone=&quot;B&quot;&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;small&gt;chunk&lt;/small&gt;&lt;/div&gt;&lt;div data-chunk=&quot;C&quot; data-tone=&quot;C&quot;&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;small&gt;chunk&lt;/small&gt;&lt;/div&gt;&lt;div data-chunk=&quot;D&quot; data-tone=&quot;D&quot;&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;small&gt;chunk&lt;/small&gt;&lt;/div&gt;&lt;div data-chunk=&quot;E&quot; data-tone=&quot;E&quot;&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;small&gt;chunk&lt;/small&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Storage links, not compilation dependencies. Chunk boundaries and sharing are illustrative; directory payload details are omitted.&lt;/p&gt;&lt;/div&gt;&lt;/article&gt;&lt;article&gt;&lt;header&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 4h14v12H5z M2 20h20l-3-4H5z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;h3&gt;Run uv&lt;/h3&gt;&lt;/header&gt;&lt;div data-file=&quot;&quot;&gt;&lt;div&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M7 3h8l4 4v14H5V3z M14 3v5h5 M8 12h8 M8 16h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;strong&gt;uv&lt;/strong&gt;&lt;span&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 12l4 4L19 6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span data-byte=&quot;A&quot; data-tone=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span data-byte=&quot;B&quot; data-tone=&quot;B&quot;&gt;B&lt;/span&gt;&lt;span data-byte=&quot;C&quot; data-tone=&quot;C&quot;&gt;C&lt;/span&gt;&lt;/div&gt;&lt;p data-file-status=&quot;&quot;&gt;Awaiting metadata&lt;/p&gt;&lt;/div&gt;&lt;div data-run-result=&quot;&quot; aria-hidden=&quot;true&quot;&gt;&lt;span&gt;$ casita run cargo/builds/uv -- --version&lt;/span&gt;&lt;samp&gt;uv 0.12.7 (x86_64-unknown-linux-gnu)&lt;/samp&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Output tree prepared. Executable discovered and run.&lt;/span&gt;&lt;button type=&quot;button&quot; data-reset=&quot;&quot;&gt;&lt;svg width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10a8 8 0 1 1 1 8 M4 4v6h6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Replay&lt;/button&gt;&lt;/div&gt;&lt;/casita-file-flow&gt;&lt;p&gt;Proposed Cargo integration · uv 0.12.7 · executable reconstruction shown; chunks are illustrative. &lt;a href=&quot;https://casita.rs/guides/run/&quot;&gt;Run applications →&lt;/a&gt; · &lt;a href=&quot;https://casita.rs/examples/uv-artifacts.json&quot;&gt;Verified artifact ↗&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;
&lt;div&gt;&lt;h2 id=&quot;how-casita-works&quot;&gt;How Casita works&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Think of Casita’s storage model as a generalized Git object database. Git has
blobs, trees, and commits. Casita stores immutable byte blobs and immutable
object records: each format defines an object’s identity and its links to other
objects. A directory links to its files and subdirectories; a Git commit links
to a tree and its parents. Casita follows those links to find a complete saved
version.&lt;/p&gt;
&lt;p&gt;Every blob has a
&lt;a href=&quot;https://github.com/BLAKE3-team/BLAKE3/blob/master/README.md&quot;&gt;BLAKE3&lt;/a&gt; hash of its
complete bytes. BLAKE3 computes that hash as the root of a Merkle tree. Casita
can keep an optional &lt;a href=&quot;https://github.com/oconnor663/bao#outboard-mode&quot;&gt;Bao &lt;em&gt;outboard&lt;/em&gt;&lt;/a&gt;
with the tree’s intermediate hashes, so a reader can verify one range against
the blob’s hash without reading the whole blob. A full sequential read checks
the complete hash. The storage backend may chunk and compress the bytes without
changing their address.&lt;/p&gt;
&lt;p&gt;An object record gives those bytes meaning and links. For &lt;code dir=&quot;auto&quot;&gt;src/main.rs&lt;/code&gt;, a file
record points to the blob containing its source code. The &lt;code dir=&quot;auto&quot;&gt;src/&lt;/code&gt; directory has
its own record, which links to that file record and points to a blob encoding
the directory entries. These records form a graph above the blobs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://casita.rs/images/blog/introducing-casita/graph-and-blobs.svg&quot; alt=&quot;The Object Store links the src directory record to the main.rs file record. Each points to BLAKE3-addressed bytes in the Blob Store.&quot;&gt;&lt;/p&gt;
&lt;p&gt;For this &lt;a href=&quot;https://casita.rs/concepts/directory-storage/&quot;&gt;filesystem tree&lt;/a&gt;, the hashes connect
roughly like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;main.rs ID = BLAKE3(file bytes)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;src/ ID    = BLAKE3(canonical entries containing main.rs ID)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Changing &lt;code dir=&quot;auto&quot;&gt;main.rs&lt;/code&gt; creates a new file ID, which changes the &lt;code dir=&quot;auto&quot;&gt;src/&lt;/code&gt; directory
ID and the IDs of its parent directories. Unchanged files keep their IDs and
stored bytes. The old blobs and records are never rewritten.&lt;/p&gt;
&lt;p&gt;The blob’s BLAKE3 hash and a source format’s hash serve different purposes. A
&lt;a href=&quot;https://casita.rs/guides/git/&quot;&gt;Git commit&lt;/a&gt; keeps its native Git ID while Casita addresses its
body bytes by their BLAKE3 hash. A &lt;a href=&quot;https://nix.dev/manual/nix/2.35/command-ref/nix-store/dump&quot;&gt;Nix archive
(NAR)&lt;/a&gt; has a SHA-256
hash of its canonical serialization. Casita measures that NAR hash, then stores
the archive’s files as a graph of BLAKE3-addressed blobs. The verified object
records let Casita traverse the graph without decoding every payload.&lt;/p&gt;
&lt;p&gt;Read &lt;a href=&quot;https://casita.rs/concepts/blob-storage/&quot;&gt;Blob Storage&lt;/a&gt; and the
&lt;a href=&quot;https://casita.rs/concepts/repository/&quot;&gt;repository model&lt;/a&gt; for the detailed contracts. The
&lt;a href=&quot;https://casita.rs/integrations/ipc/#nar-and-filesystem-nar&quot;&gt;NAR IPC guide&lt;/a&gt; shows how to import
and restore an archive.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;repository-workflows&quot;&gt;Repository workflows&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;roots-and-retention&quot;&gt;Roots and retention&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;An application gives a saved graph a name, called a
&lt;a href=&quot;https://casita.rs/concepts/roots-and-retention/&quot;&gt;&lt;em&gt;root&lt;/em&gt;&lt;/a&gt;. The root points to one exact object and
keeps everything reachable from it. The objects and blobs stay immutable; the
application can move or remove the root as its needs change.&lt;/p&gt;
&lt;p&gt;Applications can save separate versions explicitly. For example, import a
project directory after two revisions under &lt;code dir=&quot;auto&quot;&gt;projects/app/v1&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;projects/app/v2&lt;/code&gt;. The imports leave the original working directory in place.
Both names keep their versions available, and identical files share one blob.
An application could also point &lt;code dir=&quot;auto&quot;&gt;projects/app/current&lt;/code&gt; at the same object as
&lt;code dir=&quot;auto&quot;&gt;v2&lt;/code&gt;, then move that name to a later version without changing either saved
graph.&lt;/p&gt;
&lt;p&gt;Casita follows links from a root to find its complete graph for synchronization
and retention. Removing a name makes objects needed only by that name eligible
for garbage collection once active work releases them; files and chunks shared
with another root remain.&lt;/p&gt;
&lt;p&gt;Roots are permanent by default, which suits saved Git histories and releases.
Rebuildable data, such as a Cargo &lt;code dir=&quot;auto&quot;&gt;target/&lt;/code&gt; directory, can instead use an
evictable root:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cargo/my-app/target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--retention&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;evictable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cargo/my-app/target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--long&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The CLI can also change retention later with &lt;a href=&quot;https://casita.rs/reference/cli/#root-retention&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;root retention&lt;/code&gt;&lt;/a&gt;.
The &lt;a href=&quot;https://casita.rs/reference/rust-api/&quot;&gt;Rust API&lt;/a&gt; provides &lt;code dir=&quot;auto&quot;&gt;set_root_with_retention&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;touch_root&lt;/code&gt; for applications that manage their own cache roots. Marking a root
evictable does not remove it immediately.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;filesystem-tar-nar-and-git-imports&quot;&gt;Filesystem, tar, NAR, and Git imports&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://casita.rs/concepts/imports/&quot;&gt;Importers&lt;/a&gt; turn inputs into graphs that Casita can verify
and retain. The &lt;a href=&quot;https://casita.rs/guides/filesystem/&quot;&gt;filesystem importer&lt;/a&gt; walks a directory;
the &lt;a href=&quot;https://casita.rs/guides/tar/&quot;&gt;tar importer&lt;/a&gt; reads an archive without extracting it first;
and the &lt;a href=&quot;https://casita.rs/integrations/ipc/#nar-and-filesystem-nar&quot;&gt;NAR importer&lt;/a&gt; measures a
Nix archive’s canonical SHA-256 while storing its files as a graph. The
&lt;a href=&quot;https://casita.rs/guides/git/&quot;&gt;Git importer&lt;/a&gt; keeps native Git object IDs and a view of selected
branches and tags.&lt;/p&gt;
&lt;p&gt;Each importer uses the same repository publication and retention rules. Once
content is saved under a root, Casita can synchronize it and collect it when
no name or active work needs it.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;casitar-archives&quot;&gt;Casitar archives&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://casita.rs/guides/casitar/&quot;&gt;Casitar&lt;/a&gt; writes a complete saved graph to a portable
&lt;code dir=&quot;auto&quot;&gt;.casitar&lt;/code&gt; archive. You can pass it through a file, pipe, or release artifact
when the source repository is unavailable to the receiver. On import, Casita
checks every payload and object record, verifies that the archive contains the
whole graph, and then publishes the destination roots together. The archive
carries object identities and bytes, independent of the source repository’s
packing and database layout.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;git-object-database-adapter&quot;&gt;Git object database adapter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The experimental &lt;a href=&quot;https://github.com/cachix/casita/blob/main/crates/casita/examples/gix_casita_odb.rs&quot;&gt;Gix object database
adapter&lt;/a&gt;
reads and writes native Git objects through Casita. Git’s SHA-1 or SHA-256 IDs
stay intact while Casita verifies and stores the object bodies and their links.
The adapter covers object storage; a complete Git repository also needs its
refs, index, and working tree integrated. The example writes a blob, tree, and
commit, then reopens the store and reads the commit back.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;casitafs-mounts&quot;&gt;CasitaFS mounts&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The companion &lt;a href=&quot;https://github.com/cachix/casita/blob/main/crates/casita-fs/README.md&quot;&gt;CasitaFS&lt;/a&gt;
crate presents a saved filesystem tree as a read-only mount. Existing tools can
browse its files without first checking out the whole tree. It uses FUSE on
Linux and a native FSKit extension on macOS 26 or later. The macOS extension
requires explicit setup for each user.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;repository-sync&quot;&gt;Repository sync&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Suppose a second repository already has &lt;code dir=&quot;auto&quot;&gt;projects/app/v1&lt;/code&gt;. Syncing
&lt;code dir=&quot;auto&quot;&gt;projects/app/v2&lt;/code&gt; reuses what is there and sends missing content. Compatible
stores can reuse chunks within changed files too. The destination checks
incoming objects against their format’s rules and verifies that the whole
saved version arrived before it updates the name. An interrupted transfer can
be retried without exposing a partial version through that name.&lt;/p&gt;
&lt;p&gt;Local repository sync is implemented in the CLI and Rust library. An optional
SSH source uses OpenSSH for the connection while the receiving Casita repository
still verifies what arrives. Sync adds content; removing destination names and
collecting unused data are separate actions. See &lt;a href=&quot;https://casita.rs/guides/sync/&quot;&gt;Synchronization&lt;/a&gt;
for local, SSH, and selective workflows.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;garbage-collection&quot;&gt;Garbage collection&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If both &lt;code dir=&quot;auto&quot;&gt;projects/app/v1&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;projects/app/v2&lt;/code&gt; are named, Casita keeps both.
Remove the first name and run collection: bytes needed only by &lt;code dir=&quot;auto&quot;&gt;v1&lt;/code&gt; can go,
while files and chunks shared with &lt;code dir=&quot;auto&quot;&gt;v2&lt;/code&gt; stay. Active readers and writers also
hold on to the data they are using during collection.&lt;/p&gt;
&lt;p&gt;The local CLI can preview a pass with &lt;code dir=&quot;auto&quot;&gt;gc --dry-run&lt;/code&gt; before running &lt;code dir=&quot;auto&quot;&gt;gc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Automatic collection helps keep a busy disk from filling up. In the standard
local repository, starting a mutation when the filesystem is at least 80% full
triggers a nonblocking collection attempt. Casita first reclaims data no root
or active operation needs. If disk use remains at or above 75%, it releases
the least recently used roots explicitly marked evictable, vacuuming after
each release until use falls below 75% or no eligible roots remain. Permanent
roots stay, and manual &lt;code dir=&quot;auto&quot;&gt;gc&lt;/code&gt; preserves every named root, including evictable
ones.&lt;/p&gt;
&lt;p&gt;Collection applies to the Casita repository. See
&lt;a href=&quot;https://casita.rs/concepts/garbage-collection/&quot;&gt;Garbage Collection&lt;/a&gt; for the retention and
recovery rules.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://casita.rs/images/blog/introducing-casita/project-lifecycle.svg&quot; alt=&quot;Two project versions saved explicitly share bytes in a Casita repository. Collection reclaims bytes no saved version needs; sync sends missing bytes and verifies them.&quot;&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;shared-s3-repository&quot;&gt;Shared S3 repository&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Two runners can use the same S3 bucket and prefix to publish objects and read
named versions. Their payload bytes are immutable, but names and object
records change as new versions arrive. Casita records those changes in
Chroma’s &lt;strong&gt;wal3&lt;/strong&gt;, a write-ahead log stored in S3. Conditional updates to its
manifest give competing writers an agreed order for their changes.&lt;/p&gt;
&lt;p&gt;Readers and writers register durable holds so collection preserves data still
in use. The S3 profile is experimental and requires the &lt;code dir=&quot;auto&quot;&gt;s3&lt;/code&gt; feature; an
abandoned hold needs explicit recovery. The &lt;a href=&quot;https://casita.rs/guides/s3-multi-owner/&quot;&gt;shared S3 guide&lt;/a&gt;
shows how independent owners can use one repository, and &lt;a href=&quot;https://casita.rs/guides/s3-maintenance/&quot;&gt;S3
maintenance&lt;/a&gt; covers collection and recovery.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-left-for-the-01-release&quot;&gt;What’s left for the 0.1 release&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Casita runs from a source checkout today, but we have not tagged &lt;code dir=&quot;auto&quot;&gt;v0.1.0&lt;/code&gt;.
Before the first release, we need to improve performance where benchmarks show
bottlenecks, broaden benchmark coverage, and use Casita in more real projects
and end-to-end workflows. That practical use should expose problems we can fix
before calling 0.1 ready.&lt;/p&gt;
&lt;p&gt;The integrations have more work ahead. Cargo’s Casita backend needs faster
import and restore before it can match the filesystem backend. The Git object
store adapter still needs integration with the rest of a Git repository.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;try-the-current-pre-release&quot;&gt;Try the current pre-release&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;From a Casita source checkout, install the CLI, then import a directory into
the default repository, list its roots, and preview collection:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;cargo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crates/casita&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;examples/source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When roots and object records are in one Casita repository and the matching
blobs are in another, choose the blob source during sync:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;casita&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./metadata-store&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--from-blobs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./blob-store&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./mirror&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--root&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;examples/source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://casita.rs/guides/sync/#read-payloads-from-another-repository&quot;&gt;sync guide&lt;/a&gt; explains
the requirements for a separate blob source.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://casita.rs/getting-started/&quot;&gt;Quick Start&lt;/a&gt; walks through checkout and inspection,
and the &lt;a href=&quot;https://casita.rs/library/&quot;&gt;Library guide&lt;/a&gt; shows the supported Rust API.&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://casita.rs/benchmarks/&quot;&gt;filesystem benchmark&lt;/a&gt;
compares imports with Git add and commit. In that run, Casita imported the
large-file corpus faster, while Git was faster for small-file imports and
unchanged re-imports. The &lt;a href=&quot;https://casita.rs/reference/benchmarks/&quot;&gt;full benchmark reference&lt;/a&gt;
includes methodology and separate native Git measurements.&lt;/p&gt;</content:encoded></item></channel></rss>