Mise: Monorepo Tasks

1 month ago 3

We're excited to announce Monorepo Tasks, a powerful new feature that brings first-class monorepo support to mise tasks! 🚀

What is it?

Monorepo Tasks allows you to manage tasks across multiple projects in a single repository, with each project maintaining its own tools, environment variables, and tasks. Think of it as bringing the power of tools like Bazel or Turborepo to mise's task system, but with mise's signature simplicity.

Key Features

🎯 Unified Task Namespace

All tasks across your monorepo are automatically discovered and prefixed with their location:

mise //projects/frontend:build mise //projects/backend:test mise //services/api:deploy

🌳 Smart Tool & Environment Inheritance

Define common tools at the root, override them where needed:

# Root mise.toml [tools] node = "20" # Inherited everywhere python = "3.12" # projects/legacy-app/mise.toml [tools] node = "14" # Override just for this project # python still inherited!

🎭 Powerful Wildcard Patterns

Run tasks across multiple projects with ease:

# Run tests in ALL projects mise //...:test # Run all build tasks under services/ mise //services/...:build # Run ALL tasks in frontend (wildcards need quotes) mise '//projects/frontend:*' # Run all test:* tasks everywhere mise '//...:test:*'

Consistent Execution Anywhere

Run tasks from anywhere in the monorepo - they always execute with the correct context, tools, and environment from their config_root.

🔒 Automatic Trust Propagation

Trust your monorepo root once, and all descendant configs are automatically trusted.

Quick Start

1. Enable the feature in your root mise.toml:

experimental_monorepo_root = true [tools] node = "20" python = "3.12"

2. Set the experimental flag:

export MISE_EXPERIMENTAL=1

3. Add tasks to your projects:

# projects/frontend/mise.toml [tasks.build] run = "npm run build" [tasks.test] run = "npm test"

4. Run tasks from anywhere:

mise //projects/frontend:build mise //...:test # Run tests in all projects!

Example Monorepo Structure

myproject/ ├── mise.toml (experimental_monorepo_root = true) ├── services/ │ ├── api/mise.toml │ ├── worker/mise.toml │ └── scheduler/mise.toml └── apps/ ├── web/mise.toml └── mobile/mise.toml

Run all service builds: mise //services/...:build
Run all app tests: mise //apps/...:test
Run everything: mise '//...:*' (if you're brave! 😄)

Why This Matters

Managing monorepos is hard. Coordinating tools, tasks, and environments across dozens of projects is even harder. With Monorepo Tasks, you get:

  • No more repetitive scripts - Define once, run anywhere
  • Consistent environments - Each project gets exactly the tools it needs
  • Powerful automation - Wildcards make CI/CD pipelines a breeze
  • Better developer experience - Clear, discoverable task namespacing

How Does This Compare to Other Tools?

The monorepo ecosystem is rich with excellent tools, each with different strengths. Here's how mise's Monorepo Tasks compares:

Simple Task Runners

Taskfile and Just are fantastic for single-project task automation. They're lightweight and easy to set up, but they weren't designed with monorepos in mind. While you can have multiple Taskfiles/Justfiles in a repo, they don't provide unified task discovery, cross-project wildcards, or automatic tool/environment inheritance across projects.

mise's advantage: Automatic task discovery across the entire monorepo with a unified namespace and powerful wildcard patterns.

JavaScript-Focused Tools

Nx, Turborepo, and Lerna are powerful tools specifically designed for JavaScript/TypeScript monorepos.

  • Nx offers incredible features like dependency graph visualization, affected project detection, code generation, and computation caching. It has a massive plugin ecosystem and excels at frontend monorepos.
  • Turborepo focuses on blazing-fast task caching and parallel execution with minimal configuration.
  • Lerna pioneered JavaScript monorepo management with package versioning and publishing workflows.

mise's advantage: Language-agnostic support. While these tools excel in JS/TS ecosystems, mise works equally well with Rust, Go, Python, Ruby, or any mix of languages. You also get unified tool version management (not just tasks) and environment variables across your entire stack.

Large-Scale Build Systems

Bazel (Google) and Buck2 (Meta) are industrial-strength build systems designed for massive, multi-language monorepos at companies with thousands of engineers.

  • Bazel offers incredible features like distributed caching, remote execution, and hermetic builds with fine-grained dependency tracking.
  • Buck2 is a modern rewrite with a clean architecture and impressive performance optimizations.

Both are extremely powerful but come with significant complexity:

  • Hermetic builds require strict isolation and complete dependency control
  • Steep learning curve with specialized DSLs (Starlark, etc.)
  • Complex configuration requiring dedicated build engineers
  • Heavy investment in infrastructure for remote caching
  • Stricter constraints on how you structure your code

mise's advantage: Simplicity through non-hermetic builds. mise doesn't try to control your entire build environment in isolation - instead, it manages tools and tasks in a flexible, practical way. This "non-hermetic" approach means you can use mise without restructuring your entire codebase or learning a new language. You get powerful monorepo task management with simple TOML configuration - enough power for most teams without the enterprise-level complexity that hermetic builds require.

Other Notable Tools

Rush (Microsoft) offers strict dependency management and build orchestration for JavaScript monorepos, with a focus on safety and convention adherence.

Moon is a newer Rust-based build system that aims to be developer-friendly while supporting multiple languages.

The mise Sweet Spot

mise's Monorepo Tasks aims to hit the sweet spot between simplicity and power:

Feature Simple Runners JS-Focused Build Systems mise
Multi-language support
Easy to learn ⚠️
Unified task discovery
Wildcard patterns ⚠️
Tool version management ⚠️
Environment inheritance ⚠️
Minimal setup ⚠️
Task caching

When to choose mise:

  • ✅ Polyglot monorepos (multiple languages)
  • ✅ You want unified tool + task management
  • ✅ You prefer simplicity over maximum performance
  • ✅ You're already using mise for tool management

When to consider alternatives:

  • You're exclusively JavaScript/TypeScript → Nx or Turborepo might offer more JS-specific features
  • You're at Google/Meta scale with thousands of engineers → Bazel or Buck2 offer distributed build infrastructure
  • You need advanced task caching → Nx, Turborepo, or Bazel offer sophisticated caching systems

The best tool is the one that fits your team's needs. mise's Monorepo Tasks is designed for teams who want powerful monorepo management without the complexity overhead, especially when working across multiple languages.

Try It Out!

This feature is experimental, which means:

  • ✅ It's fully functional and ready to use
  • ⚠️ The API might evolve based on feedback
  • 💬 We'd love to hear your thoughts!

Read the full documentation: Monorepo Tasks Guide

We Want Your Feedback!

Please try it out and let us know:

  • What works well?
  • What could be better?
  • What features are missing?
  • How are you using it?

Share your experience in the comments below! 👇


Special shoutout to the mise community for the feedback and ideas that led to this feature. Happy building! 🛠️

Read Entire Article