GPU-accelerated terminal board that puts all your sessions on an infinite canvas
$ npx -y skills add peters/horizon --agent claude-code
Repo: peters/horizon
What's inside
Tabbed terminals hide your work. Tiled terminals box you in. Horizon gives you a canvas — an infinite 2D surface where every terminal, agent, browser, and editor lives as a panel you can place, resize, and group.
Think of it as a whiteboard for live sessions, with a structured workflow on top: color-coded workspaces, preset panels, a command palette, and fit-to-workspace whenever you want a clean overview.
Horizon has five nouns. Everything else is a shortcut, a preset, or a panel kind.
| Noun | What it is | How you use it |
|---|---|---|
| Canvas | The infinite 2D surface | Drag empty canvas or swipe with two fingers to pan. Pinch or Ctrl+scroll to zoom. Minimap to jump. |
| Workspace | A color-coded cluster with a shared working directory | Ctrl+double-click the canvas and pick a preset, or click New in the sidebar. Arrange with Default (free), Rows, Cols, or Grid. Detach it to its own window. |
| Panel | One live surface inside a workspace | Shell, SSH, coding agent, browser, markdown, git, or usage. |
| Preset | A named template for a new panel | Command palette, Ctrl+double-click, or Ctrl+Shift+N (first preset). |
| Session | A saved board | Close Horizon and come back. Ctrl+Shift+J switches between saved boards. |
A typical board looks like this:
Session
└── Canvas
├── Workspace "Backend" cwd: ~/projects/api
│ ├── Shell
│ ├── Grok
│ ├── Browser → http://127.0.0.1:3000
│ └── Git Changes
└── Workspace "Frontend" cwd: ~/projects/web
├── Shell
└── Claude
Workspaces stay visible. There are no hidden tabs. If something is off-screen, pan, zoom, fit, or search — do not hunt through a tab strip.
| Kind | What you get |
|---|---|
shell | Login shell in the workspace directory |
ssh | Remote shell — usually from the Remote Hosts overlay |
grok · claude · codex · open_code · gemini · kilo_code · pi | First-class coding-agent TUIs, with session resume where the CLI supports it |
browser | Live Chromium, Firefox, or Safari on the canvas, shared with agents |
editor | Markdown split view (syntax + preview) |
git_changes | Changed files, diffs, and hunks for the workspace repo |
usage | Token spend across agent panels |
command | Run an arbitrary command as a panel |
You do not need a config file to start. Launch Horizon, then:
gb, cc, web, gc).@ for panels only, or > for presets and actions.Once that loop is familiar, the rest is optional: New in the sidebar for an empty workspace, Ctrl+Shift+H for SSH/Tailscale hosts, the workspace Detach control for a dedicated window, a Browser panel for a live page, or Settings (Ctrl+Shift+,) to edit ~/.horizon/config.yaml with the canvas still visible behind it.
Pan and zoom freely. Place panels anywhere. A minimap in the corner keeps you oriented — click or drag it to jump.
Group related panels into color-coded workspaces. Auto-arrange with rows, columns, or grid — or drag freely. Detach a workspace into its own OS window.
24-bit color, mouse reporting, scrollback, alt-screen, and Kitty keyboard protocol. Powered by the Alacritty terminal engine. Click a TUI (Grok, vim, less, …) and the click goes to the app; Shift+click still selects text.
Ctrl+Shift+K searches workspaces, panels, presets, and actions. Prefix > for presets and actions, @ for panels only. Selecting a panel pans the canvas to it.
First-class Grok, Claude Code, Codex, OpenCode, Gemini CLI, KiloCode, and Pi integration. Session persistence and resume work where the CLI supports it. Title bars show a working indicator and, when a session is bound, its id. A live usage dashboard tracks token spend.
Run Chromium, Firefox, or Safari automation on the canvas. You and an agent share the same live page — navigate, inspect, click, fill, capture network traffic, then hand control back and forth.
A built-in git status panel watches the workspace repo. See changed files, inline diffs, and hunk-level detail without leaving the canvas.
Click an OSC 8 hyperlink to open it. Ctrl+click a URL or file path under the cursor. Horizon sees what the terminal prints and makes it interactive.
Ctrl+Shift+H discovers hosts from SSH config and Tailscale. Search, filter, and connect. Type user@filter to override the SSH user. Connected sessions land in a Remote Sessions grid workspace.
Ctrl+Shift+, opens the config as a side panel with YAML highlighting and live preview. Toggle light / dark / auto themes; changes apply to the canvas behind the editor.
Close Horizon, come back tomorrow. Sessions, panel layouts, canvas pan/zoom, and terminal history restore as you left them. Ctrl+Shift+J switches boards. An opt-in setting can line attached workspaces into a horizontal row in sidebar order after restore.
Drop a .md file onto the canvas or create one from the palette. Split view with syntax highlighting and live preview, saved with Ctrl+Shift+S.
Opt-in, on-device dictation into terminals and browser pages. Hold a push-to-talk key (default F9) or use the title-bar mic. Nothing leaves the machine.
Agents discover one MCP browser contract automatically. Every action is correlated in a redacted audit trail. The horizon-browser CLI runs prompt jobs and repeatable JSON plans.
Grab the latest release from Releases — no dependencies needed.
| Platform | Raw binary | Surge installer | |
|---|---|---|---|
| Linux x64 | horizon-linux-x64.tar.gz | horizon-installer-linux-x64.bin | Extract and run, or use the installer for managed stable updates |
| macOS arm64 | horizon-osx-arm64.tar.gz | horizon-installer-osx-arm64.bin | Extract and run, or use the installer for managed stable updates |
| macOS x64 | horizon-osx-x64.tar.gz | horizon-installer-osx-x64.bin | Extract and run, or use the installer for managed stable updates |
| Windows x64 | horizon-windows-x64.exe | horizon-installer-win-x64.exe | Run the raw binary directly, or use the installer for managed stable updates |
Homebrew and other package-manager installs keep using the package manager's own upgrade flow. Horizon only offers the in-app update prompt for installs created by the Surge installer.
Stable releases are available through the peters/horizon tap on macOS and Linux x64:
brew install peters/horizon/horizon
If you prefer to add the tap explicitly first:
brew tap peters/horizon
brew install horizon
To update or remove it later:
brew upgrade horizon
brew uninstall horizon
brew untap peters/horizon
Stable releases are submitted to the official Windows Package Manager catalog. After a release's manifest PR is approved, install, upgrade, or remove Horizon with:
winget install Peters.Horizon
winget upgrade Peters.Horizon
winget uninstall Peters.Horizon
Stable releases are also published to the Snap Store on Linux x64 as a classic snap:
sudo snap install horizon-ui --classic
snap refresh horizon-ui
snap remove horizon-ui
Classic confinement is intentional. Horizon launches host shells and host tools such as ssh, git, xdg-open, pgrep, lsof, and optional tailscale helpers, so a strict sandbox would compromise core workflows.
git clone https://github.com/peters/horizon.git
cd horizon
git lfs install
git lfs pull
cargo run --release
Requires Git LFS for bundled assets and Rust 1.95+. Linux needs system headers for GPU rendering — see AGENTS.md for per-distro install commands.
The build checks required embedded fonts and stops if one is missing or still a Git LFS pointer. Run git lfs install and git lfs pull from the repository root, then rebuild. If a font is still missing, restore it from a complete checkout with LFS assets; source archives must also contain the hydrated fonts.
Most app shortcuts use Ctrl+Shift so they do not steal shell chords (Ctrl+C, Ctrl+K, Ctrl+B, …) or OS bindings. Canvas zoom keeps Ctrl/Cmd+0, Ctrl/Cmd+Plus, and Ctrl/Cmd+Minus. Bindings live in the shortcuts: block and in Settings. Duplicate or overlapping bindings are rejected, including near-conflicts such as Ctrl+B and Ctrl+Shift+B.
| Shortcut | What it does |
|---|
FAQ
horizon is a Claude Code plugin with 4 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes horizon-browser, horizon-device, horizon-notify. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it