Web-based Agentic Development Environment (ADE) built on terminals.
Named after கோலு, the tradition of arranging figures on tiered steps.
nix run github:juspay/kolu # serve on 0.0.0.0:7681
nix run github:juspay/kolu -- --host 127.0.0.1 --port 8080 # custom bind- Multi-terminal — create, switch, and kill terminals from a collapsible sidebar
- Git-aware — header shows repo name, branch, and working directory (auto-detected via OSC 7)
- Command palette —
Cmd/Ctrl+Kto search terminals, switch themes, and run actions - 200+ themes — color schemes from iTerm2-Color-Schemes, switchable at runtime
- Sub-terminals —
Ctrl+`` toggles a bottom split panel per terminal for dev servers, lazygit, etc.Ctrl+Shift+``adds more tabs,Ctrl+PageDown/Upcycles - Keyboard-driven —
Cmd+Tnew terminal,Cmd+1-9jump,Cmd+Shift+[/]cycle,Cmd+/shortcuts help - Clipboard & image paste —
Ctrl+Vpastes images into Claude Code via server-side clipboard shims - WebGL rendering — xterm.js with GPU acceleration, canvas fallback
- Clickable URLs, find in buffer, Unicode 11, inline images (sixel, iTerm2, kitty)
- Font zoom —
Cmd/Ctrl +/-, persisted across sessions - Lazy attach — late-joining clients receive serialized screen state (~4KB) instead of replaying raw buffer
pnpm monorepo, three packages:
| Package | Stack |
|---|---|
common/ |
oRPC contract + Zod schemas |
server/ |
Hono + node-pty + @xterm/headless |
client/ |
SolidJS + xterm.js + Tailwind CSS v4 |
All communication over a single WebSocket (/rpc/ws) via oRPC. Terminal I/O, lifecycle, CWD tracking, and activity detection are typed RPC procedures with async generator streaming.
Requires Nix with flakes enabled.
nix develop # enter devshell
just dev # run server + client with hot reload
just test # e2e tests (full nix build)just ci builds all flake outputs on x86_64-linux and aarch64-darwin in parallel, runs e2e tests, and posts GitHub commit statuses. See ci/ for details and reuse instructions.
just ci # full CI run
just ci::protect # set branch protection
just ci::_summary # check current statusA home-manager module runs kolu as a systemd user service:
{
imports = [ kolu.homeManagerModules.default ];
services.kolu = {
enable = true;
package = kolu.packages.${system}.default;
host = "127.0.0.1"; # default
port = 7681; # default
};
}See nix/home/example/ for a full configuration with a VM test.