Skip to main content

tidemark

Snapshot a directory tree and diff exactly what changed - no git required.

A tidemark is the line a receding tide leaves behind, recording the level the water reached so you can see how things stood before. tidemark does the same for a directory: leave a mark, do anything, then see precisely what was added, modified, deleted, or renamed.

It scores 100/100 against The CLI Spec: structured output, schema introspection, clean stdout/stderr separation, non-interactive by default, idempotent operations, and bounded output. Excellent for humans at a terminal and for AI agents in a pipeline.

Why

"What did that command actually do to my files?" is a question without a good answer today. git needs a repo and pollutes the tree; fsdiff was archived; copy-based tools need two full copies. tidemark is a small, deterministic (BLAKE3) witness that answers it in one bounded call.

Install

cargo install tidemark
brew install rvben/tap/tidemark

Quick start

Human workflow with a labeled checkpoint:

tidemark snap before        # checkpoint the current tree
make install                # do the risky thing
tidemark diff before        # colored table of what changed

Agent / CI workflow with a portable manifest:

tidemark snap -o pre.tidemark        # write a manifest file (use - for stdout)
./run-some-tool
tidemark diff pre.tidemark @ --json  # bounded JSON delta in one call

Commands

Command Description
tidemark snap [LABEL] Snapshot the tree. LABEL stores it under .tidemark/; -o FILE writes a portable manifest (- = stdout).
tidemark diff [A] [B] Diff two refs. A ref is a label, a manifest file, or @ (current tree). tidemark diff before means before vs @.
tidemark list List stored snapshots. Also the default when no command is given.
tidemark show REF Print a manifest.
tidemark rm LABEL... --yes Delete stored snapshots.
tidemark init Create the .tidemark/ store in the current directory (idempotent).
tidemark schema Emit the clispec schema describing every command and output field.

Useful flags

  • snap: --path DIR, --ignore GLOB (repeatable), --hidden, --no-ignore, --no-content (smaller manifest, disables content diffs), --force (overwrite a label whose tree differs).
  • diff: --content (real unified line diffs for text files), --only added,modified,deleted,renamed, --exit-code.
  • Global (accepted on any command): --output json|table (defaults to JSON when piped, a table on a TTY), --json (shorthand for --output json), --quiet (suppress the stderr summary), --yes (confirm destructive ops), and the bounded-output flags --limit N, --offset N, --fields a,b for list and diff.

What counts as a change

Each entry records its BLAKE3 content hash, size, Unix mode, and symlink target. A file is modified when its content, mode, or symlink target changes. A rename is detected when a deletion and an addition share the same content hash and mode (and the pairing is unambiguous - duplicate-content files stay as plain add/delete). mtime is recorded for information but never triggers a change, so touch and rebuilds do not create false positives.

Small UTF-8 files (up to 256 KiB) also store their text inline so diff --content can show real before/after line diffs, even between two stored manifests. Pass --no-content to skip this.

Output

Snapshots of an unchanged tree produce an identical tree_digest - that is the idempotency signal. diff JSON is a flat object with summary counts and a bounded changes array; list uses the standard envelope:

{ "items": [ ... ], "total": 3, "limit": null, "offset": 0 }

Exit codes

  • Default: 0 success, 2 error.
  • With --exit-code (the diff(1) convention): 0 no changes, 1 changes found, 2 error.

Errors are written to stderr as {"error": {"kind": "...", "message": "...", "retryable": <bool>}}. Kinds: not_found, conflict, invalid_input, io (retryable), unsupported.

See AGENTS.md for the agent-focused contract.

Development

All CI steps are make targets, so the pipeline only runs make:

make check   # fmt-check + clippy (-D warnings) + tests + doctests
make score   # build release and score against clispec
make ci      # check + score

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tidemark-0.1.3.tar.gz (61.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tidemark-0.1.3-py3-none-win_amd64.whl (1.2 MB view details)

Uploaded Python 3Windows x86-64

tidemark-0.1.3-py3-none-manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

tidemark-0.1.3-py3-none-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

tidemark-0.1.3-py3-none-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

tidemark-0.1.3-py3-none-macosx_10_12_x86_64.whl (1.2 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file tidemark-0.1.3.tar.gz.

File metadata

  • Download URL: tidemark-0.1.3.tar.gz
  • Upload date:
  • Size: 61.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for tidemark-0.1.3.tar.gz
Algorithm Hash digest
SHA256 c9dc79cfd5d9b02f4d35e561116b29855515b32eaf25d08d73f05a774c80e467
MD5 c800a4591794b71eebacefe744e5c6f0
BLAKE2b-256 9b7225122b5c161018c98515b396ad83485812da33f2b003b53fbeecb524ddd7

See more details on using hashes here.

File details

Details for the file tidemark-0.1.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: tidemark-0.1.3-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for tidemark-0.1.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 cb436550da9c8c18cad1f22533a16c3653575d8af63bfaf35d91800544524387
MD5 8aca915da0eaa89f5001b657ad1a38ab
BLAKE2b-256 1880c95143e1fa492ab8bbfa04f1d860177cc7d8e2183464404b99b5e7b8f3c3

See more details on using hashes here.

File details

Details for the file tidemark-0.1.3-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tidemark-0.1.3-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7acd0354d06bb9c0b8d6a737f679317e43ae733fc2e9afa5db2d358bfc85645a
MD5 5afc49ee78e6d98fb6bf4af856299b25
BLAKE2b-256 45ce9b6f4134fac67237f05c9cb2243a3995008d9e3bdf481304353e55161c37

See more details on using hashes here.

File details

Details for the file tidemark-0.1.3-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tidemark-0.1.3-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f8e68acd561a5731e43df01aab8cbe8b9633725b24e8b3638565ef8fb02488b0
MD5 7b27fe5a1a873ccdaf601831bd2c0ffe
BLAKE2b-256 a1614647ab8453217134a2d01ee74d0aa01bd50aee6a151cd08c61e5da97105d

See more details on using hashes here.

File details

Details for the file tidemark-0.1.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tidemark-0.1.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cee6bd11c2af5c5a8a2a9108598df1912070b2013817cb974f20edc2bc84e2a8
MD5 91fa2278469434c2772aa1a7a508bbcb
BLAKE2b-256 a2b3bec369b95368a2065f0bde2efb74209543f34951f8f47fe6e385a009f32e

See more details on using hashes here.

File details

Details for the file tidemark-0.1.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for tidemark-0.1.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 701f5b9cbc4f8dfe635cd1406069005709bb002adb9ccc1af3121640323ddbe4
MD5 18f173c3c9f869a2dbbad2132fd5cfd4
BLAKE2b-256 6add3c3549d4b4f0bbfc9803bccb79a25e0b837c8ab690f97899ed7c5e3caf40

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.3 This release

6 files

0.1.2

6 files

0.1.1

6 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page