{"id":47599306,"url":"https://github.com/indent-com/blit","last_synced_at":"2026-04-19T21:10:39.254Z","repository":{"id":350514427,"uuid":"1204363885","full_name":"indent-com/blit","owner":"indent-com","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-17T18:59:17.000Z","size":2711,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-17T19:16:14.079Z","etag":null,"topics":["ai","terminal","web"],"latest_commit_sha":null,"homepage":"https://blit.sh","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/indent-com.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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-04-08T00:11:04.000Z","updated_at":"2026-04-17T18:18:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/indent-com/blit","commit_stats":null,"previous_names":["indent-com/blit"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/indent-com/blit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indent-com%2Fblit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indent-com%2Fblit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indent-com%2Fblit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indent-com%2Fblit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indent-com","download_url":"https://codeload.github.com/indent-com/blit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indent-com%2Fblit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32022682,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","terminal","web"],"created_at":"2026-04-01T18:37:14.299Z","updated_at":"2026-04-19T21:10:39.239Z","avatar_url":"https://github.com/indent-com.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# blit\n\nTerminal multiplexer and experimental Wayland compositor for browsers and AI agents. Nothing to configure, no required dependencies.\n\nWe publish a [computer agent skill](https://install.blit.sh/SKILL.md).\n\nTry it now — no install needed:\n\n```bash\ndocker run --rm grab/blit-demo\n```\n\nOr install and run locally:\n\n```bash\ncurl -sf https://install.blit.sh | sh\nblit open # opens a browser\n```\n\nShare a terminal over WebRTC:\n\n```bash\nblit share # prints a URL anyone can open\n```\n\nManage named remotes and connect to them:\n\n```bash\nblit remote add rabbit ssh:rabbit          # save a named remote\nblit remote add prod ssh:alice@prod.co     # another one\nblit remote list                           # show all remotes\nblit remote set-default rabbit             # make rabbit the default\n\nblit open                                  # local + all configured remotes\nblit terminal list                         # lists terminals on rabbit\nblit --on prod terminal list               # one-off override\nblit --on ssh:newhost terminal list        # full URI also works\n```\n\nThe default remote is stored in `~/.config/blit/blit.conf` as `blit.target = rabbit`\nand can also be set via the `BLIT_TARGET` environment variable. Named remotes\nare stored in `~/.config/blit/blit.remotes` (mode 0600). `blit open` reads this\nfile and shows all remotes in the browser's Remotes dialog (Cmd+K). SSH remotes\nare auto-installed on first connection.\n\nControl terminals programmatically:\n\n```bash\nblit terminal start htop # start a terminal, print its ID\nblit terminal show 1     # dump current terminal text\nblit terminal send 1 q   # send keystrokes\n```\n\nRun GUI apps — on Linux, every terminal includes an experimental headless Wayland compositor:\n\n```bash\nblit terminal start foot    # launch a Wayland terminal emulator\nblit surface list           # list graphical windows\nblit surface capture 1      # screenshot a surface\nblit surface click 1 100 50 # click at (x, y)\nblit surface type 1 \"hello{Return}\" # type into a GUI window\n```\n\nThe server auto-starts when needed.\n\n## Supported platforms\n\n| Platform | Arch          | Wayland compositor | Notes                 |\n| -------- | ------------- | ------------------ | --------------------- |\n| Linux    | x86_64, arm64 | Yes                | Full features         |\n| macOS    | arm64         | No                 | PTY multiplexing only |\n| Windows  | x86_64        | No                 | PTY multiplexing only |\n\nSSH remotes are auto-installed on first connection. Requirements on the remote:\n`curl` or `wget`, CA certificates, and a supported OS/arch.\n\nThe embedded SSH client authenticates via ssh-agent (`SSH_AUTH_SOCK`) or key files\n(`~/.ssh/id_{ed25519,ecdsa,rsa}`), and resolves `~/.ssh/config` for Hostname,\nUser, Port, and IdentityFile.\n\n## Install\n\n```bash\ncurl -sf https://install.blit.sh | sh\n```\n\n### Windows (PowerShell)\n\n```powershell\nirm https://install.blit.sh/install.ps1 | iex\n```\n\nThis downloads `blit.exe` to `%LOCALAPPDATA%\\blit\\bin` and adds it to your user `PATH`. Set `BLIT_INSTALL_DIR` to override the install location on Windows.\n\n## How it works\n\n`blit` hosts PTYs and tracks full parsed terminal state. For each connected browser it computes a binary diff against what that browser last saw and sends only the delta — LZ4-compressed, with scrolling encoded as copy-rect operations. WebGL-rendered in the browser.\n\nOn Linux, every blit server includes an experimental headless Wayland compositor shared by all terminals. GUI applications launched inside any terminal (anything that speaks the Wayland protocol — terminal emulators, browsers, editors, media players) automatically connect to it. Surfaces are captured, encoded as H.264 or AV1 video, and streamed to connected browsers in real time. No X server, no display, no GPU required — rendering uses GPU compositing (Vulkan via dlopen) when available, with a CPU software fallback. Encoding uses openh264/rav1e (with optional NVENC or VA-API hardware acceleration on Linux). The compositor is available on Linux only.\n\nEach client is paced independently based on render metrics it reports back: display rate, frame apply time, backlog depth. A phone on 3G doesn't stall a workstation on localhost. The focused terminal gets full frame rate; background terminals throttle down. Keystrokes go straight to the PTY — latency is bounded by link RTT.\n\n`blit open` opens the browser with an embedded gateway. For persistent multi-user browser access, `blit gateway` is a standalone proxy that handles passphrase auth, serves the web app, and optionally enables QUIC. `blit server` can also run standalone for headless/daemon use. For embedding in your own app, [`@blit-sh/react`](EMBEDDING.md) and [`@blit-sh/solid`](EMBEDDING.md) provide framework bindings.\n\n`blit proxy-daemon` is a connection pool that makes remote connections feel local. It runs as a persistent background daemon per user session, maintaining pre-warmed connections to each upstream target so browser tabs connect instantly without paying SSH negotiation or TCP handshake cost. The proxy auto-starts transparently on Unix and Windows — set `BLIT_PROXY=0` to opt out.\n\nFor wire protocol details, frame encoding, and transport internals, see [ARCHITECTURE.md](ARCHITECTURE.md).\n\n## Configuration\n\n| Variable                | Default                                                                                                                | Purpose                                                                                                                                                                                                                                   |\n| ----------------------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `BLIT_SOCK`             | `$TMPDIR/blit.sock`, `/tmp/blit-$USER.sock`, `/run/blit/$USER.sock`, `$XDG_RUNTIME_DIR/blit.sock`, or `/tmp/blit.sock` | Unix socket path                                                                                                                                                                                                                          |\n| `BLIT_TARGET`           | unset                                                                                                                  | Default remote: a URI or named remote (overrides `target` in `blit.conf`)                                                                                                                                                                 |\n| `BLIT_REMOTES`          | `~/.config/blit/blit.remotes`                                                                                          | Gateway remotes file path (overrides default location)                                                                                                                                                                                    |\n| `BLIT_SCROLLBACK`       | `10000`                                                                                                                | Scrollback rows per PTY                                                                                                                                                                                                                   |\n| `BLIT_HUB`              | `hub.blit.sh`                                                                                                          | Signaling hub URL for WebRTC sharing. On `blit gateway`, sets the default hub for `share:` remotes when `BLIT_GATEWAY_WEBRTC=1`.                                                                                                          |\n| `BLIT_GATEWAY_WEBRTC`   | unset                                                                                                                  | Set to `1` on `blit gateway` to proxy `share:` remotes via WebRTC. The gateway connects as a WebRTC consumer and bridges terminals to browsers over WebSocket/WebTransport. Without this, `share:` entries in `blit.remotes` are ignored. |\n| `BLIT_PREFIX`           | `/usr/local` or `~/.local` (Unix)                                                                                      | Override install prefix (`bin/`, `lib/`, `share/` go under this)                                                                                                                                                                          |\n| `BLIT_INSTALL_DIR`      | `%LOCALAPPDATA%\\blit\\bin` (Windows)                                                                                    | Override install location (Windows PowerShell installer)                                                                                                                                                                                  |\n| `BLIT_SURFACE_ENCODERS` | see below                                                                                                              | Comma-separated encoder priority list (see below)                                                                                                                                                                                         |\n| `BLIT_SURFACE_QUALITY`  | `medium`                                                                                                               | Video quality preset: `low`, `medium`, `high`, `lossless`                                                                                                                                                                                 |\n| `BLIT_VAAPI_DEVICE`     | `/dev/dri/renderD128`                                                                                                  | VA-API render node for hardware-accelerated encoding                                                                                                                                                                                      |\n| `BLIT_CUDA_DEVICE`      | `0`                                                                                                                    | CUDA device ordinal for NVENC hardware encoding                                                                                                                                                                                           |\n\n### Surface video encoders\n\nSet `BLIT_SURFACE_ENCODERS` to a comma-separated priority list of encoders.\nThe server tries each in order and uses the first that works.\n\n```bash\n# Default priority (hardware before software):\n# av1-nvenc,h264-nvenc,av1-vaapi,h264-vaapi,h264-software,av1-software\n\n# Force software AV1 only:\nBLIT_SURFACE_ENCODERS=av1-software\n\n# Prefer NVENC, fall back to software:\nBLIT_SURFACE_ENCODERS=av1-nvenc,h264-nvenc,h264-software\n```\n\n| Value           | Codec | Backend          | Notes                                           |\n| --------------- | ----- | ---------------- | ----------------------------------------------- |\n| `av1-nvenc`     | AV1   | NVIDIA NVENC     | RTX 40+ series; fastest AV1 encode              |\n| `h264-nvenc`    | H.264 | NVIDIA NVENC     | Requires proprietary NVIDIA driver              |\n| `av1-vaapi`     | AV1   | VA-API           | Intel/AMD GPU                                   |\n| `h264-vaapi`    | H.264 | VA-API           | Intel/AMD GPU; max 3840×2160                    |\n| `h264-software` | H.264 | openh264         | Max 3840×2160; lowest CPU but worst compression |\n| `av1-software`  | AV1   | rav1e (software) | No resolution limit; CPU-heavy at high res      |\n\nThe browser automatically detects the codec from each frame and configures\nits WebCodecs decoder accordingly. Clients can also advertise which codecs\nthey support; the server skips encoders the client can't decode.\n\nFor `blit gateway` configuration, running as a systemd/launchd service, and Nix module setup, see [SERVICES.md](SERVICES.md) and [`nix/README.md`](nix/README.md).\n\n### Optional dependencies\n\nblit has no required dependencies — software H.264 and AV1 encoders are statically linked, and the CPU software renderer works everywhere. GPU acceleration and audio are enabled automatically when the right libraries or binaries are present. All GPU libraries are loaded at runtime via `dlopen`; missing ones are silently skipped.\n\n**Video — GPU compositing and hardware encoding (Linux)**\n\n| Library                                 | Packages (Debian/Ubuntu)                             | Used for                                         |\n| --------------------------------------- | ---------------------------------------------------- | ------------------------------------------------ |\n| `libvulkan.so.1`                        | `libvulkan1`, `mesa-vulkan-drivers` or NVIDIA driver | GPU compositing, Vulkan Video encode             |\n| `libva.so.2`, `libva-drm.so.2`          | `libva2`, `libva-drm2`, `va-driver-all`              | VA-API hardware encode (Intel/AMD)               |\n| `libgbm.so.1`                           | `libgbm1`                                            | DMA-BUF allocation for zero-copy VA-API encoding |\n| `libcuda.so.1`, `libnvidia-encode.so.1` | NVIDIA proprietary driver                            | NVENC hardware encode                            |\n\nWithout any of the above, the compositor falls back to CPU rendering and software encoding. No configuration needed.\n\n**Audio (Linux)**\n\n| Binary           | Packages (Debian/Ubuntu)       | Used for                                         |\n| ---------------- | ------------------------------ | ------------------------------------------------ |\n| `pipewire`       | `pipewire`                     | Audio daemon (private instance per compositor)   |\n| `pipewire-pulse` | `pipewire-pulse`               | PulseAudio compatibility for apps                |\n| `pw-cat`         | `pipewire` or `pipewire-utils` | Monitor source capture                           |\n| `dbus-daemon`    | `dbus`                         | Private D-Bus session (required by PipeWire)     |\n| `wireplumber`    | `wireplumber`                  | Session manager (optional, started if available) |\n\nAudio is disabled automatically when PipeWire is not installed, or explicitly with `BLIT_AUDIO=0`.\n\n## How it compares\n\n|                          | blit                                | ttyd                | gotty               | Eternal Terminal      | Mosh                  | xterm.js + node-pty  |\n| ------------------------ | ----------------------------------- | ------------------- | ------------------- | --------------------- | --------------------- | -------------------- |\n| Architecture             | Single binary                       | Single binary       | Single binary       | Client + daemon       | Client + server       | Library (BYO server) |\n| Multiple PTYs            | ✅ First-class                      | ❌ One per instance | ❌ One per instance | ❌ One per connection | ❌ One per connection | ⚠️ Manual            |\n| Browser access           | ✅                                  | ✅                  | ✅                  | ❌                    | ❌                    | ✅                   |\n| Delta updates            | ✅ Only changed cells               | ❌                  | ❌                  | ❌                    | ✅ State diffs        | ❌                   |\n| LZ4 compression          | ✅                                  | ❌                  | ❌                  | ❌                    | ❌                    | ❌                   |\n| Per-client backpressure  | ✅ Render-metric pacing             | ❌                  | ❌                  | ⚠️ SSH flow control   | ❌                    | ❌                   |\n| WebGL rendering          | ✅                                  | ❌                  | ❌                  | ❌                    | ❌                    | ⚠️ Addon             |\n| Transport                | WS, WebTransport, WebRTC, Unix      | WebSocket           | WebSocket           | TCP                   | UDP                   | WebSocket            |\n| Embeddable (React/Solid) | ✅                                  | ❌                  | ❌                  | ❌                    | ❌                    | ✅                   |\n| Wayland compositor       | ✅ Built-in headless (experimental) | ❌                  | ❌                  | ❌                    | ❌                    | ❌                   |\n| GUI app streaming        | ✅ H.264 / AV1                      | ❌                  | ❌                  | ❌                    | ❌                    | ❌                   |\n| Agent / CLI subcommands  | ✅                                  | ❌                  | ❌                  | ❌                    | ❌                    | ❌                   |\n| SSH tunneling built-in   | ✅                                  | ❌                  | ❌                  | ✅                    | ✅                    | ❌                   |\n\n## Browser tips\n\n### Disable Ctrl+W tab close (Chrome / Brave / Edge)\n\nWhen using blit in the browser, `Ctrl+W` closes the browser tab instead of\nreaching your terminal. Chromium-based browsers let you disable this:\n\n1. Navigate to `chrome://settings/system/shortcuts`\n   (or `brave://settings/system/shortcuts` in Brave)\n2. Find the **Close Tab** shortcut and remove or reassign it\n\nThis frees `Ctrl+W` for terminal use (e.g. deleting a word in bash/zsh).\n\n## Contributing\n\nBuilding from source, running tests, dev environment setup, code conventions, and release process are all covered in [CONTRIBUTING.md](CONTRIBUTING.md). CI/CD pipelines, the install site, and the signaling hub are documented in [SERVICES.md](SERVICES.md). The crate and package map is in [ARCHITECTURE.md](ARCHITECTURE.md).\n\n## Docker sandbox\n\nThe `grab/blit-demo` image runs unprivileged and launches `blit share` on startup. It includes `blit` itself, plus fish, busybox, htop, neovim, git, curl, jq, tree, ncdu, and Wayland GUI apps (foot, mpv, imv, zathura, wev).\n\nTo build locally:\n\n```bash\nnix build .#demo-image\ndocker load \u003c result\ndocker run --rm grab/blit-demo\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findent-com%2Fblit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findent-com%2Fblit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findent-com%2Fblit/lists"}