Get Started

Install

go install github.com/Avalanche-io/c4/cmd/c4@latest

Python

pip install c4py

From source

git clone https://github.com/Avalanche-io/c4.git
cd c4
go build -o c4 ./cmd/c4

Your first scan

Point c4 id at any directory. It produces a c4m file — a human-readable manifest of every file, with content-based IDs.

$ c4 id ./myproject/
-rw-r--r-- 2026-03-20T09:15:00Z   1204 README.md    c45xZeXwKjQ2...
-rw-r--r-- 2026-03-20T09:15:00Z    892 main.go      c43nYtRmPvW7...
drwxr-xr-x 2026-03-20T09:15:00Z    ... tests/       c41qLmNxBzJ4...

Save it:

c4 id ./myproject/ > myproject.c4m

That file is now a permanent record of your directory’s contents. You can read it, email it, store it, diff it.


Your first diff

Change a file in myproject/, then scan again:

echo "updated" >> myproject/README.md
c4 id ./myproject/ > myproject-v2.c4m

Now diff the two snapshots:

$ c4 diff myproject.c4m myproject-v2.c4m
c41oRmNxBzJ4kLpQvW8sYdHf3gTe6UaCb5jX7nZwPq9iMrDuEvFy2hGtSxAl0KcOmBJN
-rw-r--r-- 2026-03-20T09:16:00Z   1248 README.md  c42qPnYsLwK8...
c45xZeXwKjQ2nMrBz7L1pYvWqRtN8sHfJd3g6CmAeU9kXoP4bG5hT0iVlDaSwFuO7yE

The output is a c4m patch — it shows the old manifest’s C4 ID, the changed entries with their new values, and the new manifest’s C4 ID. Only entries that changed appear in the patch.


Try c4sh

c4sh lets you treat c4m files as directories in your shell.

eval "$(c4sh shell-init)"
cd myproject.c4m
ls

You’re now browsing the manifest as if it were a real directory. Tab completion works. ls -la shows sizes and timestamps. This is the c4m file format earning its keep — it contains enough metadata to impersonate a filesystem.


Try c4py

import c4py

# Scan a directory to create a manifest
manifest = c4py.scan("./experiment-042/")
print(manifest.summary())

# Save as a c4m file
c4py.dump(manifest, "experiment-042.c4m")

# Later, verify nothing changed
report = c4py.verify_tree("experiment-042.c4m", "./experiment-042/")
print(f"{len(report.ok)} OK, {len(report.missing)} missing, {len(report.corrupt)} corrupt")

Next steps