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

Releasing

Vership owns versioning, changelog generation, release commits, and tags. See the release runbook for the verified workflow and recovery policy.

Metadata

Release files for tidemark 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tidemark 0.1.4
File Size Uploaded Provenance Actions
tidemark-0.1.4.tar.gz 63.1 kB Without provenance Details for tidemark-0.1.4.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for tidemark 0.1.4
File Actions
tidemark-0.1.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for tidemark-0.1.4-py3-none-win_amd64.whl
tidemark-0.1.4-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details for tidemark-0.1.4-py3-none-manylinux_2_28_x86_64.whl
tidemark-0.1.4-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details for tidemark-0.1.4-py3-none-manylinux_2_28_aarch64.whl
tidemark-0.1.4-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for tidemark-0.1.4-py3-none-macosx_11_0_arm64.whl
tidemark-0.1.4-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details for tidemark-0.1.4-py3-none-macosx_10_12_x86_64.whl

Total release size: 6.0 MB

Release files / tidemark-0.1.4.tar.gz

Download URL tidemark-0.1.4.tar.gz
Size 63.1 kB
Tags Source
SHA-256 checksum
How to use checksums
9bd8c02c6963b7776150a0b1b940a648bdbdc788f67a636839351adbb6cc033a
BLAKE2b-256 checksum
How to use checksums
588d10de8c6240e8665e9628ce7f5581f710dbbda47a5d96890fc6dbe137a846
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / tidemark-0.1.4-py3-none-win_amd64.whl

Download URL tidemark-0.1.4-py3-none-win_amd64.whl
Size 1.1 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
ff85b67e0831995032e7b5b1e06416819651e28b8031d3bec14421c97c5111ac
BLAKE2b-256 checksum
How to use checksums
6de39cb330870709efb30d9f99bf377ef630acd586f3b9123026788f108b712c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / tidemark-0.1.4-py3-none-manylinux_2_28_x86_64.whl

Download URL tidemark-0.1.4-py3-none-manylinux_2_28_x86_64.whl
Size 1.3 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
5d9b2354d7492380c34c43debe2ef8be05a4c1fcb7710945f52d7a5e4e5169a0
BLAKE2b-256 checksum
How to use checksums
c3b37b0d33016194514d77aae50d234a60d3d5e89bef3b98cafb887fe2125976
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / tidemark-0.1.4-py3-none-manylinux_2_28_aarch64.whl

Download URL tidemark-0.1.4-py3-none-manylinux_2_28_aarch64.whl
Size 1.2 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
af4bfa41ace5c0b5aa150870671d8ad855022026ae4b42278534b7ad50b81e94
BLAKE2b-256 checksum
How to use checksums
8273ca5634d5ff79706347637ec25054d5f10f5cddaa8dfc33c4b33b075c7548
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / tidemark-0.1.4-py3-none-macosx_11_0_arm64.whl

Download URL tidemark-0.1.4-py3-none-macosx_11_0_arm64.whl
Size 1.1 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9880bf6806d9b01d15b7438415caa2ff301aed2e26f077fb83dafe5d4873fe35
BLAKE2b-256 checksum
How to use checksums
45c09263bd57316a87d4b2e02ddfa0d5404d25ce1fcb6dc123cd60306b380e87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / tidemark-0.1.4-py3-none-macosx_10_12_x86_64.whl

Download URL tidemark-0.1.4-py3-none-macosx_10_12_x86_64.whl
Size 1.2 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
29c4bbf28d04f842d46d8319276a5896d6ecf7ff12a7f73cffcc456c3da9431d
BLAKE2b-256 checksum
How to use checksums
4c5db7b8317eec46d6ad71c12c0b936bb6ea669babeba2291a7ad619d8c9283f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Security for tidemark 0.1.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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