{"id":47591045,"url":"https://github.com/peters/horizon","last_synced_at":"2026-04-01T17:26:25.461Z","repository":{"id":345086888,"uuid":"1182484412","full_name":"peters/horizon","owner":"peters","description":"GPU-accelerated terminal board that puts all your sessions on an infinite canvas","archived":false,"fork":false,"pushed_at":"2026-03-25T11:42:29.000Z","size":1331,"stargazers_count":410,"open_issues_count":2,"forks_count":19,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-25T12:08:11.223Z","etag":null,"topics":["ai-agents","claude","codex","developer-tools","egui","gemeni-cli","gpu","kilocode-cli","opencode","rust","terminal","terminal-emulator"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-15T15:30:53.000Z","updated_at":"2026-03-25T11:59:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/peters/horizon","commit_stats":null,"previous_names":["peters/horizon"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/peters/horizon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peters%2Fhorizon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peters%2Fhorizon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peters%2Fhorizon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peters%2Fhorizon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peters","download_url":"https://codeload.github.com/peters/horizon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peters%2Fhorizon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude","codex","developer-tools","egui","gemeni-cli","gpu","kilocode-cli","opencode","rust","terminal","terminal-emulator"],"created_at":"2026-04-01T17:26:24.820Z","updated_at":"2026-04-01T17:26:25.447Z","avatar_url":"https://github.com/peters.png","language":"Rust","readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/hero-banner.svg\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/hero-banner.svg\" /\u003e\n    \u003cimg src=\"assets/hero-banner.svg\" alt=\"Horizon — Your Terminals, One Canvas\" width=\"100%\" /\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/peters/horizon/releases/latest\"\u003e\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/peters/horizon?style=flat-square\u0026color=74a2f7\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/peters/horizon/actions/workflows/ci.yml\"\u003e\u003cimg alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/peters/horizon/ci.yml?branch=main\u0026style=flat-square\u0026label=CI\" /\u003e\u003c/a\u003e\n  \u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-MIT-a6e3a1?style=flat-square\" /\u003e\n  \u003cimg alt=\"Platform\" src=\"https://img.shields.io/badge/Linux%20%C2%B7%20macOS%20%C2%B7%20Windows-cba6f7?style=flat-square\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eHorizon\u003c/b\u003e is a GPU-accelerated terminal board that puts all your sessions\u003cbr/\u003e\n  on an infinite canvas. Organize by workspace, launch from presets, quick-nav fast, and never lose a terminal again.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demo.gif\" alt=\"Horizon demo — panning across AI Agents, Dev, and Monitoring workspaces\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Why Horizon?\n\nTabbed 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.\n\nThink 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.\n\n---\n\n## Highlights\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### Infinite Canvas\nPan and zoom freely across a boundless workspace surface. Place terminals anywhere. A **minimap** in the corner keeps you oriented — click it to jump.\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### Workspaces\nGroup related panels into **color-coded workspaces**. Auto-arrange with three layout modes — rows, columns, grid — or drag panels freely.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n### Full Terminal Emulation\n24-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.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n### AI Agent Panels\nFirst-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.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n### Git Integration\nA built-in **git status panel** watches your repo in the background. See changed files, inline diffs, and hunk-level detail — no context switching.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n### Smart Detection\n**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.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n### Remote Hosts\n**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.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n### Live Settings Editor\nOpen the config with **Ctrl+Shift+,** — a side panel with **YAML syntax highlighting** and live preview. Every change applies instantly to the canvas behind it.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n### Session Persistence\nClose Horizon, come back tomorrow. Your workspaces, panel positions, scroll positions, and terminal history are **restored exactly as you left them**.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\n### Markdown Editor\nDrop 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**.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Install\n\n### Download (fastest)\n\nGrab the latest release from [**Releases**](https://github.com/peters/horizon/releases/latest) — no dependencies needed.\n\n| Platform | Raw binary | Surge installer | |\n|:---------|:-----------|:----------------|:-|\n| **Linux** x64 | `horizon-linux-x64.tar.gz` | `horizon-installer-linux-x64.bin` | Extract and run, or use the installer for managed stable updates |\n| **macOS** arm64 | `horizon-osx-arm64.tar.gz` | `horizon-installer-osx-arm64.bin` | Extract and run, or use the installer for managed stable updates |\n| **macOS** x64 | `horizon-osx-x64.tar.gz` | `horizon-installer-osx-x64.bin` | Extract and run, or use the installer for managed stable updates |\n| **Windows** x64 | `horizon-windows-x64.exe` | `horizon-installer-win-x64.exe` | Run the raw binary directly, or use the installer for managed stable updates |\n\nHomebrew 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.\n\n### Homebrew\n\nStable releases are available through the `peters/horizon` tap on macOS and Linux x64:\n\n```bash\nbrew install peters/horizon/horizon\n```\n\nIf you prefer to add the tap explicitly first:\n\n```bash\nbrew tap peters/horizon\nbrew install horizon\n```\n\nTo update or remove it later:\n\n```bash\nbrew upgrade horizon\nbrew uninstall horizon\nbrew untap peters/horizon\n```\n\n### WinGet\n\nStable releases are submitted to the official Windows Package Manager catalog. After a release's manifest PR is approved, install, upgrade, or remove Horizon with:\n\n```powershell\nwinget install Peters.Horizon\nwinget upgrade Peters.Horizon\nwinget uninstall Peters.Horizon\n```\n\n### Snap\n\nStable releases are also published to the Snap Store on Linux x64 as a classic snap:\n\n```bash\nsudo snap install horizon-ui --classic\nsnap refresh horizon-ui\nsnap remove horizon-ui\n```\n\nClassic 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.\n\n### Build from source\n\n```bash\ngit clone https://github.com/peters/horizon.git\ncd horizon\ngit lfs install\ngit lfs pull\ncargo run --release\n```\n\n\u003e 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.\n\n---\n\n## Quick Tour\n\n### Keyboard Shortcuts\n\nMost 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.\nDuplicate or overlapping bindings are rejected, including near-conflicts such as `Ctrl+B` and `Ctrl+Shift+B`.\n\n| Shortcut | What it does |\n|:---------|:-------------|\n| **Ctrl+Shift+K** | Quick-navigate to any workspace |\n| **Ctrl+Shift+N** | New terminal panel |\n| **Ctrl+Shift+W** | Focus the active workspace at the current zoom |\n| **Ctrl+Shift+9** | Fit the active workspace into view |\n| **Ctrl+Shift+H** | Open Remote Hosts overlay |\n| **Ctrl+Shift+B** | Toggle sidebar |\n| **Ctrl+Shift+U** | Toggle HUD |\n| **Ctrl+Shift+M** | Toggle minimap |\n| **Ctrl+Shift+A** | Align visible attached workspaces into a horizontal row |\n| **Ctrl+Shift+,** | Open settings editor |\n| **Ctrl+0** | Reset canvas zoom to 100% |\n| **Ctrl+Plus** | Zoom canvas in |\n| **Ctrl+Minus** | Zoom canvas out |\n| **F11** | Fullscreen the active panel |\n| **Escape** | Exit active panel fullscreen |\n| **Ctrl+Shift+F11** | Toggle window fullscreen |\n| **Ctrl+Shift+S** | Save the active Markdown editor |\n\n### Structured Workflow\n\nIf you do not want to start by dragging panels around the canvas, use Horizon like this:\n\n1. Create a workspace from the toolbar or with **Ctrl+double-click** on the canvas.\n2. Add a terminal from your first preset with **Ctrl+Shift+N**.\n3. Jump between workspaces with **Quick Nav** using **Ctrl+Shift+K**.\n4. Use **Ctrl+Shift+W** to refocus the current workspace or **Ctrl+Shift+9** to fit it into view.\n5. Use the workspace header controls for **Rows**, **Cols**, or **Grid** when you want a structured layout without leaving the canvas.\n\n### Mouse Actions\n\n| Interaction | What it does |\n|:------------|:-------------|\n| **Middle-mouse drag** | Pan the canvas |\n| **Space + Left-click drag** | Pan the canvas |\n| **Minimap click-and-drag** | Jump to that area of the canvas |\n| **Ctrl+Scroll** | Zoom around the cursor |\n| **Ctrl+Click** | Open URL or file path under cursor |\n| **Ctrl+double-click** canvas | Create a new workspace |\n| **Ctrl+double-click** inside a workspace | Add a new terminal |\n\n\u003csub\u003eOn macOS, substitute Cmd for Ctrl.\u003c/sub\u003e\n\n---\n\n## Configuration\n\nThe 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:\n\n```yaml\nshortcuts:\n  command_palette: Ctrl+Shift+K\n  new_terminal: Ctrl+Shift+N\n  focus_active_workspace: Ctrl+Shift+W\n  fit_active_workspace: Ctrl+Shift+9\n  open_remote_hosts: Ctrl+Shift+H\n  toggle_sidebar: Ctrl+Shift+B\n  toggle_hud: Ctrl+Shift+U\n  toggle_minimap: Ctrl+Shift+M\n  align_workspaces_horizontally: Ctrl+Shift+A\n  toggle_settings: Ctrl+Shift+Comma\n  zoom_reset: Ctrl+0\n  zoom_in: Ctrl+Plus\n  zoom_out: Ctrl+Minus\n  fullscreen_panel: F11\n  exit_fullscreen_panel: Escape\n  fullscreen_window: Ctrl+Shift+F11\n  save_editor: Ctrl+Shift+S\n  search: Ctrl+Shift+F\n\nworkspaces:\n  - name: Backend\n    cwd: ~/projects/api\n    panels:\n      - kind: shell\n      - kind: claude\n      - kind: open_code\n      - kind: git_changes\n\n  - name: Frontend\n    cwd: ~/projects/web\n    panels:\n      - kind: shell\n      - kind: shell\n\npresets:\n  - name: Shell\n    alias: sh\n    kind: shell\n  - name: Claude Code\n    alias: cc\n    kind: claude\n  - name: OpenCode\n    alias: oc\n    kind: open_code\n  - name: Gemini CLI\n    alias: gm\n    kind: gemini\n  - name: KiloCode\n    alias: kc\n    kind: kilo_code\n  - name: Git Changes\n    alias: gc\n    kind: git_changes\n\n# Optional: disable the default attention feed\nfeatures:\n  attention_feed: false\n```\n\nUse key names like `Plus`, `Minus`, `Comma`, `Escape`, and `F11` in YAML instead of punctuation-only shortcut components such as `Ctrl++`.\n\n---\n\n## Built With\n\n| | |\n|:--|:--|\n| [**Rust**](https://www.rust-lang.org) | Edition 2024, safe and fast |\n| [**eframe / egui**](https://github.com/emilk/egui) | Immediate-mode UI framework |\n| [**wgpu**](https://wgpu.rs) | GPU rendering — Vulkan, Metal, DX12, OpenGL |\n| [**alacritty_terminal**](https://github.com/alacritty/alacritty) | Battle-tested terminal emulation |\n| [**Catppuccin Mocha**](https://catppuccin.com) | Dark color palette |\n\n---\n\n## Contributing\n\nSee [**AGENTS.md**](AGENTS.md) for development setup, architecture, coding standards, and CI requirements.\nRelease instructions live in [**docs/release-flow.md**](docs/release-flow.md).\nManual smoke-test plans live under [**docs/testing**](docs/testing), including the\n[**workspace close smoke test**](docs/testing/workspace-close-smoketest-plan.md).\n\n```bash\ncargo fmt --all -- --check\ncargo test --workspace\ncargo clippy --all-targets --all-features -- -D warnings\n```\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eMIT License\u003c/sub\u003e\n\u003c/p\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeters%2Fhorizon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeters%2Fhorizon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeters%2Fhorizon/lists"}