Changelog

The project should feel alive

Readable release notes from GitHub, designed for humans.

Latest release

v2.18.2

Oct 25, 2026

Fixed Skills that ship files beside their SKILL.md (references, scripts, templates) now work in agent sessions.

opendray update
View release
v2.18.2 Current

, 2026-10-25

Fixed Skills that ship files beside their SKILL.md (references, scripts, templates) now work in agent sessions.

Fixed

  • Skills that ship files beside their SKILL.md (references, scripts, templates) now work in agent sessions. opendray skill describe <id> printed only the SKILL.md, so an agent could not find the files it referenced. It now ends with the skill's directory for vault skills. Built-in skills print as before.
Open on GitHub
v2.18.1 Patch

, 2026-10-13

Fixed Claude sessions no longer die on every start when their stored conversation id has no transcript.

Fixed

  • Claude sessions no longer die on every start when their stored conversation id has no transcript. Claude keeps its launch id but moves to a new transcript file after /clear (and on some resumes), so the stored id could point at an older conversation or at no file, and claude --resume exited at once. Before resuming (restart, the auto-resume after an upgrade, or an account switch), opendray now finds the transcript the session is actually writing and resumes that one. When no transcript exists at all, the session starts a fresh conversation instead of failing. An account switch carries the correct transcript too.
View details

Fixed

  • Claude sessions no longer die on every start when their stored conversation id has no transcript. Claude keeps its launch id but moves to a new transcript file after /clear (and on some resumes), so the stored id could point at an older conversation or at no file, and claude --resume exited at once. Before resuming (restart, the auto-resume after an upgrade, or an account switch), opendray now finds the transcript the session is actually writing and resumes that one. When no transcript exists at all, the session starts a fresh conversation instead of failing. An account switch carries the correct transcript too.
Open on GitHub
v2.18.0 Stable

, 2026-10-13

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.
  • Codex multi-account support. Import several Codex logins (each its own CODEX_HOME) under Providers → Codex, pick one per session, and switch a live session between them. The switch copies the conversation rollout into the new account and resumes it (codex resume <id>), so the chat keeps its full history. Codex credentials (auth.json) are never copied between accounts — refresh tokens rotate, so copies would invalidate each other.
  • OpenCode multi-account support. An OpenCode account is a named credential bundle, stored encrypted with the backup key and injected per spawn via OPENCODE_AUTH_CONTENT; adding one is refused when no backup key is set rather than storing it in plain text. Live sessions can switch accounts and resume the same conversation (all accounts share opencode's session DB).
  • Mobile: the in-session account switcher now covers Grok, Codex and OpenCode sessions as well as Claude and Antigravity. Adding those accounts stays on the web.

Fixed

  • Switching a live Claude session to another account now keeps the conversation. The transcript is carried into the new account's config dir and the CLI resumes it with --resume, instead of restarting into an empty conversation with only a short recap. The "carry over conversation" toggle (on by default) still controls whether prior content is sent under the new account; if the transcript can't be carried, the switch falls back to the recap.
  • Switching a live Grok session to another account resumes the same conversation (grok --resume <id>) instead of starting fresh with a recap.
  • Codex conversations are no longer deleted when a session stops or restarts. opendray ran codex from a temporary home that was removed at exit, taking the conversation (and any refreshed login token) with it; rollouts are now synced back before the temporary home is removed.
  • The Antigravity account-switch confirmation no longer claims the history is lost; the switch already carries the conversation over.
View details

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.
  • Codex multi-account support. Import several Codex logins (each its own CODEX_HOME) under Providers → Codex, pick one per session, and switch a live session between them. The switch copies the conversation rollout into the new account and resumes it (codex resume <id>), so the chat keeps its full history. Codex credentials (auth.json) are never copied between accounts — refresh tokens rotate, so copies would invalidate each other.
  • OpenCode multi-account support. An OpenCode account is a named credential bundle, stored encrypted with the backup key and injected per spawn via OPENCODE_AUTH_CONTENT; adding one is refused when no backup key is set rather than storing it in plain text. Live sessions can switch accounts and resume the same conversation (all accounts share opencode's session DB).
  • Mobile: the in-session account switcher now covers Grok, Codex and OpenCode sessions as well as Claude and Antigravity. Adding those accounts stays on the web.

Fixed

  • Switching a live Claude session to another account now keeps the conversation. The transcript is carried into the new account's config dir and the CLI resumes it with --resume, instead of restarting into an empty conversation with only a short recap. The "carry over conversation" toggle (on by default) still controls whether prior content is sent under the new account; if the transcript can't be carried, the switch falls back to the recap.
  • Switching a live Grok session to another account resumes the same conversation (grok --resume <id>) instead of starting fresh with a recap.
  • Codex conversations are no longer deleted when a session stops or restarts. opendray ran codex from a temporary home that was removed at exit, taking the conversation (and any refreshed login token) with it; rollouts are now synced back before the temporary home is removed.
  • The Antigravity account-switch confirmation no longer claims the history is lost; the switch already carries the conversation over.
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
NextUpcoming

Operator polish

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