Skip to content

Explanation

Understanding-oriented background. Why v works the way it does.

The problem with hand-vendoring

Copying a library's source into your repository is a legitimate strategy: no package-manager coupling, no transitive surprises, full control. But done by hand it loses the two facts that matter most when the upstream changes: which commit you copied and how to reproduce the copy. Months later, a vendor/ directory is an undated snapshot of unknown provenance.

What v records

v makes the provenance explicit. Every vendored repository has a vendors.toml entry capturing the URL, the requested ref, the resolved commit hash, and the destination path. The resolved commit is the key detail: a branch name drifts, but the recorded hash pins exactly what is in vendor/.

For that provenance to survive, vendors.toml belongs in source control. Committing it is what lets a teammate — or a future you — reproduce the exact vendor/ contents and see, through its history, when each dependency moved. See the vendors.toml reference for the recommended workflow.

No .git directory

v downloads repository contents, not the git history. The vendored tree is plain files — it does not become a nested repository or a submodule, and it does not interfere with your own version control. vendors.toml carries the metadata that a .git directory otherwise would.

Architecture

The internal command structure, error-handling boundary, containerized toolchain, and release pipeline are documented in .claude/docs/architectural_patterns.md and summarized for contributors in the Contribution guide.