spinup

v0.6.0

Your dev environment, one word away

$
spinup
alias my-app
status registered
command ~/.local/bin/my-app
root ~/code/my-app
stack node
package npm
frameworks NestJS, Next.js
services api, web
actions dev (default)
action dev
mode tmux
windows 1 (services)
panes 2 (api, web)
layout even-horizontal
next my-app

Animated terminal showing spinup registering my-app, then launching the tmux development session.

curl -fsSL https://raw.githubusercontent.com/PedroElizalde01/spinup/main/install.sh | bash

What it is

One command per project.

spinup is an open-source command-line tool for starting a project's local development environment. Run spinup my-app once inside a repository: it detects the stack, writes a .spinup.yml that describes each service, and installs a my-app command. From then on, typing that name from any directory starts every service in dependency order, in a tmux workspace or in the foreground.

Detection covers Node, Python, Go, Rust, Ruby, PHP, Java, Deno and Docker Compose, including monorepos and workspaces. Services can wait for a port, an HTTP URL, a log line or a clean exit before their dependents start. Environment files are loaded with a documented precedence, and every launch can be inspected first with --plan, --check and --dry-run.

Compared with other tools

Like foreman, overmind, honcho or mprocs, spinup runs several processes at once. Unlike them, it finds the commands itself, orders services by dependencies and readiness, registers a global command per project, and manages the tmux session it creates: status, restart one service, attach, stop, logs.

It does not replace Docker Compose or a task runner such as turbo or make. It starts them as services, alongside the processes that run outside containers.

Where it runs

A single binary for Linux (x64, arm64, glibc and musl) and macOS (Apple Silicon and Intel). Windows through WSL. Written in TypeScript, built with Bun, MIT licensed.

Detection

Automatic project reads.

SpinUp reads the workspace before it writes config, so the launch plan starts from what is actually in the repo.

node

Reads JavaScript and TypeScript workspaces, package managers, and common frontend or API entrypoints.

python

Finds Python services and preserves them as first-class steps in the generated run graph.

docker

Picks up compose files and container services so existing local orchestration can stay intact.

mixed

Marks repositories with multiple runtimes and folds them into a single launch surface.

Commands

Every flag, on a real project.

Each output below was printed by the CLI for my-app: Postgres and Redis in Compose, a NestJS API, a queue worker and a Next.js app, with readiness conditions, two env files and a migration action. Pick a flag.

$ spinup my-app
┌────────────────────────────────────────────────────────────┐
│  █▀▀ █▀█ █ █▄ █ █ █ █▀█                                    │
│  ▄▄█ █▀▀ █ █ ▀█ █▄█ █▀▀                                    │
│                                                            │
│ alias      my-app                                          │
│ status     registered                                      │
│ command    ~/.local/bin/my-app                             │
│ root       ~/code/my-app                                   │
├────────────────────────────────────────────────────────────┤
│ stack      mixed                                           │
│ package    npm                                             │
│ frameworks Docker Compose, NestJS, Next.js                 │
│ services   compose, api, web, worker                       │
├────────────────────────────────────────────────────────────┤
│ actions    dev (default), migrate, test                    │
│ action     dev                                             │
│ mode       tmux                                            │
│ windows    2 (infra, apps)                                 │
│ panes      4 (compose, api, worker, web)                   │
│ layout     main-vertical                                   │
├────────────────────────────────────────────────────────────┤
│ next       my-app                                          │
└────────────────────────────────────────────────────────────┘