.vendo/ is split by author, in three layers. Which layer a file belongs to tells you whether you may edit it and what can overwrite it.
That split is the point. A re-sync rewrites the machine layer and re-judges the AI layer without ever clobbering a decision a person made.
Every path
What to commit
Commit everything exceptdata/. That directory is runtime state and debugging residue, and the .gitignore init writes there is what keeps it out.
Commit components/ too. It is generated, but a missing local file is not a deletion signal to the Cloud push, so gitignoring it hides drift rather than cleaning anything up.
generated/ is the one machine-layer directory your own source imports, so it has to exist before your app compiles. Either commit it or regenerate it ahead of the build — the demo host runs vendo sync in predev and prebuild and gitignores the directory.
Size scales with distinct modules, not with components. The demo host stores 3 components in about 26 KB, and a 50-component registry over a shared design system lands in the low hundreds of KB, because every shared module and the app-root CSS are stored once.
Mark components/ linguist-generated=true in .gitattributes so reviews collapse it.
The content surfaces
Five files are content surfaces. Per surface, resolution is a value passed tocreateVendo, then the local file, then unset, so the file’s existence is the switch.
vendo config status shows which layer owns each one. See the CLI reference.
tools.json and catalog.json are deliberately not on that list. They are generation inputs, not host-editable content.