{"id":47662953,"url":"https://github.com/190km/void","last_synced_at":"2026-04-02T11:42:59.560Z","repository":{"id":346244514,"uuid":"1188858104","full_name":"190km/void","owner":"190km","description":"An infinite canvas for Claude Code, Codex, OpenCode with separate workspaces.","archived":false,"fork":false,"pushed_at":"2026-03-30T22:12:54.000Z","size":29826,"stargazers_count":8,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-30T23:33:05.595Z","etag":null,"topics":["agents","ai","ai-agents","canvas","claude","claude-code","codex","desktop-app","developer-tools","egui","gemini","gpu","infinite-canvas","rust","terminal","terminal-emutalor","vibecoding","wgpu"],"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/190km.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":null,"dco":null,"cla":null}},"created_at":"2026-03-22T17:18:23.000Z","updated_at":"2026-03-30T16:10:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/190km/void","commit_stats":null,"previous_names":["190km/void"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/190km/void","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/190km%2Fvoid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/190km%2Fvoid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/190km%2Fvoid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/190km%2Fvoid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/190km","download_url":"https://codeload.github.com/190km/void/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/190km%2Fvoid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31305754,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"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":["agents","ai","ai-agents","canvas","claude","claude-code","codex","desktop-app","developer-tools","egui","gemini","gpu","infinite-canvas","rust","terminal","terminal-emutalor","vibecoding","wgpu"],"created_at":"2026-04-02T11:42:57.159Z","updated_at":"2026-04-02T11:42:59.555Z","avatar_url":"https://github.com/190km.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Void\n\n![Void](assets/banner.png)\n\n\u003c!--[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Rust](https://img.shields.io/badge/rust-2021_edition-orange)](https://www.rust-lang.org)\n[![Platforms](https://img.shields.io/badge/platforms-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen)](#)\n[![GPU](https://img.shields.io/badge/gpu-wgpu_(Vulkan%2FMetal%2FDX12)-blueviolet)](#)--\u003e\n\n[Void](https://void.sh) is an infinite canvas terminal emulator — GPU-accelerated, cross-platform. No tabs, no splits, no tiling — just an infinite 2D surface where you place terminals anywhere with pan and zoom navigation.\n\n- Infinite 2D canvas where you place terminals anywhere\n- GPU-accelerated 60fps rendering via wgpu (Vulkan, Metal, DX12)\n- Real terminal emulation powered by alacritty_terminal (ANSI/VT100, 256-color, truecolor)\n- Workspaces, command palette, minimap, keyboard-first design\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demo.gif\" alt=\"Void demo\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n## Getting Started\n\nDownload the latest binary for your platform from the [Releases](https://github.com/190km/void/releases) page — no build step required.\n\n\u003e Built **entirely in Rust**. Zero web technologies. No Electron, no WebView, no JavaScript runtime. Native performance via wgpu.\n\n## How It Works\n\n```\n  You ──► Infinite Canvas (pan/zoom) ──► Terminal Panels (drag/resize anywhere)\n              GPU-rendered (wgpu)              ↕\n                                          alacritty_terminal + portable-pty\n                                              ↕\n                                          Real shell (bash, zsh, powershell, ...)\n```\n\nEach terminal panel is an independent PTY process rendered onto the canvas via the GPU. Panels can be freely dragged, resized, and arranged in any spatial layout you want. Zoom out to see everything, zoom in to focus.\n\n## Features\n\n| | |\n|---|---|\n| **Infinite Canvas** | Pan, zoom, and place terminals anywhere on a boundless 2D surface |\n| **GPU Accelerated** | 60fps rendering via wgpu — Vulkan, Metal, and DX12 backends |\n| **Real Terminal Emulation** | Powered by alacritty_terminal — full ANSI/VT100, 256-color, truecolor |\n| **Workspaces** | Independent canvas views for different contexts, each with their own layout |\n| **Command Palette** | `Ctrl+Shift+P` — fuzzy search across all actions |\n| **Minimap** | Bird's-eye overview of your entire terminal layout |\n| **Keyboard-First** | Every action reachable without a mouse |\n| **Cross-Platform** | Windows, Linux, macOS |\n\n## Keyboard Shortcuts\n\n| Action | Shortcut |\n|---|---|\n| New terminal | `Ctrl+Shift+T` |\n| Close terminal | `Ctrl+Shift+W` |\n| Command palette | `Ctrl+Shift+P` |\n| Rename terminal | `F2` |\n| Focus next / prev | `Ctrl+Shift+]` / `[` |\n| Toggle sidebar | `Ctrl+B` |\n| Toggle minimap | `Ctrl+M` |\n| Toggle grid | `Ctrl+G` |\n| Zoom in / out | `Ctrl+=` / `-` |\n| Reset zoom | `Ctrl+0` |\n| Fit all terminals | `Ctrl+Shift+0` |\n| Pan canvas | Middle-click drag / Scroll |\n| Zoom | `Ctrl+Scroll` / Trackpad pinch |\n\n## Architecture\n\n```\nsrc/\n├── app.rs              # main application loop\n├── canvas/             # pan, zoom, viewport math, minimap, grid\n├── terminal/           # panel rendering, PTY management, input handling\n├── sidebar/            # workspace list, session list, quick actions\n├── command_palette/    # fuzzy search, command registry\n├── state/              # workspace \u0026 panel state management\n├── theme/              # color palette, fonts\n├── config/             # schema, defaults, hot-reload\n├── shortcuts/          # keybinding system\n└── utils/              # ids, platform detection\n```\n\n**Stack:** [eframe](https://github.com/emilk/egui/tree/master/crates/eframe) + [egui](https://github.com/emilk/egui) + [wgpu](https://github.com/gfx-rs/wgpu) + [alacritty_terminal](https://github.com/alacritty/alacritty) + [portable-pty](https://github.com/wez/wezterm/tree/main/pty)\n\n## Roadmap\n\n- [x] Infinite canvas with pan/zoom\n- [x] GPU-accelerated rendering (wgpu)\n- [x] Real terminal emulation (alacritty_terminal + portable-pty)\n- [x] Multiple terminals with independent PTY processes\n- [x] Full ANSI color support (16, 256, truecolor)\n- [x] Workspaces with viewport persistence\n- [x] Command palette with fuzzy matching\n- [x] Minimap navigation\n- [x] Panel drag, resize, close, rename, focus cycling\n- [x] Layout persistence (save/restore on quit)\n- [x] Snap guides for panel alignment\n- [x] Smart panel positioning (gap-filling algorithm)\n- [x] Resize snap with virtual accumulation (escape snap zones naturally)\n- [x] Terminal input: Ctrl+Backspace, Ctrl+Delete, modifier-aware F-keys\n- [x] Extensible panel system (CanvasPanel enum)\n- [x] Canvas configuration constants (centralized tuning)\n- [x] Auto-update checker with silent install\n- [ ] Session restore (reopen terminals with CWD + scrollback)\n- [ ] Configuration hot-reload (TOML)\n- [ ] Auto-layout engine (tidy, arrange)\n- [ ] Built-in theme engine + custom themes\n- [ ] Embedded webviews (CEF/Servo offscreen rendering)\n- [ ] Plugin system\n\n\n## Contributing\n\nVoid is open source and contributions are welcome.\n\n1. Clone the repository\n\n```bash\ngit clone https://github.com/190km/void.git\ncd void\n```\n\n2. Make sure you have the Rust toolchain installed ([rustup.rs](https://rustup.rs))\n\n3. Run in dev mode and hack away\n\n```bash\ncargo run\n```\n\n4. Check before submitting\n\n```bash\ncargo clippy --all-targets --all-features -- -D warnings\ncargo fmt --check\ncargo test\n```\n\nSee [RELEASING.md](RELEASING.md) for the Linux, macOS, and Windows release flow.\n\nIf you find a bug or have a feature request, [open an issue](https://github.com/190km/void/issues).\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/?repos=190km%2Fvoid\u0026type=timeline\u0026legend=top-left\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/image?repos=190km/void\u0026type=timeline\u0026theme=dark\u0026legend=top-left\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/image?repos=190km/void\u0026type=timeline\u0026legend=top-left\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/image?repos=190km/void\u0026type=timeline\u0026legend=top-left\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n## License\n\n[MIT](LICENSE) — 190km\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F190km%2Fvoid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F190km%2Fvoid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F190km%2Fvoid/lists"}