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,bforlistanddiff.
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:
0success,2error. - With
--exit-code(the diff(1) convention):0no changes,1changes found,2error.
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)
| 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)
| File | Actions Reset | |||
|---|---|---|---|---|
| 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.