DOT is a generative project scaffolding CLI. You answer a few questions, DOT builds a production-ready project and records the choices so you can update or extend it later.
- Install
- Your first scaffold
- Explore what was built
- Update a project
- Check project health
- Manage plugins
- Uninstall
curl -fsSL https://raw.githubusercontent.com/version14/dot/main/install.sh | shInstalls to /usr/local/bin/dot. To choose a different location:
INSTALL_DIR=~/bin sh -c "$(curl -fsSL https://raw.githubusercontent.com/version14/dot/main/install.sh)"brew install version14/tap/dotgo install github.com/version14/dot/cmd/dot@latestRequires Go 1.26+. The binary lands in $GOPATH/bin (usually already on $PATH).
git clone https://github.com/version14/dot.git
cd dot
make build # produces bin/dot
export PATH="$PWD/bin:$PATH"
dot versiondot version
# dot 0.1.0dot flowsOutput:
Flows
init Project Wizard
frontend Frontend project wizard
plugin-template Plugin Repository Template
dot scaffoldIf there is more than one flow, DOT lists them and asks you to pick one:
Or pass the flow ID directly:
dot scaffold initDOT opens a terminal form. Use arrow keys to navigate, Enter to confirm, Ctrl+C to abort. Pressing Escape in any field takes you back to the previous question.
Once you confirm, DOT:
- Runs the generator pipeline (outputs a line per generator).
- Runs any
PostGenerationCommands(e.g.pnpm install) with a live spinner.
✓ base_project
✓ typescript_base
✓ react_app
post-gen commands (1)
✓ pnpm install [12.3s]
✓ scaffolded my-app in ./my-app
To skip post-generation commands (useful for CI or offline runs):
dot scaffold init --skip-postTo write the project to a specific directory:
dot scaffold init -out /tmp
# Creates /tmp/my-project/After scaffolding, the project directory contains a .dot/ folder:
my-project/
├── .dot/
│ ├── spec.json ← your answers + the flow that was used
│ └── manifest.json ← which generators ran, at what version, when
├── README.md
├── ...
spec.json is the machine-readable record of every decision. DOT reads it on dot update and dot doctor. You can inspect it:
cat my-project/.dot/spec.jsonAfter a DOT upgrade or after changing a flow, re-run the generators against an existing project without re-answering the questions:
dot update ./my-projectDOT reads .dot/spec.json, replays the same answers through the current generators, and writes any changed files.
dot doctor compares the .dot/spec.json against the currently installed generators and flags drift:
dot doctor ./my-projectOutput example:
✓ flow: init
✓ generators: all found
⚠ version drift: base_project spec=0.1.0 installed=0.2.0
✓ validators: 12 passed
Exit code 0 when no issues are found, 1 when issues are detected.
Plugins add generators and inject new questions into existing flows. They are installed from git repositories.
dot plugin listShows built-in plugins (compiled in) and installed plugins:
Built-in plugins
biome_extras 1 generators · 2 injections
Installed plugins (~/.dot/plugins)
(none)
dot plugin install github.com/version14/dot-plugin-exampleAccepts any of these source forms:
| Form | Meaning |
|---|---|
github.com/owner/repo |
Clone https://github.com/owner/repo.git at default branch |
github.com/owner/repo@v1.2.0 |
Clone and check out tag v1.2.0 |
https://example.com/path/repo.git |
Clone any HTTPS URL |
git@github.com:owner/repo.git |
SSH clone |
Optionally pin a ref with -ref:
dot plugin install github.com/me/my-plugin -ref v0.2.0dot plugin install -from ./my-local-plugindot plugin uninstall my-pluginPlugins are stored in ~/.dot/plugins/<id>/. Uninstall removes that directory.
Note: DOT is a compiled binary. After installing a plugin, you need to rebuild
dotwith the plugin imported for itsinit()function to register hooks. This constraint is removed when dynamic loading is introduced.
brew uninstall dotcurl -fsSL https://raw.githubusercontent.com/version14/dot/main/uninstall.sh | shProject .dot/ directories are not removed. Delete them manually if needed:
rm -rf my-project/.dot