fyrer: Declarative Task Orchestration for Monorepos
fyrer is a declarative, language-agnostic monorepo task orchestrator written in Rust. In a large monorepo — whether it spans TypeScript, Rust, Go, Python, or any other language — running tasks across dozens of packages in the right order, without redundant rebuilds and without losing output, is painful. fyrer solves this by reading a single fyrer.yml config, turning your task relationships into a directed acyclic graph (DAG), and executing tasks in streaming DAG order (as soon as dependencies finish) so you get the fastest possible run every time.
What fyrer does
- Reads
fyrer.ymland resolves a task dependency graph — declare each package and its tasks; fyrer topologically sorts them and propagates failures so dependent tasks are cleanly skipped. - Runs tasks in streaming DAG order — each task starts as soon as its dependencies succeed, up to the
concurrencylimit, maximising CPU utilisation across your packages. - Streams colorized, prefixed output per task — every task's logs are prefixed with its package and task name, colorized for readability, and streamed live.
- Caches successful build tasks keyed by inputs — tasks with
cache: trueare fingerprinted using a blake3 hash of their command, environment, and all matched input files. A second run reports⚡ Cachedand restores outputs instantly. - Provides an interactive TUI and a plain CI-friendly mode — by default
fyrer runopens a full-screen terminal UI with a task list and scrollable log pane. Pass-n(--no-tui) for plain prefixed output that works cleanly in CI pipelines and pipes.
Who it's for
fyrer is designed for developers who manage polyglot monorepos — repositories that combine multiple languages or runtimes such as TypeScript/Bun, Rust, Go, Python, and more — and who need a lightweight, zero-boilerplate tool to coordinate builds, tests, code-generation steps, and development servers across all of them. If you have ever written a Makefile or shell script just to sequence cargo build before bun run dev, fyrer is for you.
Install fyrer with the install script, cargo install, or from source.
Run the bundled demo monorepo and learn the core commands in minutes.
Limitations
Keep these known constraints in mind as you design your fyrer.yml:
- Persistent tasks only block their dependents. fyrer runs tasks in streaming order — a task starts as soon as its dependencies finish, up to the
concurrencylimit. Apersistent: truetask (e.g. a dev server) never exits, so any task that transitively depends on it will never start. Keep long-running dev servers on the leaves of the dependency graph so they don't block other work. Unrelated tasks continue to run concurrently. watchis implemented via polling. Tasks withwatch: trueare watched by polling theirinputsglobs every 300ms (debounced 300ms). When inputs change, the task is restarted automatically.watchcannot be combined withcache.