Meta - Monorepo Task Orchestrator
One command to rule them all
Meta orchestrates Turborepo, Cargo, and Bacon in tmux for polyglot monorepos. Stop juggling multiple terminals - let meta manage your dev environment.
Why Meta?
Modern monorepos use multiple tools: Turborepo for TypeScript, Cargo for Rust, Bacon for hot-reload. Meta unifies them under one CLI with proper tmux orchestration.
Quick Start
# 1. Validate setup
# 2. Start all dev servers in tmux
# 3. Navigate: Ctrl+B then arrows | Detach: Ctrl+B then D
Features
- Tmux Orchestration - Each project in its own pane with full TUI
- Smart Routing - Turborepo from root, Bacon/Cargo from project directory
- Per-Project Logging - Stdout captured to
.meta/logs/<project>.log(ANSI-stripped for readability) - Project Exclusion -
dev_default = falseto exclude projects from defaultmeta dev - Workspace-Aware - Detects Cargo workspaces for correct binary paths
- Bacon Validation -
meta doctorwarns about missingbacon.toml - Process Tree Detection - Detects running bacon/cargo processes even when shell wrappers exit
- Multi-Workspace - Run meta in multiple directories without conflicts
- Claude Code Integration - AI skill for natural language control
- Zero Config - Auto-detects projects, generates
meta.toml
CLI Reference
| Command | Description |
|---|---|
meta dev |
Start all dev servers in tmux |
meta dev -p api web |
Start specific projects only |
meta dev -d |
Start in background (for CI/agents) |
meta dev:stop |
Stop all dev processes |
meta status |
Show running processes and logs |
meta status --json |
JSON output for programmatic use |
meta logs <project> |
View project logs (-f to follow) |
meta sessions |
List all active meta sessions |
meta build [--prod] |
Build all projects |
meta test |
Run all tests |
meta run <task> |
Run any task (fmt, clippy, audit) |
meta doctor |
Validate configuration (checks docker if .mcp.json uses it) |
meta init |
Generate meta.toml + .mcp.json for mcp-log-server |
meta init --no-mcp |
Generate meta.toml only (skip .mcp.json) |
Configuration
# meta.toml
= "1"
[]
= "My Monorepo"
[]
= true
= "bacon"
= ["rust"]
[]
= true
= "turbo"
= ["typescript"]
[]
= "rust"
= "apps/api"
[]
= { = "bacon", = "run-long" }
= { = "cargo", = "build --release" }
[]
= "next"
= "apps/web"
[]
= { = "turborepo", = "run dev --filter=@org/web" }
# Exclude from default `meta dev` but still usable with `meta dev -p mobile`
[]
= "rust"
= "apps/mobile"
= false
[]
= { = "cargo", = "tauri android dev" }
dev_default
Set dev_default = false on a project to exclude it from meta dev while keeping it available via meta dev -p <name>. Useful for projects that require special hardware (emulators, devices) or conflict with other projects on the same port.
Logging
Meta automatically captures output from all dev processes to .meta/logs/<project>.log using tmux's pipe-pane. ANSI escape codes are stripped so logs are readable even from TUI tools like bacon.
No bacon.toml changes are needed — meta handles log capture externally.
MCP Log Server Integration
meta init writes an mcp-log-server entry to .mcp.json by default, pointed at ./.meta/logs. This lets Claude Code (and any MCP client) tail and search per-project dev-server logs without extra setup.
The generated entry uses docker run ghcr.io/wolven-tech/mcp-log-server:latest with LOG_DIR=/logs mounted from ./.meta/logs. meta doctor warns if .mcp.json references docker but docker isn't on PATH.
Documentation
- User Guide - Daily workflow, tmux navigation, troubleshooting
- Standalone Setup - Add meta to your own monorepo
- Contributing - Development setup and guidelines
Changelog
v0.7.2 (Current)
- MCP log server integration —
meta initwrites a defaultmcp-log-serverentry to.mcp.jsonpointed at./.meta/logs. Pass--no-mcpto opt out. - Doctor docker check —
meta doctorwarns when.mcp.jsonreferences docker but docker isn't onPATH.
v0.7.1
- Detach mode —
meta dev -d/meta dev --detachstarts services without attaching to tmux (#8) - Non-interactive detection — Auto-detaches when run from CI, agents, or scripts (no more "failed to attach" errors)
- JSON status output —
meta status --jsonfor programmatic consumption by AI agents and scripts (#9) - Tracing to stderr — Log output no longer pollutes stdout (clean JSON/pipe output)
v0.7.0
- Project exclusion -
dev_default = falseto exclude projects from defaultmeta dev(#1) - Status filtering -
meta statusonly shows projects with a dev task (#2) - Bacon validation -
meta doctorwarns about missingbacon.tomlor undefined jobs (#3) - Process tree detection - Walks full process tree to detect bacon-spawned processes (#4)
- Log capture for bacon - Uses
tmux pipe-panewith ANSI stripping for all tools including bacon (#5) - Workspace-aware binary paths - Detects Cargo workspaces and checks correct
target/directory (#6) - Doctor accuracy - Per-project dev task check is independent of shared paths (#7)
- Library crate skipping - Binary status checks skip library crates automatically
- 48 tests - 33 unit + 5 config + 10 integration tests
v0.6.1
- Bacon logging fix - bacon jobs can now tee output to log files
- Meta skips outer tee for bacon (avoids TUI escape code capture)
- Centralized log location for multi-bacon monorepos
v0.6.0
- Claude Code skill with decision trees and output parsing
- Multi-instance support (directory-based session names)
meta sessionscommand- Fixed process detection via tmux pane queries
v0.5.0
- Per-project log capture to
.meta/logs/<project>.log meta logscommand with--followand--lines- Log rotation at 10MB
v0.4.1
meta statuscommand for process monitoring- Lifecycle logging (START/EXIT/RESTART events)
- Binary staleness detection
v0.3.1
meta dev:stopcommand- Improved tmux navigation guide
v0.3.0
- Published to crates.io
- Custom pane titles
v0.2.1
- Tmux orchestration
- Multiple bacon instances with full TUI
meta doctorvalidation
Roadmap
v0.8.0 (Next)
- Session save/restore
- Environment support (dev, staging, prod)
- Project dependency ordering
Future
- Remote execution (SSH)
- Custom tool plugins
- CI/CD integration
Development
License
MIT
Built with Rust