Changelog

The project should feel alive

Readable release notes from GitHub, designed for humans.

Latest release

[Unreleased]

Date unavailable

Added Sessions remember their last terminal size and (re)spawn at it instead of the fixed 80x24 floor.

opendray update
View release
[Unreleased] Current

Release notes

Added Sessions remember their last terminal size and (re)spawn at it instead of the fixed 80x24 floor.

Added

  • Sessions remember their last terminal size and (re)spawn at it instead of the fixed 80x24 floor. opendray persists the size from each client resize; on restart/reconnect the PTY starts already matching the last window, so a full-screen TUI like grok comes up correctly sized instead of tiny-then-jump (and never renders a stale small frame the browser must correct). Bounded to a sane range; unset falls back to the floor.
Open on GitHub
v2.17.8 Patch

, 2026-09-24

Fixed Terminal sessions recover from a corrupted render on (re)connect. opendray replays its output ring buffer to a new connection, which for a full screen (alt screen) TUI like grok could begin mid escape sequence and

Fixed

  • Terminal sessions recover from a corrupted render on (re)connect. opendray replays its output ring buffer to a new connection, which for a full-screen (alt-screen) TUI like grok could begin mid-escape-sequence and garble the screen (stray codes, fragmented boxes). The web terminal now forces a clean repaint after the size settles (a brief one-column resize nudge → the TUI redraws over the replay). Fixes grok sessions that opened messy / not filling.
  • Claude sessions no longer surface "N MCP servers need authentication" for the account's claude.ai connectors. opendray now spawns claude with --strict-mcp-config, so a session uses only opendray-managed MCP servers (the --mcp-config set) and ignores the account's claude.ai connectors and user ~/.claude.json. Those connectors require interactive OAuth that a headless gateway session can't complete, so they only produced noise.
View details

Fixed

  • Terminal sessions recover from a corrupted render on (re)connect. opendray replays its output ring buffer to a new connection, which for a full-screen (alt-screen) TUI like grok could begin mid-escape-sequence and garble the screen (stray codes, fragmented boxes). The web terminal now forces a clean repaint after the size settles (a brief one-column resize nudge → the TUI redraws over the replay). Fixes grok sessions that opened messy / not filling.
  • Claude sessions no longer surface "N MCP servers need authentication" for the account's claude.ai connectors. opendray now spawns claude with --strict-mcp-config, so a session uses only opendray-managed MCP servers (the --mcp-config set) and ignores the account's claude.ai connectors and user ~/.claude.json. Those connectors require interactive OAuth that a headless gateway session can't complete, so they only produced noise.
Open on GitHub
v2.17.7 Patch

, 2026-09-23

Added [session] gains env dotenv files — a list of dotenv style files (KEY=VAL per line) whose every entry is injected into each spawned session.

Added

  • [session] gains env_dotenv_files — a list of dotenv-style files (KEY=VAL per line) whose every entry is injected into each spawned session. This is the modular way to feed a whole bundle of host secrets (e.g. a secrets.env) into sessions with one config line, instead of one file per variable via env_files. Blank lines and # comments are skipped, a leading export is stripped, and surrounding quotes removed. Precedence, lowest to highest: env_dotenv_files < env < env_files.
Open on GitHub
v2.17.6 Patch

, 2026-09-23

Fixed The install wizard now actually installs the Grok Build CLI when you opt in.

Fixed

  • The install wizard now actually installs the Grok Build CLI when you opt in. Selecting Grok previously only printed a "install it manually" warning (it assumed grok was distributed outside npm), so grok was missing after the install even though you said yes. grok ships on npm as @xai-official/grok, so it now installs the same way as Claude Code and Codex, in both the Linux and macOS wizards.
  • opendray providers list / opendray providers update now include grok (@xai-official/grok) alongside claude and codex.

