Getting started
Pepper 0.2.0 combines immutable content-addressed storage with three-replica transactional data services. Start one node for blocks, objects, directories, pins, and compute; start all three development nodes for namespaces, KV, buckets, filesystems, and S3.
Requirements
- Rust 1.85 or newer and a Unix-like shell.
- Three reachable Pepper agents for namespace-backed services; namespace creation requires exactly three consensus replicas.
- Compute additionally requires Linux, /dev/kvm, Firecracker, mkfs.ext4, debugfs, a guest kernel, and an allowlisted ext4 rootfs containing /pepper-guest-agent.
Build the release
git clone https://github.com/peppermesh/pepper.git
cd pepper
git checkout v0.2.0
cargo build --locked --workspace --releaseThe host binaries are target/release/pepper-agent and target/release/pepper.
Start the development cluster
The checked-in development configs enable namespaces and S3. Create the shared development S3 secret, initialize each node, then run each agent in its own terminal:
umask 077
printf 'replace-with-a-long-development-secret' > ./dev/s3.secret
./target/release/pepper-agent init --config ./dev/node1.toml
./target/release/pepper-agent init --config ./dev/node2.toml
./target/release/pepper-agent init --config ./dev/node3.toml
# Run these in three terminals
./target/release/pepper-agent --config ./dev/node1.toml
./target/release/pepper-agent --config ./dev/node2.toml
./target/release/pepper-agent --config ./dev/node3.tomlVerify storage
./target/release/pepper node status
./target/release/pepper node peers
printf 'hello pepper
' > /tmp/input.txt
./target/release/pepper --json object put /tmp/input.txt
./target/release/pepper object get '<object-cid>' -o /tmp/output.txtUser-facing puts create a root pin. The pin protects the complete reachable DAG from garbage collection.
Create a namespace and use KV
./target/release/pepper --json namespace create --kind kv --alias demo
./target/release/pepper --json object put /tmp/input.txt
./target/release/pepper kv put demo greeting --cid '<object-cid>'
./target/release/pepper kv get demo greeting
./target/release/pepper kv scan demo --prefix greetAliases can be used wherever a namespace ID is accepted. Writes are linearized through the namespace's Raft leader and publish referenced content only after the required durability is met.
Try buckets and filesystems
./target/release/pepper bucket create assets
./target/release/pepper bucket put assets hello.txt /tmp/input.txt --content-type text/plain
./target/release/pepper bucket get assets hello.txt -o /tmp/from-bucket.txt
mkdir -p /tmp/tree && printf 'v1
' > /tmp/tree/file.txt
./target/release/pepper fs create workspace
./target/release/pepper fs commit workspace /tmp/tree --base-revision 0 --message 'initial import'
./target/release/pepper fs checkout workspace /tmp/checkout