# Node.js quickstart This is a ~60-second round-trip: snapshot a directory, `push` it to a local `file://` store, `pull` it back into a fresh directory, and confirm the snapshot ID matches. Snapshot IDs are 64-character lowercase hex and are bit-identical to the CLI and every other binding. ## 1. Install ```sh npm install @snapdir/snapdir ``` Prebuilt native binaries, no compiler required. See [Install snapdir for Node.js](/install/node/) for platform details. ## 2. Snapshot + push Compute the snapshot ID for a directory, then push it to a local store. Both calls return the same 64-character lowercase hex ID. ```js import { id, push } from '@snapdir/snapdir' const store = `file://${process.cwd()}/store` // Snapshot ID without touching a store — pure, deterministic. const snapshotId = await id('./my-dir') console.log(snapshotId) // 64-char lowercase hex // Upload the snapshot to the store; returns the same ID. const pushed = await push('./my-dir', store) console.log(pushed === snapshotId) // true ``` ## 3. Pull it back Materialize the snapshot into a fresh directory and re-derive its ID — it is the same string you started with. ```js import { id, pull } from '@snapdir/snapdir' const store = `file://${process.cwd()}/store` await pull(snapshotId, store, './restored') const restoredId = await id('./restored') console.log(restoredId === snapshotId) // true ``` That `` is the exact same value you would get from `snapdir id` or `snapdir push` on the CLI — the binding wraps the identical Rust core.