Sample mattersEvery client, case, and document on this deployment is invented for demonstration. This is purposefully a demo environment.

Stage a document and sync it

The repository shell above does not write documents/ or blobs/. They are the two root-level document folders in every Project repository, alongside templates/. blobs/ holds one committed YAML pointer per document, and documents/ holds the bytes, staged for upload or pulled down for reading; the root .gitignore keeps the whole of documents/ out of Git. Neither is a second document store. Git keeps the pointer; Navigator keeps the bytes. Drop a local file below documents/, list what a sync would do, then run it:

Against a staged documents/exhibits/exhibit-a.png, the dry run prints one line per staged file and a count, and changes nothing:

The real run derives the document slug from its path below documents/, uploads the bytes through Navigator's authenticated API, and writes blobs/exhibits/exhibit-a.png.yaml only after the upload succeeds. The pointer records kind, desired visibility, current revision metadata, and the previous asset id when the chain has one. It never contains an object-storage coordinate or legal-document bytes; object storage and the assets revision chain remain authoritative. Folder conventions infer filing for pleadings/, exhibit for exhibits/, and agreement for agreements/; other paths use unclassified. Visibility defaults to internal.

The real run needs a stored login — navigator site login --host <host-or-url> — and a matter with that code visible to the account. --dry-run needs neither. The root .gitignore ignores /documents/, but an ignore rule only keeps untracked files out of a plain git add; the gate is the control. navigator project gate rejects every tracked file below documents/, and every file below blobs/ that is not a *.yaml pointer: