An open API service indexing awesome lists of open source software.

https://github.com/peters/horizon

GPU-accelerated terminal board that puts all your sessions on an infinite canvas
https://github.com/peters/horizon

ai-agents claude codex developer-tools egui gemeni-cli gpu kilocode-cli opencode rust terminal terminal-emulator

Last synced: 9 days ago
JSON representation

GPU-accelerated terminal board that puts all your sessions on an infinite canvas

Awesome Lists containing this project

README

          





Horizon — Your Terminals, One Canvas


Release
CI
License
Platform


Horizon is a GPU-accelerated terminal board that puts all your sessions

on an infinite canvas. Organize by workspace, launch from presets, quick-nav fast, and never lose a terminal again.


Horizon demo — panning across AI Agents, Dev, and Monitoring workspaces

---

## Why Horizon?

Tabbed terminals hide your work. Tiled terminals box you in. **Horizon gives you a canvas** — an infinite 2D surface where every terminal lives as a panel you can place, resize, and group however you want.

Think of it as a whiteboard for your terminal sessions with a structured workflow on top. Start with color-coded workspaces, launch preset panels, jump with Quick Nav, and fit the active workspace whenever you want a clean overview.

---

## Highlights

### Infinite Canvas
Pan and zoom freely across a boundless workspace surface. Place terminals anywhere. A **minimap** in the corner keeps you oriented — click it to jump.

### Workspaces
Group related panels into **color-coded workspaces**. Auto-arrange with three layout modes — rows, columns, grid — or drag panels freely.

### Full Terminal Emulation
24-bit color, mouse reporting, scrollback, alt-screen, and Kitty keyboard protocol. Powered by the **Alacritty terminal engine** — the same one behind the fastest terminal on the planet.

### AI Agent Panels
First-class **Claude Code**, **Codex**, **OpenCode**, **Gemini CLI**, and **KiloCode** integration. Session persistence and resume work where the underlying agent CLI supports it. A live **usage dashboard** tracks token spend across agents.

### Git Integration
A built-in **git status panel** watches your repo in the background. See changed files, inline diffs, and hunk-level detail — no context switching.

### Smart Detection
**Ctrl+click** a URL to open it. Hover a file path and click to jump to it. Horizon sees what your terminal prints and makes it interactive.

### Remote Hosts
**Ctrl+Shift+H** opens a fast overlay that discovers hosts from SSH config and Tailscale. Search, filter, and connect instantly. Type **user@filter** to override the SSH user. Connected sessions are grouped into a **Remote Sessions** grid workspace.

### Live Settings Editor
Open the config with **Ctrl+Shift+,** — a side panel with **YAML syntax highlighting** and live preview. Every change applies instantly to the canvas behind it.

### Session Persistence
Close Horizon, come back tomorrow. Your workspaces, panel positions, scroll positions, and terminal history are **restored exactly as you left them**.

### Markdown Editor
Drop a `.md` file onto the canvas or create one from the command palette. **Split view** with syntax highlighting and live preview, saved with **Ctrl+Shift+S**.

---

## Install

### Download (fastest)

Grab the latest release from [**Releases**](https://github.com/peters/horizon/releases/latest) — 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.

### Homebrew

Stable releases are available through the `peters/horizon` tap on macOS and Linux x64:

```bash
brew install peters/horizon/horizon
```

If you prefer to add the tap explicitly first:

```bash
brew tap peters/horizon
brew install horizon
```

To update or remove it later:

```bash
brew upgrade horizon
brew uninstall horizon
brew untap peters/horizon
```

### WinGet

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:

```powershell
winget install Peters.Horizon
winget upgrade Peters.Horizon
winget uninstall Peters.Horizon
```

### Snap

Stable releases are also published to the Snap Store on Linux x64 as a classic snap:

```bash
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.

### Build from source

```bash
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.88+**. Linux needs system headers for GPU rendering — see [AGENTS.md](AGENTS.md#prerequisites) for per-distro install commands.

---

## Quick Tour

### Keyboard Shortcuts

Most app shortcuts use **Ctrl+Shift** to avoid conflicts with shell programs (Ctrl+C, Ctrl+K, Ctrl+B, etc.) and OS-level bindings. Canvas zoom keeps the standard **Ctrl/Cmd+0**, **Ctrl/Cmd+Plus**, and **Ctrl/Cmd+Minus** bindings. They are configurable through the `shortcuts:` block in your config file and editable from the built-in settings panel.
Duplicate or overlapping bindings are rejected, including near-conflicts such as `Ctrl+B` and `Ctrl+Shift+B`.

| Shortcut | What it does |
|:---------|:-------------|
| **Ctrl+Shift+K** | Quick-navigate to any workspace |
| **Ctrl+Shift+N** | New terminal panel |
| **Ctrl+Shift+W** | Focus the active workspace at the current zoom |
| **Ctrl+Shift+9** | Fit the active workspace into view |
| **Ctrl+Shift+H** | Open Remote Hosts overlay |
| **Ctrl+Shift+B** | Toggle sidebar |
| **Ctrl+Shift+U** | Toggle HUD |
| **Ctrl+Shift+M** | Toggle minimap |
| **Ctrl+Shift+A** | Align visible attached workspaces into a horizontal row |
| **Ctrl+Shift+,** | Open settings editor |
| **Ctrl+0** | Reset canvas zoom to 100% |
| **Ctrl+Plus** | Zoom canvas in |
| **Ctrl+Minus** | Zoom canvas out |
| **F11** | Fullscreen the active panel |
| **Escape** | Exit active panel fullscreen |
| **Ctrl+Shift+F11** | Toggle window fullscreen |
| **Ctrl+Shift+S** | Save the active Markdown editor |

### Structured Workflow

If you do not want to start by dragging panels around the canvas, use Horizon like this:

1. Create a workspace from the toolbar or with **Ctrl+double-click** on the canvas.
2. Add a terminal from your first preset with **Ctrl+Shift+N**.
3. Jump between workspaces with **Quick Nav** using **Ctrl+Shift+K**.
4. Use **Ctrl+Shift+W** to refocus the current workspace or **Ctrl+Shift+9** to fit it into view.
5. Use the workspace header controls for **Rows**, **Cols**, or **Grid** when you want a structured layout without leaving the canvas.

### Mouse Actions

| Interaction | What it does |
|:------------|:-------------|
| **Middle-mouse drag** | Pan the canvas |
| **Space + Left-click drag** | Pan the canvas |
| **Minimap click-and-drag** | Jump to that area of the canvas |
| **Ctrl+Scroll** | Zoom around the cursor |
| **Ctrl+Click** | Open URL or file path under cursor |
| **Ctrl+double-click** canvas | Create a new workspace |
| **Ctrl+double-click** inside a workspace | Add a new terminal |

On macOS, substitute Cmd for Ctrl.

---

## Configuration

The settings editor writes back to the same config file Horizon loaded. By default that is `~/.horizon/config.yaml`, and `config.yml` is also supported when discovered or passed explicitly. You can define workspaces, panel presets, feature flags, and keyboard shortcuts:

```yaml
shortcuts:
command_palette: Ctrl+Shift+K
new_terminal: Ctrl+Shift+N
focus_active_workspace: Ctrl+Shift+W
fit_active_workspace: Ctrl+Shift+9
open_remote_hosts: Ctrl+Shift+H
toggle_sidebar: Ctrl+Shift+B
toggle_hud: Ctrl+Shift+U
toggle_minimap: Ctrl+Shift+M
align_workspaces_horizontally: Ctrl+Shift+A
toggle_settings: Ctrl+Shift+Comma
zoom_reset: Ctrl+0
zoom_in: Ctrl+Plus
zoom_out: Ctrl+Minus
fullscreen_panel: F11
exit_fullscreen_panel: Escape
fullscreen_window: Ctrl+Shift+F11
save_editor: Ctrl+Shift+S
search: Ctrl+Shift+F

workspaces:
- name: Backend
cwd: ~/projects/api
panels:
- kind: shell
- kind: claude
- kind: open_code
- kind: git_changes

- name: Frontend
cwd: ~/projects/web
panels:
- kind: shell
- kind: shell

presets:
- name: Shell
alias: sh
kind: shell
- name: Claude Code
alias: cc
kind: claude
- name: OpenCode
alias: oc
kind: open_code
- name: Gemini CLI
alias: gm
kind: gemini
- name: KiloCode
alias: kc
kind: kilo_code
- name: Git Changes
alias: gc
kind: git_changes

# Optional: disable the default attention feed
features:
attention_feed: false
```

Use key names like `Plus`, `Minus`, `Comma`, `Escape`, and `F11` in YAML instead of punctuation-only shortcut components such as `Ctrl++`.

---

## Built With

| | |
|:--|:--|
| [**Rust**](https://www.rust-lang.org) | Edition 2024, safe and fast |
| [**eframe / egui**](https://github.com/emilk/egui) | Immediate-mode UI framework |
| [**wgpu**](https://wgpu.rs) | GPU rendering — Vulkan, Metal, DX12, OpenGL |
| [**alacritty_terminal**](https://github.com/alacritty/alacritty) | Battle-tested terminal emulation |
| [**Catppuccin Mocha**](https://catppuccin.com) | Dark color palette |

---

## Contributing

See [**AGENTS.md**](AGENTS.md) for development setup, architecture, coding standards, and CI requirements.
Release instructions live in [**docs/release-flow.md**](docs/release-flow.md).
Manual smoke-test plans live under [**docs/testing**](docs/testing), including the
[**workspace close smoke test**](docs/testing/workspace-close-smoketest-plan.md).

```bash
cargo fmt --all -- --check
cargo test --workspace
cargo clippy --all-targets --all-features -- -D warnings
```

---


MIT License