v-flow
Move footage and photos between camera cards, long-term storage, and editing drives without ever losing track of the safe copy.
Wait, what does it do?
v-flow is a CLI for people who shoot a lot of video and photos. It copies your camera card into a protected archive and proves the copy with checksums. It puts temporary copies on your editing SSD, saves finished videos and DaVinci Resolve backups, and deletes an editing copy only after verifying the archived original. Nothing is ever moved or deleted as a side effect of anything else.
You can drive it from the terminal, or just talk to Claude Code, Codex, or Cursor. The bundled skill teaches your agent the whole workflow.
Install
curl -fsSL https://raw.githubusercontent.com/kaungzinye/v-flow/main/install_vflow.sh | bash
That installs the v-flow command plus the agent skill. Claude Code and Cowork users can grab the plugin instead, and the skill installs the CLI from PyPI on first use:
/plugin marketplace add kaungzinye/v-flow
/plugin install v-flow@v-flow
Then point it at your drives:
v-flow make-config
Then check the whole environment in one command, which tells you in plain words what works and what to fix:
v-flow doctor
Use it
Ingest a card. Footage lands in a Shoot, photos in a Collection, one command:
v-flow ingest --source "/Volumes/SDCARD" --auto
Put a Shoot on your editing drive, and clean it up when you're done (cleanup verifies checksums and your Resolve project first):
v-flow checkout --shoot "2026-08-02_Ingest" --working-location work_ssd
v-flow cleanup --shoot "2026-08-02_Ingest" --working-location work_ssd --project "Summer Film" --confirm
Or skip the flags entirely and ask your agent:
Ingest this card, then put the footage on my SSD.
Every state-changing command supports a dry run, names the safety gate that failed, and leaves your card and archive intact on any error.
Every decision v-flow needs has a flag that carries it, such as --confirm for a deletion or --merge-into for a date overlap. Reach one without the flag and without a terminal to ask, and the command stops and names the flag rather than guessing. Long copies print plain progress lines, and an interrupted run resumes when you re-run the same command.
Notes
This is a personal tool that grew documentation. It works on macOS, it's tested, and it guards your media obsessively. Still, expect sharp edges in places one person's workflow never reached.
Docs
- The agent skill: the workflow reference, branch by branch
- Domain language: what Shoot, Collection, Archive, and friends mean precisely
- Every command:
v-flow --help
Contributing
Issues and PRs welcome. Read CONTEXT.md first. The vocabulary is load-bearing.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vflow_cli-0.3.0.tar.gz.
File metadata
- Download URL: vflow_cli-0.3.0.tar.gz
- Upload date:
- Size: 80.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7b70fec8768553ddae1da7279f86f1d50388f951468c160036b41ea4b0f4f09
|
|
| MD5 |
5390ca0aa80618f3d2693ed3561c0600
|
|
| BLAKE2b-256 |
2aa73ea8964612cc36c5018fc95b69ab05544f6a2fa5f6d66b86de79308f0cde
|
Provenance
The following attestation bundles were made for vflow_cli-0.3.0.tar.gz:
Publisher:
publish.yml on kaungzinye/v-flow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vflow_cli-0.3.0.tar.gz -
Subject digest:
a7b70fec8768553ddae1da7279f86f1d50388f951468c160036b41ea4b0f4f09 - Sigstore transparency entry: 2519234671
- Sigstore integration time:
-
Permalink:
kaungzinye/v-flow@296e1c049414be534a8dc2d44831c3405457f8f5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/kaungzinye
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@296e1c049414be534a8dc2d44831c3405457f8f5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file vflow_cli-0.3.0-py3-none-any.whl.
File metadata
- Download URL: vflow_cli-0.3.0-py3-none-any.whl
- Upload date:
- Size: 62.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
520f40b36aca78cdb16ab2ffa7e697a7841c332888f89736ed893a60a7c157e8
|
|
| MD5 |
431eafb98b2730f6d28d5c745a34c261
|
|
| BLAKE2b-256 |
c63709864b5777eb00ab8e7cd59cf5d7e51516ee3db83dbd033ad99e10f990df
|
Provenance
The following attestation bundles were made for vflow_cli-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on kaungzinye/v-flow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vflow_cli-0.3.0-py3-none-any.whl -
Subject digest:
520f40b36aca78cdb16ab2ffa7e697a7841c332888f89736ed893a60a7c157e8 - Sigstore transparency entry: 2519234693
- Sigstore integration time:
-
Permalink:
kaungzinye/v-flow@296e1c049414be534a8dc2d44831c3405457f8f5 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/kaungzinye
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@296e1c049414be534a8dc2d44831c3405457f8f5 -
Trigger Event:
push
-
Statement type: