ubt — Universal Build Tool
One CLI to build, test, run, and manage dependencies across every ecosystem.
About
ubt is a universal build tool that wraps npm, cargo, go, pip, maven, gradle, dotnet, bundler, and more behind a single consistent command interface. Stop memorizing per-ecosystem commands — ubt build does the right thing regardless of whether you're in a Node, Rust, Go, Python, Java, .NET, or Ruby project.
It auto-detects your project type from lockfiles and manifests, resolves the correct underlying tool, translates flags, and forwards the process transparently — no wrappers, no overhead.
Installation
One-liner (Linux & macOS):
|
This installs the latest release binary to ~/.local/bin.
Via Cargo:
Quick Start
# Build the project
# Run tests
# Install / sync dependencies
# Format source code
# Run the project
Supported Ecosystems
| Ecosystem | Supported Tools |
|---|---|
| Node.js | npm, pnpm, yarn, bun, deno |
| Go | go |
| Python | pip, pipenv, poetry, uv |
| Rust | cargo |
| Java | Maven (mvn), Gradle (gradle/gradlew) |
| .NET | dotnet |
| Ruby | bundler (bundle) |
Commands Reference
Build & Run
| Command | Description |
|---|---|
ubt build |
Compile / build the project |
ubt run [args] |
Run the project entry point |
ubt start |
Start the application (dev server, etc.) |
ubt run-file <file> [args] |
Run a file directly |
ubt exec <cmd> [args] |
Execute an arbitrary command via the tool |
ubt check [args] |
Type-check / compile-check without producing output |
Testing
| Command | Description |
|---|---|
ubt test [args] |
Run the test suite |
ubt test --watch |
Run tests in watch mode |
ubt test --coverage |
Run tests with coverage report |
Dependencies
| Command | Description |
|---|---|
ubt dep install |
Install / sync all dependencies |
ubt dep remove <pkg> |
Remove a dependency |
ubt dep update |
Update dependencies |
ubt dep outdated |
Show outdated dependencies |
ubt dep list |
List installed dependencies |
ubt dep audit |
Audit dependencies for vulnerabilities |
ubt dep lock |
Generate or update lock file |
ubt dep why <pkg> |
Explain why a dependency is installed |
Code Quality
| Command | Description |
|---|---|
ubt fmt |
Format source code |
ubt fmt --check |
Check formatting without modifying files |
ubt lint |
Run the linter |
ubt lint --fix |
Run linter with auto-fix |
Database
| Command | Description |
|---|---|
ubt db migrate |
Run database migrations |
ubt db rollback |
Rollback database migrations |
ubt db seed |
Seed the database |
ubt db create |
Create the database |
ubt db drop |
Drop the database |
ubt db reset |
Reset the database (drop + create + migrate) |
ubt db status |
Show migration status |
Project Lifecycle
| Command | Description |
|---|---|
ubt init |
Initialize a new project configuration |
ubt release [--dry-run] |
Create a release |
ubt publish [--dry-run] [-y] |
Publish a package |
ubt clean |
Remove build artifacts |
Diagnostics & Config
| Command | Description |
|---|---|
ubt info |
Show detected tool/runtime info |
ubt tool info |
Show detected tool information |
ubt tool doctor |
Run diagnostic checks |
ubt tool list |
List available tools/plugins |
ubt tool docs |
Open tool documentation |
ubt config show |
Show current configuration |
ubt completions <shell> |
Generate shell completion script |
Configuration (ubt.toml)
Place a ubt.toml in your project root to override detection or remap commands:
[]
# Force a specific tool instead of auto-detecting
= "pnpm"
[]
# Override what a universal command maps to
= "pnpm run build:prod"
= "pnpm run test:ci -- --reporter=verbose"
[]
# Define project-local command shortcuts
= "node scripts/migrate.js"
= "node scripts/seed.js"
Global Flags
| Flag | Env Var | Description |
|---|---|---|
--tool <TOOL> |
UBT_TOOL |
Force a specific underlying tool |
--verbose |
— | Print the resolved command before running |
--quiet |
— | Suppress all ubt output (pass-through only) |
--version |
— | Print ubt version |
Example:
UBT_TOOL=yarn
Shell Completions
Generate and install completions for your shell:
# Bash
# Zsh
# Fish
Plugin System
ubt uses TOML plugin files to define tool mappings. Built-in plugins live alongside the binary. You can extend or override them by placing .toml files in:
- User plugins:
~/.config/ubt/plugins/ - Project plugins:
.ubt/plugins/(relative to project root)
A plugin file specifies detection rules (lockfile globs, manifest names), command mappings, flag translations, and tool variants. See plugins/node.toml for a full example.
Contributing
Please follow Conventional Commits for all commit messages.
Releasing
- Bump the version in
Cargo.tomlandCargo.lock(cargo check) - Commit:
chore: bump version to X.Y.Z - Tag and push:
git tag X.Y.Z && git push origin main X.Y.Z
The release workflow automatically builds binaries for 5 platforms, generates a changelog, publishes a GitHub release, and publishes to crates.io. A validation step ensures the tag matches Cargo.toml before any builds start.
License
MIT © 2026 UBT Contributors