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
- Host: GitHub
- URL: https://github.com/peters/horizon
- Owner: peters
- License: mit
- Created: 2026-03-15T15:30:53.000Z (26 days ago)
- Default Branch: main
- Last Pushed: 2026-03-25T11:42:29.000Z (16 days ago)
- Last Synced: 2026-03-25T12:08:11.223Z (16 days ago)
- Topics: ai-agents, claude, codex, developer-tools, egui, gemeni-cli, gpu, kilocode-cli, opencode, rust, terminal, terminal-emulator
- Language: Rust
- Homepage:
- Size: 1.27 MB
- Stars: 410
- Watchers: 0
- Forks: 19
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
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.
---
## 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