Orbit
Orbit is a TUI to launch, control and monitor local development services: processes (backends, frontends, workers), Docker containers and docker compose services. It is built with TypeScript, Bun and OpenTUI (@opentui/react), and configured through a single orbit.yaml file.
◉ orbit · demo 1 Dashboard 2 Graph 3 Logs ● 7 up ○ 1
╭─ Services 7/8 ───────────╮╭─ Dependency graph · 7/8 up ────────────────────────────────────╮
│ ● postgres :55432 ││ ╭────────────────────╮ │
│ ● redis :56379 ││ ╭────▶│ ● auth ├────╮ │
│ ● auth :4300 ││ ╭────────────────────╮ │ │ healthy :4300 40M │ │ │
│▌● api :4100 ││ │ ● postgres ├──┤ ╰────────────────────╯ │ │
│ ● worker ││ │ healthy :55432 19M │ │ │ │
│ ● web :4200 ││ ╰────────────────────╯ │ │ ... │
The problem
Running a local stack usually means juggling many terminals: a database container, a backend, a frontend, a worker, each one depending on another. Starting them in the wrong order, leaving orphaned processes hogging ports, or not knowing which one failed makes the day-to-day painful.
What it does
- Dependency graph. Services are laid out by layers and colored by status; selecting a node highlights its dependencies and its dependents. Navigable with keyboard and mouse.
- Ordered startup and shutdown.
startbrings up dependencies first and waits until they are ready;stopstops dependents first. - Healthchecks. HTTP, TCP, command, or Docker’s
HEALTHCHECK. - Restart policy.
no,on-failureoralways, with exponential backoff. - Live logs. Per service or combined, with colored prefixes, regex filter or search (highlight while keeping all lines), scrolling, timestamps and error/warning highlighting. Long lines wrap, the view stays put while you scroll up, and a copy mode selects whole lines and copies them via OSC 52 or the system clipboard. Logs can also be exported to a file.
- CPU and memory metrics. Per process tree (via
/proc) and per container (docker stats), shown as sparklines. - Docker and compose. Imports
docker-compose.ymlautomatically (includingdepends_on, ports, healthchecks and variable interpolation) and re-attaches to containers that were already running; those are not stopped when exiting Orbit unless you ask for it. - Detach and resume. On quit you choose between stopping everything or leaving services running. Detached processes keep their own process group and write their logs to disk; the next
orbitre-attaches with status, logs, metrics and controls, andorbit downstops them from outside. - Environment variables. Global and per-service
envandenv_file(with optional files),${VAR:-def}interpolation, files re-read on every restart, and a view of each service’s environment with secrets masked. - One-shot tasks. Builds, migrations or provisioning steps count as ready once they finish successfully.
- Robust process handling. Detects occupied ports before starting and kills entire process trees, so no orphaned
viteoresbuildprocesses are left behind. - Command palette with fuzzy search, service groups, and open-in-browser.
- Themes. Eleven built-in themes (Catppuccin, Tokyo Night, Dracula, Nord, Gruvbox, Rosé Pine, One Dark…) switchable live, plus custom JSON themes that extend a built-in one.
- lazygit integration. Open a service’s git repository in lazygit and come back to Orbit with the services still running.
Usage
Published on npm as @jgoterris/orbit: run it with bunx @jgoterris/orbit, or install it globally. It also offers non-TUI commands (up, down, graph, ls, and logs with -f, --grep and --since) and orbit init, which generates an orbit.yaml by scanning the project.
Status
Personal open-source tool released under the MIT license. The codebase is covered by tests for the config, the dependency graph, the supervisor (with real processes) and the TUI.