Improved

  • npm package README clarifies that npm install -g opendray ships the gateway binary only — it does not provision PostgreSQL, a service user, the AI CLIs, or a system service. It points to the curl installer for a fully-managed setup and documents installing at least one AI CLI (claude/codex/grok) for the npm route. Also removed the stale "Gemini" reference.
View details

Fixed

  • The install wizard now actually installs the Grok Build CLI when you opt in. Selecting Grok previously only printed a "install it manually" warning (it assumed grok was distributed outside npm), so grok was missing after the install even though you said yes. grok ships on npm as @xai-official/grok, so it now installs the same way as Claude Code and Codex, in both the Linux and macOS wizards.
  • opendray providers list / opendray providers update now include grok (@xai-official/grok) alongside claude and codex.

Changed

  • npm package README clarifies that npm install -g opendray ships the gateway binary only — it does not provision PostgreSQL, a service user, the AI CLIs, or a system service. It points to the curl installer for a fully-managed setup and documents installing at least one AI CLI (claude/codex/grok) for the npm route. Also removed the stale "Gemini" reference.
Open on GitHub
v2.17.5 Patch

, 2026-09-23

Added Grok accounts now show the signed in account holder (name and email) as a tag in the Grok Accounts panel, read on each list from the on disk grok login (<GROK HOME /auth.json).

Added

  • Grok accounts now show the signed-in account holder (name and email) as a tag in the Grok Accounts panel, read on each list from the on-disk grok login (<GROK_HOME>/auth.json). This mirrors the Claude accounts panel's oauth_email tag so you can tell which xAI account each row authenticates as. Derived on every read, never persisted; empty when logged out.
Open on GitHub
v2.17.4 Patch

, 2026-09-22

Fixed Web terminal now sizes the session to the browser window automatically on open.

Fixed

  • Web terminal now sizes the session to the browser window automatically on open. The initial fit could run before the flex container was measured, leaving the PTY at xterm's 80x24 default; grok (which lays out from the PTY size and only repaints on resize) then sat stuck small until the window was manually resized. The terminal now re-fits and pushes the measured size on a short bounded schedule after connect, and re-pushes on reconnect so a freshly respawned PTY (e.g. after a grok account switch) is sized correctly.
View details

Fixed

  • Web terminal now sizes the session to the browser window automatically on open. The initial fit could run before the flex container was measured, leaving the PTY at xterm's 80x24 default; grok (which lays out from the PTY size and only repaints on resize) then sat stuck small until the window was manually resized. The terminal now re-fits and pushes the measured size on a short bounded schedule after connect, and re-pushes on reconnect so a freshly respawned PTY (e.g. after a grok account switch) is sized correctly.
Open on GitHub
v2.17.3 Patch

, 2026-09-21

Fixed Grok sessions stay working across account switches and are never bricked by a logged out account.

Fixed

  • Grok sessions stay working across account switches and are never bricked by a logged-out account. Switching now requires the target account to be logged in — a logged-out target is rejected up-front with a clear error and the running session is left untouched, instead of being stopped and failing to respawn. If a switch respawn fails, the session rolls back to the previously working account. And at spawn/restart, a session whose bound account is logged out falls back to the default grok home, then to any other logged-in account, so it comes up on whatever account works.
View details

Fixed

  • Grok sessions stay working across account switches and are never bricked by a logged-out account. Switching now requires the target account to be logged in — a logged-out target is rejected up-front with a clear error and the running session is left untouched, instead of being stopped and failing to respawn. If a switch respawn fails, the session rolls back to the previously working account. And at spawn/restart, a session whose bound account is logged out falls back to the default grok home, then to any other logged-in account, so it comes up on whatever account works.
Open on GitHub
v2.17.2 Patch

, 2026-09-20

Changed Reworked the Jev (TypeSafe) integration into a generic, modular session environment mechanism.

