Kai icon

Start your dev servers
with one click.

Kai is a small desktop app that remembers your projects and their commands, so you stop opening terminals and retyping the same thing every morning.

Download

All releases · Source · Unsigned build, on first launch right-click the app and choose Open.

What it does

Save once, click forever

Name, folder, command, env vars, autostart. A native folder picker, and config that survives restarts.

Live logs

stdout and stderr in real time, ANSI colour rendered rather than printed raw, stderr visually distinct.

Nothing gets lost

Every running app keeps buffering in the background, not only the one you are looking at. 5000 lines each.

Second monitor

Detach any app's logs into their own window and park it wherever you like.

Groups

One application can hold several sub-applications. Start the whole monorepo, or just the API.

Global commands

Entries without a folder of their own run in a global folder you configure, for anything not tied to a project.

Get it running

# clone and install
git clone https://github.com/omthorat2004/Kai.git
cd Kai
npm install

# develop, Vite plus Electron with hot reload
npm run dev

# package a dmg or an nsis installer
npm run build:mac
npm run build:win

The hard parts, handled

PATH on macOS

A double-clicked app inherits launchd's environment, not your shell's, so npm is simply missing. Kai spawns through a login shell, so nvm and Homebrew paths apply.

Orphaned servers

child.kill() kills the shell and leaves the dev server holding the port. Kai kills the whole process group, escalating to SIGKILL, and taskkill /T /F on Windows.

Chunked output

A data event can carry three lines or half of one. Kai buffers per stream and keeps the incomplete tail for the next chunk.

Scroll that behaves

Auto-scroll engages only when you are already at the bottom, so scrolling up to read a stack trace never yanks you back down.

Clean exit

Every child is killed before the app quits, so closing Kai never leaves a server running in the background.

Locked-down renderer

contextIsolation: true, nodeIntegration: false, no ipcRenderer in the page. One narrow preload bridge, and a strict CSP in the packaged build.