kolu

the changelog

What's new
in kolu.

Every tagged release, newest first — plus what's already landed on master and waiting for the next tag.

Added

  • kolu-tui: attach to your terminals from the shell (beta) #1255

    kolu-tui attach <id> takes over any live kolu terminal right in your shell — full raw passthrough, so every keystroke and chord reaches the inner program untouched. An ssh-style line-start escape is the one exception: ~. detaches (kolu-server keeps the terminal; re-attach anytime), ~~ sends a literal tilde, ~? shows help, and --escape picks another character. Attaching resizes the terminal to your window and repaints the scrollback instantly; when the program inside exits, kolu-tui exits with the same code, and your terminal is always restored cleanly — even on a crash.
  • kolu-tui: list and snapshot your terminals from the shell (beta) #1084

    A new terminal-side CLI talks to your running kolu-server over a local unix socket — kolu-tui list prints every live terminal (id · pid · idle · command · cwd, or --json), and kolu-tui snapshot <id> dumps a terminal’s current scrollback to stdout for piping and grepping. Read-only for now (attach/spawn land later); run it via nix run github:juspay/kolu#kolu-tui, and the home-manager module installs it alongside the server automatically. An unreachable server is an honest one-line error, never a hang.
  • Maximize a tile without the mouse #1248

    You can now toggle a tile between the freeform canvas and maximized view straight from the keyboard with Cmd/Ctrl+Shift+M, or by running “Maximize terminal” from the command palette — no more reaching for the chrome-bar button or double-clicking a title bar. The command’s label flips to “Restore canvas” once you’re maximized, so it always names what the next click does.

Fixed

  • Terminal output no longer freezes until you press a key #1273

    A terminal could silently stop painting new output — an agent seemingly stuck for minutes while its work actually continued — until any keypress made everything appear at once. The cause: a viewport scroll you never made (a touch artifact, a TUI leaving its alternate screen, a scroll tick delivered late after backgrounding the tab) engaged the scroll-lock, which held all output in a buffer with nothing to ever release it. The lock now engages only for scrolls you actually make — wheel, touch, scroll keys, find-in-terminal jumps; any other scroll snaps back to the bottom and output keeps flowing. Returning to the tab also releases a lock left engaged while you were away, and the Diagnostic Info dialog now shows each terminal’s lock state and the exact transition that engaged it.
  • Switching branches no longer flashes the previous branch's PR #1257

    When you switched a terminal to a different branch (or left the repo) while its PR was still being looked up, the tile could briefly show the old branch’s pull request — number, title, and CI status — until the new lookup finished, up to a few seconds later. Kolu now discards a stale in-flight lookup whose branch no longer matches, so the PR pill only ever reflects the branch you’re actually on.
  • No more false GitHub auth warnings on non-GitHub repos #1256

    A terminal in a repository hosted outside GitHub (Forgejo, Codeberg, GitLab, …) used to show a “gh: not authenticated” warning on its tile and re-log it every 30 seconds — but there was nothing to authenticate; the repo simply isn’t on GitHub. Kolu now recognizes that case and stays quiet, exactly like a branch with no PR. (Real PR metadata for Forgejo and friends is planned — this stops the lie first.)
  • External links in HTML previews now open in a new tab #1249

    Clicking a link to an outside site (a different host) inside a previewed .html file now opens it in a new browser tab, instead of silently doing nothing or replacing the preview with the remote page. Links between files in the same preview still open in place and move the file tree, as before.
  • No more error spam in fresh repos #1246

    Opening a terminal in a freshly git init’d repository (no remote, no commits) no longer logs a repeated “no base branch found” error on every change. The Code tab’s Branch view now shows an empty diff there instead of failing — while repos that simply haven’t fetched their remote still get the actionable “run git fetch” prompt.
  • No more scary error on upgrade #1239

    Upgrading from an older build no longer logs an EVENT_ITERATOR_VALIDATION_FAILED error at launch. Your saved Code-tab layout now carries forward cleanly instead of needing the preferences file deleted by hand.
  • Terminals no longer silently freeze #1235

    A WebSocket that died without notice — a laptop sleeping, Wi-Fi roaming, or a network/proxy dropping an idle connection — used to leave a terminal frozen until you reloaded the page. A heartbeat now detects the dead connection and reconnects on its own, so live output resumes without a reload.
  • Per-terminal zoom in canvas mode #1247

    Pressing Cmd/Ctrl +/- to change a terminal’s font size now zooms only the focused tile. Previously every open terminal zoomed at once, so two tiles could never be aligned to the same font size if one was zoomed before the other opened.
  • Code tab keeps your tree/preview split #1250

    Resizing the split between the file tree and the preview in the Code tab now sticks. Previously, switching to another terminal (or any moment the Code tab left the screen, such as a terminal sitting outside a git repository) could silently overwrite the saved split with a garbage value, so coming back — or reloading — brought the panes up at the wrong size.

