Skip to content
Descoped Source Code Portalv2.2.13
PollingSign in

dedupd

Up to date

Always-on local daemon that deduplicates Hugging Face models across Ollama, LM Studio, MLX and llama.cpp using one content-addressed store, and archives them for offline use.

descoped/dedupd on GitHubLast push

last commit badgerelease badgelicense badgeissues badge

dedupd /diːˈduːpt/, pronounced deduped.

One copy of each AI model on disk, shared by every app that runs it.

Ollama, Bionic and LM Studio, the MLX tools, llama.cpp and huggingface_hub clients each keep their own copy of a model in their own folder. A model used by several apps is therefore stored several times.

dedupd is a daemon that keeps each model file once, in a content-addressed store, and gives every app a clone of it. To the app a clone is an ordinary file in the expected place; on disk it shares its blocks with the stored file and takes no additional space. dedupd also acts as a local endpoint for Hugging Face tools and Ollama, and comes with a command line and a macOS app.

Features

  • One download for every app. dedupd pull org/repo:Q4_K_M --for ollama,bionic downloads a model once and activates it in both apps as clones.
  • Adoption of existing models. Models the apps already hold are taken into the store without changing the apps' files. Duplicate copies are then replaced by clones, which frees their space.
  • A store, not a cache. Downloaded models are kept and verified against their sha256. They remain available when Hugging Face is unreachable or a model is removed there.
  • A local endpoint. Hugging Face tools and Ollama can download through the daemon, which answers from the store and fetches what it does not have.
  • App profiles. For each app, dedupd knows which formats it takes, by which method and at what cost in disk space, and states this before a model is activated.
  • An archive disk. Every stored file is also copied to a second disk. A single model can be archived off the internal disk and restored later.
  • Explicit removal only. Cleaning up, deactivating and archiving list what they would remove and act only on confirmation.

Status

Version 0.1.0
Platform macOS 26 on Apple silicon
Apps Ollama; Bionic and LM Studio; the Hugging Face cache (hf, huggingface_hub, mlx_lm, llama.cpp)
Model source Hugging Face
Distribution A notarised disk image of the app on the releases page; the command and the daemon are inside it. Or built from source
Planned A catalogue of model families and editions, ModelScope as a second source, and Linux with NVIDIA GPUs. See the roadmap

Requirements

  • macOS 26 on Apple silicon.
  • A file system with copy-on-write file cloning. On macOS this is APFS.
  • The dedupd store and the applications' model directories on the same volume. A clone cannot span volumes.

dedupd does not substitute symbolic links, hard links or copies when cloning is unavailable.

Install

Download dedupd-<version>.dmg from the releases page, drag Dedupd to Applications and open it. It runs in the menu bar. Install the background service with the dedupd command the app carries, which copies itself to ~/.dedupd/bin and registers a launchd agent:

/Applications/Dedupd.app/Contents/Helpers/dedupd install

The Install button on the app's Daemon screen runs the same command; it has been tested only against a simulated agent so far.

Build and try

cargo build --release                 # the command: target/release/dedupd
target/release/dedupd adopt           # adopt the models the apps already hold
target/release/dedupd status          # store contents and shared space
target/release/dedupd install         # run the daemon as a login service
target/release/dedupd pull bartowski/SmolLM2-135M-Instruct-GGUF:Q4_K_M --for ollama,bionic

The macOS app needs Xcode and brew install xcodegen swiftlint just:

just app-run                          # build the app and start it in the menu bar

Documentation

  • How it works: architecture, requirements, the store, clones, placement, the archive disk.
  • The macOS app: the screens, with pictures.
  • The command line: command reference and settings.
  • Apps and formats: compatibility per application and format, cost in disk space, limitations.
  • Development: building, testing and code layout.
  • Roadmap: what is available and what is planned: the catalogue, ModelScope, Linux with NVIDIA GPUs.

Licence

MIT. Copyright © 2026 Descoped.

Dependencies