Improved

  • Reworked the Jev (TypeSafe) integration into a generic, modular session environment mechanism. Instead of a jev-specific [jev] config section baked into the core, sessions now inherit operator-defined env vars from [session.env] (inline) and [session.env_files] (value read from a file, keeping secrets out of config.toml). This injects any host tool's credentials into every provider's agent with no per-provider setup and nothing tool-specific in the codebase. Jev is now just one consumer: point TYPESAFE_API_KEY at a key file under [session.env_files]. The [jev] section is removed.
View details

Changed

  • Reworked the Jev (TypeSafe) integration into a generic, modular session environment mechanism. Instead of a jev-specific [jev] config section baked into the core, sessions now inherit operator-defined env vars from [session.env] (inline) and [session.env_files] (value read from a file, keeping secrets out of config.toml). This injects any host tool's credentials into every provider's agent with no per-provider setup and nothing tool-specific in the codebase. Jev is now just one consumer: point TYPESAFE_API_KEY at a key file under [session.env_files]. The [jev] section is removed.
Open on GitHub
v2.17.1 Patch

, 2026-09-19

Fixed The one line installer no longer crashes or hangs when there is no controlling terminal (LXC / pct exec, Docker without t, CI, cloud init).

Fixed

  • The one-line installer no longer crashes or hangs when there is no controlling terminal (LXC / pct exec, Docker without -t, CI, cloud-init). It aborted at startup trying to open /dev/tty, and a menu prompt could spin forever on end-of-input. It now reattaches to a terminal only when one can actually be opened, and menu prompts fail fast with guidance instead of looping. Interactive curl … | bash installs are unchanged; automated installs now work or fail cleanly. (install-linux.sh, install-macos.sh)
Open on GitHub
v2.17.0 Stable

, 2026-09-19

Added Grok sessions keep their conversation across a stop and restart. On a same account restart opendray now resumes the current working directory's most recent grok session instead of starting a blank one, matching how

Added

  • Grok sessions keep their conversation across a stop and restart. On a same-account restart opendray now resumes the current working directory's most recent grok session instead of starting a blank one, matching how Claude and Antigravity sessions carry across a restart. Account switches still start fresh under the new account. (#552)
Open on GitHub
v2.16.0 Stable

, 2026-09-19

Added Jev (TypeSafe) integration. Jev is a "System One" decision CLI that returns calibrated probabilities and a verdict as JSON (classify, verify, route, screen, match, rank) instead of prose.

Added

  • Jev (TypeSafe) integration. Jev is a "System One" decision CLI that returns calibrated probabilities and a verdict as JSON (classify, verify, route, screen, match, rank) instead of prose. Set one API key under a new [jev] config section and opendray injects it into every session, so any provider's agent (Claude, Grok, Codex, Antigravity, OpenCode, shell) can call the jev CLI with no per-provider setup. api_key or api_key_file, and an env_var override for OpenRouter or Cloudflare providers. Install the CLI on the host with npm i -g jevctl.
View details

Added

  • Jev (TypeSafe) integration. Jev is a "System One" decision CLI that returns calibrated probabilities and a verdict as JSON (classify, verify, route, screen, match, rank) instead of prose. Set one API key under a new [jev] config section and opendray injects it into every session, so any provider's agent (Claude, Grok, Codex, Antigravity, OpenCode, shell) can call the jev CLI with no per-provider setup. api_key or api_key_file, and an env_var override for OpenRouter or Cloudflare providers. Install the CLI on the host with npm i -g jevctl.
Open on GitHub
v2.15.3 Patch

, 2026-09-16

Fixed Grok sessions no longer come up as a blank screen, and grok is back in its clean scrollback native mode so sessions scroll on desktop and mobile.

Fixed

  • Grok sessions no longer come up as a blank screen, and grok is back in its clean scrollback native mode so sessions scroll on desktop and mobile. The real cause was that a session's terminal was created with no size until the browser first resized it, and grok's scrollback native mode waits for a real size before drawing, so it stayed blank. Sessions now start with a sensible default terminal size, so grok draws right away. (#550)
Open on GitHub
NextUpcoming

Operator polish

Operator polish, reconnect stability, memory improvements, and clearer docs.