Demo (2 minutes):
- Play locally:
asciinema play docs/demo.cast - Convert to plain text (for quick sharing):
asciinema convert --output-format txt docs/demo.cast -
Asciinema recording file: docs/demo.cast
The Swiss Army Knife for Project Scaffolding.
Bootstrapping new projects shouldn't require memorizing 50 different CLI commands.
ProjectCLI is an interactive, cross-language project generator. Instead of remembering usage for create-react-app, cargo new, poetry new, laravel new, rails new, etc., just run projectcli.
We handle the complexity of calling the official CLIs for you.
| Tool | Problem |
|---|---|
| create-react-app | JS-only |
| cargo new | Rust-only |
| yeoman | heavy & old |
| projectcli | unified + context-aware |
- Multi-Language Support: Rust, Go, Python, JavaScript, TypeScript, PHP, Java, C#, Ruby, Swift, Dart.
- Unified Interface: One interactive wizard to rule them all.
- Smart Context Awareness: Running
projectcliinside an existing project automatically offers to add libraries, CI/CD, or Dockerfiles tailored to that language. - Preflight Checks: Warns you if you are missing required tools (e.g.
cargo,go,node) before you start. - Remote Templates: Clone any GitHub repository and automatically strip
.githistory for a fresh start. - CI/CD & Docker: One-click generation of GitHub Actions workflows and Dockerfiles.
- Dev Containers: Generate
.devcontainer/devcontainer.jsonfor VS Code / Codespaces. - License Generator: Add a standard
LICENSEfile (configurable default).
- โ Never writes outside the project folder it creates (guards against path traversal).
- โ Never deletes files without an explicit, targeted operation (template clone only removes the cloned
.git). - โ Supports
--dry-runto preview planned actions without executing them.
Run instantly with npx:
npx @dawitworku/projectcli@latestOr install globally:
npm install -g @dawitworku/projectcli
projectcliJust run projectcli and follow the prompts:
- Select Language (fuzzy search supported).
- Select Framework (React, Vue, Next.js, Actix, Axum, Django, FastAPI, etc.).
- Choose Project Name.
- (Optional) Add CI/CD or Docker.
ProjectCLI v3 adds a few focused subcommands:
projectcli doctorcheck a repo and optionally apply safe fixesprojectcli preset list/projectcli preset use <name>manage presetsprojectcli upgradeupgrade generated configs safely (supports--preview)projectcli add <feature>add focused features likeci,docker,devcontainer,license,lint,testprojectcli plugin list/projectcli plugin install <id>enable plugins (and their contributions)
Run it inside a project to detect the language and offer relevant tools:
cd my-rust-project
projectcli
# Output: "โ Detected active Rust project"
# Options: [Add GitHub Actions CI], [Add Dockerfile], [Add Dependencies]Clone a starter kit from GitHub and make it your own instantly:
projectcli --template https://github.com/example/starter-repo --name my-appYou can also apply extras non-interactively:
projectcli --template https://github.com/example/starter-repo --name my-app --yes --ci --docker --devcontainer --licenseSkip the interactive prompts for scripts or specialized workflows:
projectcli --language Rust --framework Actix --name my-api --ci --docker --yesPreview what would happen (no execution):
projectcli --language Rust --framework Actix --name my-api --dry-runExtras flags:
--devcontaineradd a VS Code Dev Container--licenseforce-add LICENSE (uses config defaults)--no-licensenever add LICENSE
Save your preferences (like default package manager):
projectcli configYou can set defaults like:
- JS/TS package manager
- Author name (for LICENSE)
- Default license type (MIT/Apache2/ISC)
ProjectCLI can also read a config file from the current directory:
.projectclircprojectcli.config.json
Example:
{
"packageManager": "pnpm",
"author": "The Team",
"license": "MIT",
"ci": true,
"docker": false,
"devcontainer": true
}Precedence:
- CLI flags
- Project config file
- Global config (
projectcli configโ~/.projectcli.json)
| Language | Frameworks / Tools |
|---|---|
| JavaScript/TypeScript | React (Vite), Vue, Next.js, NestJS, Express, Astro, Svelte... |
| Rust | Binary, Library, Actix Web, Axum, Rocket, Taurus... |
| Python | Poetry, Setuptools, Django, Flask, FastAPI... |
| Go | Binary, Fiber, Gin, Chi, Echo... |
| PHP | Laravel, Symfony, Slim... |
| Java/Kotlin | Spring Boot, Gradle/Maven... |
| ...and more | C#, Ruby, Swift, Dart |
ProjectCLI is intentionally simple: most โfeaturesโ are data-driven.
- Registry entrypoint:
src/registry.js(backwards-compatible import path for callers/tests). - Built-in generators:
src/registry_legacy.js. - V3 registry wrapper (plugins/extensions):
src/registry/index.js. - Generators produce steps: each generator returns a list of steps (commands / mkdir / writeFile).
- Executor: steps are executed by
src/run.js(it also prevents writing outside the project folder). - Preflight: generators can declare required tools with
check: ["cargo", "go", ...]and the wizard warns early. - Remote templates:
--templateclones viasrc/remote.js, strips.git, then can apply Extras (CI/Docker/Devcontainer/License).
Adding a framework usually means:
- Add an entry in
src/registry.jswithid, optionalnotes, optionalcheck, and acommands()function. - Prefer non-interactive CLI args where possible (better for
--yes/automation). - Run
npm run lintandnpm test.
We love contributions! Whether it's adding a new framework to the registry or fixing a bug.
- Fork it.
- Create your feature branch (
git checkout -b feature/new-framework). - Commit your changes (
git commit -am 'Add support for X'). - Push to the branch (
git push origin feature/new-framework). - Create a new Pull Request.
See CONTRIBUTING.md for more details.
MIT ยฉ Dawit Worku