{"id":42457922,"url":"https://github.com/roobie/casq","last_synced_at":"2026-01-28T09:08:05.995Z","repository":{"id":333954010,"uuid":"1139424034","full_name":"roobie/casq","owner":"roobie","description":"casq is a content-addressed file store (CAS) - a minimal, single-binary system for storing and retrieving files and directories by their cryptographic hash. Think \"minimal git object store / restic backend\" but generic and simple.","archived":false,"fork":false,"pushed_at":"2026-01-23T14:18:07.000Z","size":538,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-23T14:22:49.545Z","etag":null,"topics":["backup","blake3","cli","content-addressable-storage","devops","file-system","hashing","library","rust","simple","snapshot"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roobie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-22T00:04:53.000Z","updated_at":"2026-01-23T13:56:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/roobie/casq","commit_stats":null,"previous_names":["roobie/castor","roobie/casq"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/roobie/casq","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roobie%2Fcasq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roobie%2Fcasq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roobie%2Fcasq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roobie%2Fcasq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roobie","download_url":"https://codeload.github.com/roobie/casq/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roobie%2Fcasq/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28843195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T07:39:25.367Z","status":"ssl_error","status_checked_at":"2026-01-28T07:39:24.487Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backup","blake3","cli","content-addressable-storage","devops","file-system","hashing","library","rust","simple","snapshot"],"created_at":"2026-01-28T09:08:01.374Z","updated_at":"2026-01-28T09:08:05.990Z","avatar_url":"https://github.com/roobie.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `casq`\n\n![casq logo](assets/logo.jpeg)\n\n**A local content-addressed file store with compression and chunking.**\n\nThis is **Alpha** level software.\n\n`casq` is a single-binary tool for storing files and directories by their cryptographic hash. Think of it as a lightweight git object store or restic backend—but simpler, local-only, and purpose-built for content-addressed storage with modern efficiency features.\n\n**Why `casq`?**\n- **Automatic deduplication** - Identical content stored only once, even across different directories\n- **Content-defined chunking** - Incremental backups with FastCDC v2020 (files ≥ 1MB split into variable chunks, 60-80% reuse after edits)\n- **Transparent compression** - 3-5x storage reduction with zstd (files ≥ 4KB automatically compressed)\n- **Content addressing** - Files identified by cryptographic hash, not by path (however, custom references are supported)\n- **Garbage collection** - Reclaim space from unreferenced objects with mark \u0026 sweep\n- **Simple \u0026 fast** - No databases, no network, just files on disk with BLAKE3 hashing\n- **Embeddable** - Rust library (`casq_core`) + CLI binary, easily integrated into your tools\n\n## Representative CLI example\n\n```bash\n# Use an environment variable to set the root. It is also possible to use --root/-R per invocation. Defaults to current working directory.\nexport CASQ_ROOT=\"/var/my-casq\"\n\n# Initialize the casq root - echoes the full path to the root directory.\ncasq initialize #\u003e/var/my-casq\n# Put a file system tree into the casq with a custom reference - echoes the hash\ncasq put /some/tree --reference tree@1 #\u003ed856ec8e03cce04358fbd6a5135823574dea4de9ae6a6f511e3c060f33d144d4\n\n# Put a blob into the casq with a custom reference via piping - echoes the hash\ncasq put --reference \"big-blob@$(date -I)\" - \u003c curl https://big-blob.wherever #\u003ed856ec8e03cce04358fbd6a5135823574dea4de9ae6a6f511e3c060f33d144d4\n# Put a blob into the casq with a custom reference via piping - echoes the hash\ncurl https://example.org | casq put --reference \"example.org@$(date +%s)\" - #\u003e454499efc25b742a1eaa37e1b2ec934638b05cef87b036235c087d54ee5dde59\n\n# Get metadata about an object:\ncasq metadata tree@1 --json #\u003e\n#{\n#  \"success\": true,\n#  \"result_code\": 0,\n#  \"type\": \"Tree\",\n#  \"hash\": \"d856ec8e03cce04358fbd6a5135823574dea4de9ae6a6f511e3c060f33d144d4\",\n#  \"entry_count\": 1,\n#  \"path\": \"./casq-store/objects/blake3-256/d8/56ec8e03cce04358fbd6a5135823574dea4de9ae6a6f511e3c060f33d144d4\"\n#}\n\n# List the children of tree\ncasq list tree@1 #\u003efile1\\nfile2 etc\ncasq list --long tree@1 #\u003e(listing of tree's children with most metadata)\n\n# Read a blob and pipe it through less\ncasq get be616640346d71f639f55014a17229a8e6ab7d164b44a702d1c04da0d4bd48e3 | less\n\n# List all references\ncasq references list\n# Add a reference; key =\u003e value: casq references add REFERENCE HASH\ncasq references add my-custom-ref be616640346d71f639f55014a17229a8e6ab7d164b44a702d1c04da0d4bd48e3\n# So now we can `get` it by ref\ncasq get my-custom-ref | less\n# Remove the reference: casq references remove REFERENCE\ncasq references remove my-custom-ref\n\n# Shows all objects that are unreferenced\ncasq find-orphans #\u003e...\n\n# Show all unreferenced data that would be deleted\ncasq collect-garbage --dry-run\n# Deletes all unreferenced data\ncasq collect-garbage\n```\n\nSo, general usage pattern:\n1. `initialize`\n2. `put` (with --reference)\n3. read: `metadata`, `get`, `list`\n4. manage references: `references add/list/remove` and `find-orphans`\n5. `collect-garbage`\n\n## License\n\nFree, and open-source\n\n\u003e Apache-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froobie%2Fcasq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froobie%2Fcasq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froobie%2Fcasq/lists"}