Internal

  • Drive CI from a coding agent (odu MCP server) #1258

    kolu’s CI runner odu now ships an MCP servernix run .#odu -- mcp, wired into your agent config automatically. A coding agent (Claude Code, Codex, opencode, Gemini CLI) can start a run, snapshot the pipeline, tail a node’s log, rerun just the failed node, and block until the run settles — or the instant a node goes red — all as structured tool calls instead of scraping the terminal. The live pipeline is also a subscribable MCP resource, so notification-aware agents get pushed updates as nodes change.
  • odu's live-attach command is now `odu attach` (was `odu monitor`) #1262

    kolu’s CI runner odu renamed its interactive live-view command from monitor to attach — matching the “a CI runner you attach to” model — and unified it with run’s view: attaching now paints the same recipes×platforms matrix run shows, with a focused-node log pane and r to rerun the lane under the cursor. odu monitor no longer exists; use nix run .#odu -- attach.
  • Turn any @kolu/surface into an MCP server #1270

    The new sibling package @kolu/surface-mcp re-exposes any @kolu/surface spec to an MCP host — serveSurfaceAsMcp maps each cell/stream/event to a subscribable resource and each procedure (plus optional bespoke tools) to a tool under a default-deny expose allowlist, owning the subscribe/teardown lifecycle, the zod→JSON-Schema bridge, and the stdio discipline so nobody hand-writes them twice. It builds on a new core primitive, projectSurface (with surfaceClientRef + deriveCell/deriveStream/deriveEvent), that derives a curated surface B from a live client of surface A — a server that’s a client — so the observer-safe view an agent touches is shaped in surface-land and shared by every face.

// already on master — get these now: nix run github:juspay/kolu

v1.0.0

The first release worth a number. kolu is a terminal workspace built for scale — real xterm.js tiles on an infinite canvas, agent-agnostic, auto-detected, zero setup. Track master for the latest; pin this build with nix run github:juspay/kolu/v1.0.0.

Added

  • Infinite canvas workspace — every terminal is a draggable, resizable tile on a 2D plane. Pan, pinch-zoom, snap-to-grid, and double-click to maximize; the posture persists across reloads.
  • The dock — a two-level (rail / cards) left-edge navigator with per-repo color and agent-state pips: a violet “your turn” disk when an agent needs you, a spinning teal ring while it works, sorted by pure recency.
  • Agent-agnostic by designclaude, codex, opencode, aider, goose, gemini, and whatever ships next week all work the same way; run one once and it surfaces in the worktree-naming flow and the command palette automatically. No registry, no adapters.
  • Command palette (Cmd/Ctrl+K) — search terminals, switch themes, run actions, and drive workspace search across 20+ metadata fields.
  • Dock pings & completion toasts — when a background agent finishes, the dock pulses, a toast names the terminal with a Switch action, and a backgrounded tab gets an OS notification.
  • Git & GitHub, auto-detected — repo, branch, and CWD from OSC 7; live PR merge-state and CI checks on every navigator surface; per-repo hue coding; whole-tree git-status colors in the Code tab.
  • Rich Code tab — syntax-highlighted browsing, rendered Markdown with a source toggle, and sandboxed inline preview of agent-generated .html / .svg / .pdf / image artifacts, all live-reloading.
  • Terminals that keep up — WebGL rendering with canvas fallback, clickable path:line file references, inline images (sixel / iTerm2 / kitty), splits and tabs, and per-terminal font zoom.
  • Mobile — single-tile view with swipe navigation, a two-row soft-key bar for the keys touch keyboards lack, and a bottom-drawer inspector.

Heads-up

  • kolu ships only as a Nix flake — there are no installers. Install Nix, then nix run github:juspay/kolu. The same command updates it; add --refresh to bust the flake cache.
  • A home-manager module runs kolu as a systemd user service on Linux and a launchd agent on macOS.