AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
MCP verified MIT Self-run

Horizon

mcp-peters-horizon · by peters

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

No reviews yet
0 installs
24 views
0.0% view→install

Install

$ agentstack add mcp-peters-horizon

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-peters-horizon)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
25d ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Horizon? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Horizon is a GPU-accelerated terminal board that puts all your sessions on an infinite canvas. Workspaces group related panels. Presets launch them. The command palette jumps you there. Close the app — the board is still there tomorrow.

The model · Five minutes · Highlights · Install · Shortcuts · Config · Browser · Speech


Why Horizon?

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.


The model

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 | Middle-mouse or Space+drag to pan. 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.

Panel kinds

| 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 |


Five minutes on the canvas

You do not need a config file to start. Launch Horizon, then:

  1. Ctrl+double-click empty canvas. A preset list appears. Pick Shell (or Grok, Claude, Browser, …). Shell and agent presets then ask for a working directory — that becomes the workspace cwd, and the first panel lands there.
  2. Press Ctrl+Shift+N for another panel of the first preset (Shell by default), or Ctrl+Shift+K and type a preset alias (gb, cc, web, gc).
  3. On the workspace header, click Rows, Cols, or Grid when you want structure, or Default to drag freely.
  4. Press Ctrl+Shift+9 to fit the workspace into view. Press Ctrl+Shift+W to jump back to it without changing zoom.
  5. Press Ctrl+Shift+K again. Type a workspace name, a panel title, @ for panels only, or > for presets and actions.
  6. Close Horizon. Reopen it tomorrow — the session, layout, canvas pan/zoom, and terminal history are still there.

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.


Highlights

Infinite Canvas

Pan and zoom freely. Place panels anywhere. A minimap in the corner keeps you oriented — click or drag it to jump.

Workspaces

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.

Full Terminal Emulation

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.

Command Palette

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.

AI Agent Panels

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.

Live Browser

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.

Git Integration

A built-in git status panel watches the workspace repo. See changed files, inline diffs, and hunk-level detail without leaving the canvas.

Smart Detection

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.

Remote Hosts

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.

Live Settings Editor

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.

Session Persistence

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 after restore.

Markdown Editor

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.

Speech Input

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.

Audited Browser Automation

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.


Install

Download (fastest)

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.

Homebrew

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

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:

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:

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

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](AGENTS.md#prerequisites) for per-distro install commands.


Keyboard and mouse

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 | |:---------|:-------------| | Ctrl+Shift+K | Command palette — jump to a workspace, panel, preset, or action | | Ctrl+Shift+N | New panel from the first preset | | 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+J | Open the sessions picker | | 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+Shift+F | Focus the terminal search bar | | 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 | | Ctrl+Shift+C | Copy the current terminal selection | | Ctrl+Shift+V | Paste into the focused terminal | | Ctrl+Shift+R | Reconnect the focused disconnected SSH panel |

| 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 | | Click in a mouse-reporting TUI | Deliver the click to the app (Grok, vim, less, …) | | Shift+Click/drag | Select terminal text while the app has mouse reporting | | Click an OSC 8 hyperlink | Open the link in the default handler | | Ctrl+Click | Open URL, file path, or hyperlink under cursor | | Ctrl+double-click canvas | Open the preset picker (creates a workspace and its first panel) | | Ctrl+double-click inside a workspace | Open the preset picker to add a panel |

On macOS, substitute Cmd for Ctrl. Copy and paste use the standard Cmd+C / Cmd+V bindings, and on Windows you can also use Ctrl+Insert / Shift+Insert. The SSH reconnect shortcut is contextual and is disabled if another global shortcut overlaps with Ctrl+Shift+R.


Configuration

The settings editor writes back to the same file Horizon loaded. By default that is ~/.horizon/config.yaml (config.yml is also accepted). You can seed workspaces, panel presets, feature flags, and shortcuts.

Workspace templates use terminals: (each entry needs a name). Unknown keys are ignored, so a panels: block will not create anything.

appearance:
  theme: auto # auto, light, or dark

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_sessions: Ctrl+Shift+J
  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
    terminals:
      - name: Shell
        kind: shell
      - name: Grok
        kind: grok
      - name: App
        kind: browser
        command: http://127.0.0.1:3000
      - name: Git
        kind: git_changes

  - name: Frontend
    cwd: ~/projects/web
    terminals:
      - name: Shell
        kind: shell
      - name: Claude
        kind: claude

presets:
  - name: Shell
    alias: sh
    kind: shell
  - name: Grok
    alias: gb
    kind: grok
  - name: Claude Code
    alias: cc
    kind: claude
    args:
      - --permission-mode
      - auto
  - name: Codex
    alias: cx
    kind: codex
    args:
      - --no-alt-screen
  - name: OpenCode
    alias: oc
    kind: open_code
  - name: Gemini CLI
    alias: gm
    kind: gemini
  - name: KiloCode
    alias: kc
    kind: kilo_code
  - name: Pi
    alias: pi
    kind: pi
  - name: Browser
    alias: web
    kind: browser
  - name: Git Changes
    alias: gc
    kind: git_changes
  - name: Markdown
    alias: md
    kind: editor
  - name: Usage
    alias: u
    kind: usage

features:
  # Optional: disable the default attention feed
  attention_feed: false
  # Optional: align attached workspaces whenever a session loads, including startup
  organize_workspaces_on_session_load: true
  # Optional: collapse inactive workspaces in the sidebar
  sidebar_accordion: true

features.organize_workspaces_on_session_load defaults to false. When enabled, Horizon performs the same horizontal alignment as Ctrl+Shift+A whenever a restored session is ready, both at startup and after an in-app session switch; detached workspaces are unchanged. A short Preparing session view… overlay blocks root-window input while restored window geometry settles. The default-disabled path does not show this overlay. Changing the setting in the live editor takes effect when a session is next loaded.

features.sidebar_accordion defaults to false. When enabled, only the active workspace lists panels in the sidebar; other workspaces collapse to a name, accent, and panel count. Enable it from Settings → General → Features or by setting the flag in config.yaml. Like other General feature toggles, the Settings editor applies the change immediately as a live preview; save to persist it, or close/revert without saving to restore the previous value.

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

Fresh configs already ship the agent, browser, git, markdown, and usage presets above. Existing configs gain missing defaults through migration (Grok, Pi, Browser, and the others) without overwriting presets you renamed.

Launch flags

| Flag | What it does | |:-----|:-------------| | --config / -c | Load an explicit config file | | `--epheme

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.