Gosh is a ChromeOS Isolated Web App terminal client for SSH, Mosh, Eternal Terminal, and tsshd. It connects over Chrome’s Direct Sockets API — no browser WebSocket proxy and no companion daemon on the Chromebook.
- SSH, Mosh, Eternal Terminal, and tsshd over Direct Sockets (TCP / UDP)
- Saved hosts and profiles with keys, startup commands, and per-host settings
- Restty terminal with native pane splits, scrollback, themes, and font controls
- Custom caption tabs in an unframed ChromeOS window (ChromeOS Terminal–inspired)
- QUIC or KCP for tsshd UDP mode
- Image paste to the remote host (Kitty graphics–friendly path)
- Optional credential vault for saved passwords (device-locked)
- Light / dark / system chrome and terminal themes
- ChromeOS or Chrome 120+ (Chromebook recommended for the full windowing experience)
- Flags below enabled (restart Chrome after changing them)
- A reachable SSH (and optionally Mosh / ET / tsshd) host
Open chrome://flags and set these to Enabled, then restart Chrome:
| Flag | Why |
|---|---|
#enable-isolated-web-apps |
IWA runtime |
#enable-isolated-web-app-dev-mode |
Required today to install from an update manifest outside enterprise policy |
#enable-chromeos-isolated-web-app-set-shape |
Rounded unframed window corners |
#enable-desktop-pwas-additional-windowing-controls |
Minimize / maximize in the custom caption |
If Direct Sockets still appear unavailable after install, also enable #enable-direct-sockets-for-isolated-web-apps and restart again.
-
Open
chrome://web-app-internals -
Find Install IWA from Update Manifest
-
Paste:
https://esko.github.io/gosh/update.json -
Launch Gosh from the app launcher (not a normal browser tab)
Landing page with the same URL: esko.github.io/gosh.
Installed copies check the update manifest periodically. You can also use Force update check on chrome://web-app-internals after a new GitHub Release is published.
- Open Gosh from the launcher
- Add a host (user, hostname, protocol) or pick a recent connection
- Accept the host key prompt on first connect
- Authenticate with key and/or password when prompted
Contributors: see docs/DEVELOPMENT.md for setup, architecture, and verification.
Local Chromebook install (Dev Mode Proxy or a local .swbn): docs/IWA_DEV_SETUP.md.
Publishing a release to GitHub Pages: docs/RELEASE.md.
npm install
npm run dev # http://127.0.0.1:5173 — use with Dev Mode Proxy
npm run typecheck
npm run test
npm run build| Project | Role |
|---|---|
Restty (@eslzzyl/restty) |
Browser terminal UI — panes, splits, WebGPU/WebGL2; vendored under vendor/restty/ |
Ghostty (libghostty-vt) |
WASM VT / terminal core used inside Restty |
| Project | Role |
|---|---|
| Chromium libapps — nassh, wassh, wasi-js-bindings, ssh_client | Upstream client stack; assets copied into app/upstream/ |
OpenSSH WASM (ssh.wasm, plus scp.wasm / sftp.wasm / ssh-keygen.wasm) |
SSH client (and helpers) run via wassh; from nassh’s plugin build |
Mosh (mobile-shell/mosh) — mosh-client.wasm |
Predictive remote shell; WASM client shipped with the nassh plugin (app/upstream/plugin/wasm/mosh-client.wasm) |
| wassh | WASI / WASM host that runs the OpenSSH and Mosh plugins in the browser |
| Eternal Terminal (MisterTea/EternalTerminal) | Persistent TCP sessions; TypeScript Direct Sockets client in app/src/et/ (protobuf schemas from upstream, not a WASM plugin) |
| tsshd | UDP SSH relay (KCP/QUIC); browser client compiled to WASM under app/src/tsshd/runtime/ |
| Project | Role |
|---|---|
| Google Terminal | ChromeOS Terminal UX reference |
| Isolated Web Apps | Packaging and install model |
| Direct Sockets | TCP/UDP from the IWA |
Upstream libapps assets are Chromium-licensed. Restty is MIT. tsshd retains its upstream license. Preserve notices for copied runtime and plugin files.


