# Java quickstart This is a ~60-second round-trip with **no cloud account and no setup**: snapshot a directory, push it to a **local** `file://` store, pull it back somewhere else, and confirm it is byte-for-byte identical — all through the Java binding. Every snapshot ID is a 64-character lowercase hex string, bit-identical to the one the `snapdir` CLI and every other binding produce for the same content. ## 1. Install Add the dependency (Maven `org.snapdir:snapdir:1.11.0` or Gradle `implementation("org.snapdir:snapdir:1.11.0")`) — see [Install snapdir for Java](/install/java/) for the JDK 17 run flags and platform notes. The jar embeds the native library, so there is nothing else to build. ## 2. Snapshot + push Compute the content-addressed ID of a directory with the synchronous `Snapdir.id`, then upload it to a local store with the async `Snapdir.push`. The store is addressed by a URI — for a no-setup round-trip that is `file://$PWD/store`, just a directory on disk: ```java import io.snapdir.Snapdir; public class Push { public static void main(String[] args) throws Exception { String dir = "./demo"; // Nothing is stored yet — id() just hashes the directory. String id = Snapdir.id(dir, null); System.out.println(id); // 64-char lowercase hex, e.g. // file://$PWD/store — a local store, no cloud account needed. String store = "file://" + System.getProperty("user.dir") + "/store"; // push() uploads the snapshot and returns the same id. String pushed = Snapdir.push(dir, store, null).get(); System.out.println(pushed); } } ``` `push` returns exactly the ID that `id` printed. Objects are stored at content-addressed keys, so unchanged files are never uploaded twice. ## 3. Pull it back Pull the snapshot into a fresh directory. `pull` fetches every object from the store, re-hashes it, and checks it out — so a successful pull is a proof of integrity. Re-running `id` on the restored directory yields the same ID: ```java import io.snapdir.Snapdir; public class Pull { public static void main(String[] args) throws Exception { String id = args[0]; // the from step 2 String store = "file://" + System.getProperty("user.dir") + "/store"; Snapdir.pull(id, store, "./restored", null).get(); // Byte-for-byte identical — prints the same . System.out.println(Snapdir.id("./restored", null)); } } ``` That is the same snapshot ID you would get from `snapdir id` or `snapdir push` on the CLI — the manifests are bit-identical across every binding.