MonoSmith — a simple monorepo tool
MonoSmith runs a monorepo in Node, Go, Python, Rust, .NET, Ruby, PHP, C++,
Dart, the JVM and Bicep from one command, smith. It scaffolds projects, runs
their tasks in dependency order from a cache, generates the CI pipeline from
what is in the repository, and releases from conventional commits.
smith is a single static binary written in Go. Each language is a plugin
that runs out-of-process over a small JSON-RPC protocol; the built-in ones
ship inside the binary, and a plugin for another language can be written in
any language without touching smith.
smith new acme && cd acme
smith add app web --lang node # deployed, never published
smith add lib core --lang go # imported internally, never published
smith add package sdk --lang python # published on release
smith add app api --stack react # a stack: the plugins a project is built with
smith build # every project, in dependency order, cached
smith test --affected # only what changed since main
smith graph # how projects depend on each other (--format tui to browse)
smith release --dry-run # what the next release would publish
smith doctor # is the workspace healthy?
smith # the interactive shell, in a terminalcurl -fsSL https://raw.githubusercontent.com/monosmith-app/monosmith/main/install.sh | sh # Linux, macOS, Git Bash
irm https://raw.githubusercontent.com/monosmith-app/monosmith/main/install.ps1 | iex # Windows PowerShellOr with the package manager of your language; each installs the same smith
binary:
npm install --global monosmith
pipx install monosmith # or: uv tool install monosmith, pip install monosmith
dotnet tool install --global monosmith # .NET 10 SDK
gem install monosmith
dart pub global activate monosmithOr download a zip from the releases.
Each release also carries a .deb and an .rpm. Linux, macOS and Windows on
x64 and arm64 are supported.
Installing covers each channel, upgrading, checking a
download, and the unsigned-binary prompts a browser download gets.
MonoSmith continues mnci, which was built on Nx; smith convert converts Nx
and Turborepo workspaces and those made by mnci.
| Three kinds | app (deployed), lib (internal), package (published). The kind decides what release does with a project. |
| Eleven languages | Node (JavaScript and TypeScript), Python, Go, Rust, .NET (C#, F#), Ruby, PHP, C and C++ (CMake), Dart and Flutter, the JVM (Java with Maven, Kotlin with Gradle, Android) and Bicep, each through a built-in plugin. |
| Stacks | A project records the plugins it is built with: React, Vue, Svelte, Angular, an Astro docs site or a VS Code extension next to a plain Node library, in the same workspace. |
| No configuration to write | Projects, tasks and dependencies come from the manifests (package.json, go.mod, Cargo.toml, *.csproj, …) and from what the sources import. smith.toml names the workspace; everything else has a default. |
| Cache | A task whose inputs did not change replays its output and log from a content-addressed cache, locally or from a shared remote (HTTP, S3, Azure Blob). |
| Affected | --affected runs only the projects a change can break, and runs everything when it cannot be sure. |
| CI generated | GitHub Actions, Azure Pipelines and GitLab CI, derived from the plugins in use, calling smith ci <phase> — the same commands you run locally. |
| Release | feat → minor, fix → patch, breaking → major. Packages release in dependency order to their registries (npm, PyPI, crates.io, NuGet, RubyGems, pub.dev, a Maven repository, Go module tags); an app releases per-platform binaries to GitHub Releases and, if you ask, to npm, PyPI, NuGet and RubyGems. A failed release resumes when re-run. |
| Conventions | vertical-slices checks that code is laid out by what it does, in each language's own naming style. docker builds and pushes an image for every app with a Dockerfile. |
| Convert | smith convert turns an Nx or Turborepo workspace, or one made by the old Nx-based mnci, into a smith workspace, keeping its projects and release tags. It reports anything it cannot map. |
| Editors and assistants | Stable --json contracts for editors, a JSON Schema for smith.toml, and smith mcp for AI assistants. |
Start with getting started, a hands-on tour. Everything is in docs/, organised by what you want to do, and in four sections:
- Guides: installing, getting started, converting from Nx, editors, writing a plugin, troubleshooting, FAQ
- Reference: CLI, glossary,
configuration (
smith.toml), tasks, cache and affected, CI pipelines, releasing, stacks, recipes, conventions, plugins and the protocol - Design: architecture, plugin system, decisions, research
- Contributing: working on MonoSmith
The golden path — a new workspace, projects in every built-in language, build, test, run, CI and release — is tested end to end on Windows, macOS and Linux, and MonoSmith builds and releases itself. Plans and bugs are tracked in issues, and their progress on the MonoSmith board.
MIT