runy
Your dev stack,
declared in YAML
runy runs the dev servers, ports, folders, worktrees and watchers a workspace declares in its .runy/ folders, from one daemon that keeps them up.
⌄acme
›api3
api
api
worker
›db2
data
postgres
›docs1
docs
⌄web2
web
web
17:37:30Reloading workspace
17:37:31web/port/web: Resolved · 3010 → http://web.localhost
17:37:32web/process/web: starting · pid 48213
17:37:34web/process/web: running healthy
Switch a namespace on. Its resources come up in the tree and in the journal.
From YAML
to running
dev.yaml
kindprocess
nameweb
spec.cmdpnpm
spec.args[dev, --port, ${ port.web.status.value }]
spec.restart{ kind: fixed, delay: 1000 }
spec.healthweb: http { port: ${ port.web.status.value } }
The file
is read.
Every line of output is kept
A process's output goes to a SQLite journal the console streams. The same query filters what is stored and what arrives next.
17:37:32Starting process: pnpm dev --port 3010
17:37:32VITE v7.3.1 ready in 412 ms
17:37:32Local: http://localhost:3010/
17:37:33[vite] hmr invalidate /src/App.tsx Could not Fast Refresh
17:37:33page reload src/config.ts
17:37:34Health check `web` passes
17:41:18hmr update /src/routes/home.tsx
17:41:18hmr update /src/styles/app.css
17:42:50hmr update /src/components/Menu.tsx
17:42:50hmr update /src/components/Menu.tsx (x2)
17:55:10TS2322: Type 'string' is not assignable to type 'number'.
17:55:10[vite] Internal server error: Transform failed with 1 error
17:55:41hmr update /src/components/Menu.tsx
17:55:41page reload src/config.ts
17:56:02Health check `web` passes
Tick @stderr, or type a word.
Five kinds,
one document each.
Read the referencecmdthe program, on the daemon's PATH or relative to cwdrequired
argsits arguments; each may be an expression[]
envvariables added to the daemon's environment{}
cwdworking directory, relative to the workspace rootthe root
restartnever, always, or { kind: fixed | exponential, on, … }never
watcha file set whose changes restart the processnone
healthnamed http, tcp or exec checks{}
journal.max_lineslines the journal keeps1000
preferredthe port to try firstnone
range[lo, hi], searched when preferred is taken[3000, 3999]
domainshosts the proxy serves it at, or URLs behind a tunnel[]
domainone entry, sugar for domains
pathrelative to the workspace root; created if missing
cachetrue: under the workspace's cache folder, named after the resource
branchchecked out; created from base if missingrequired
repothe repository, relative to the workspace rootthe root
pathwhere it is checked out<cache>/worktrees/<name>
basethe starting point of a new branchthe default branch
includeglobs of files to follow[]
excludeglobs to leave out[]
prefixthe directory the globs are relative tothe root
Up in
a minute
The guide writes a first .runy/ folder, activates it and opens the console.
$curl -fsSL https://setup.runy.dev | sh
runy 0.6.0 installed to ~/.local/bin
$cd products/ && runy ns up
web: up
$runy ps
web/port/webResolved3010 → http://web.localhost
web/process/webResolvedrunning healthy