Cargo.toml (0 dependencies)
crates/dedupd-client/Cargo.toml dedupd-client (5 dependencies)
NameVersionScope
serde1.0.229runtime
serde_json1.0.154runtime
thiserror2.0.21runtime
uniffi0.32.2runtime
ureq3.5.1runtime
crates/dedupd-core/Cargo.toml dedupd-core (19 dependencies)
NameVersionScope
anyhow1.0.104runtime
futures-util0.3.34runtime
hex0.4.3runtime
libc0.2.191runtime
reqwest0.13.5runtime
rusqlite0.41.1runtime
serde1.0.229runtime
serde_json1.0.154runtime
sha10.11.0runtime
sha20.11.1runtime
thiserror2.0.21runtime
tokio1.54.1runtime
toml1.2.1runtime
toml_edit0.25.19runtime
walkdir2.5.0runtime
tempfile3.27.0dev
tokio1.54.1dev
walkdir2.5.0dev
wiremock0.6.5dev
crates/dedupd-server/Cargo.toml dedupd-server (16 dependencies)
NameVersionScope
anyhow1runtime
axum0.8runtime
dedupd-core0.1.0runtime
futures-util0.3.34runtime
hex0.4.3runtime
notify8runtime
reqwest0.13runtime
serde1runtime
serde_json1runtime
sha20.11runtime
tokio1.54.1runtime
tokio-util0.7.20runtime
dedupd-clientdev
sha10.11dev
tempfile3.27.0dev
wiremock0.6.5dev
crates/dedupd/Cargo.toml dedupd (7 dependencies)
NameVersionScope
anyhow1.0.104runtime
clap4.6.7runtime
dedupd-client0.1.0runtime
dedupd-core0.1.0runtime
dedupd-server0.1.0runtime
serde_json1.0.154runtime
tokio1.54.1runtime
site/package.json dedupd-site (12 dependencies)
NameVersionScope
@krantho/config^1.1.1runtime
@krantho/schema^1.1.1runtime
@krantho/seo^1.1.1runtime
@krantho/static^1.1.1runtime
@krantho/ui-react^1.1.1runtime
next^16.4.6runtime
react^19.3.1runtime
react-dom^19.3.1runtime
zod^4.6.7runtime
@types/node^26.6.6dev
@types/react^19.3.0dev
typescript^7.0.2dev

Health

Health 100Good

Nothing costs it points.

Technology

Up to date
Languages
RustTypeScript
Build tools
Cargopnpm
Uses

Pull requests

Up to date

None open.

Issues

Up to date

1 open: Needs triage 1

  1. Dependency Dashboard

    Needs triage, waits for a maintainer to look at it#1renovate[bot] (automation)idle

Releases

Up to date
  1. v0.1.0dedupd 0.1.0 by oranheim
    Release notes

    The first release of dedupd: the daemon, the dedupd command and the macOS app, in one disk image signed with Developer ID and notarised by Apple.

    dedupd keeps each model file once, in a content-addressed store, and gives Ollama, Bionic and LM Studio, and the Hugging Face cache (hf, huggingface_hub, mlx_lm, llama.cpp) a copy-on-write clone of it. See the README and the documentation.

    Requirements

    • macOS 26 on Apple silicon.
    • APFS, with the dedupd store (~/.dedupd) and the apps' model folders on the same volume.

    Install

    1. Open dedupd-0.1.0.dmg and drag Dedupd to Applications.
    2. Open Dedupd. It runs in the menu bar.
    3. Install the background service with the dedupd command the app carries, which copies itself to ~/.dedupd/bin and registers a launchd agent:
      /Applications/Dedupd.app/Contents/Helpers/dedupd install
      
      The Install button on the app's Daemon screen runs the same command; it has been tested only against a simulated agent so far.

    The daemon takes the models the apps already hold into the store; the apps' files are not changed. Quitting the app leaves the daemon running.

    Included

    • Download once for several apps, adoption of existing models, and replacement of duplicate copies by clones.
    • The Hugging Face Hub API and the Ollama registry API on 127.0.0.1:8642, answered from the store.
    • App profiles: which app takes which format, by which method and at what cost in disk space. 4-bit and 8-bit MLX models are placed into Ollama as clones with a rewritten index.
    • An archive disk: a second copy of every stored file, and archive and restore per model.
    • The app: Library, Discover, Downloads, Storage and Daemon screens, and the menu bar panel.

    Not included yet

    • Updates for the app. A new version is installed by replacing the app; the Daemon screen then offers to update the daemon.
    • Linux, ModelScope and the catalogue of model families; see the roadmap.

    Checksum

    92c7a5c1c1d0a0e787ad2deab50602ffd167bf0681e88e940d0888e9f5919872  dedupd-0.1.0.dmg
    
All 1 held

Latest commits

Commit log

Documentation