on

One command. Your entire dev environment.

brew install rickyshin93/tap/on
terminal

See What Happens

One YAML config launches your entire workspace.

iTerm2 — myproject
api-server
$ watchexec -e py -- uv run python src/main.py dev
INFO: api server on 0.0.0.0:8080
INFO: watching for .py changes...
web-gateway
$ pnpm dev
ready - started server on 0.0.0.0:3001
compiled successfully in 0.8s
watching for file changes...
dashboard
$ pnpm dev
VITE v5.4.1 ready in 320ms
Local: http://localhost:5173/
myproject 0:api-server 1:web-gateway 2:dashboard 12:34

Auto-split terminal panes with running processes

Visual Studio Code — myproject (Workspace)
EXPLORER
MYPROJECT (WORKSPACE)
frontend
src
components
App.tsx
package.json
backend
main.py
routes
models.py
README.md
App.tsx frontend/src
main.py backend
frontend › src › App.tsx
1import { Router } from 'react-router'
2import { AuthProvider } from './auth'
3
4export default function App() {
5 return (
6 <AuthProvider>
7 <Router />
8 </AuthProvider>
9 )
10}
feat/auth TypeScript JSX UTF-8

VS Code opens in workspace mode with all project folders

Why on?

Terminal Panes

iTerm2 or tmux, auto split & name.

Smart Layouts

Vertical or grid, one line config.

Editor Integration

Auto-open VS Code / Cursor with workspace.

Browser Tabs

Auto-open all dev URLs.

Port Detection

Auto-detect port conflicts before launch.

Git Status

Warn about uncommitted changes before launch.

Get Started in Seconds

brew tap rickyshin93/tap
brew install rickyshin93/tap/on

Or build from source: cargo install --path .

Quick Start Config

~/.on/myproject.yaml
name: myproject
iterm: # or tmux
layout: vertical
panes:
- name: api-server
dir: ~/projects/myproject/api
cmd: watchexec -e py -- uv run python src/main.py dev
- name: web-gateway
dir: ~/projects/myproject/gateway
cmd: pnpm dev
- name: dashboard
dir: ~/projects/myproject/dashboard
cmd: pnpm dev
editor:
cmd: code
workspace: ~/.on/myproject.code-workspace

Run on new myproject to generate, then on myproject to launch.