A Stream Deck plugin for Codex controls and live Codex / T3 Code thread status.
No API key or login required.
- Keep track of up to 20 Agent Status slots per source, showing each top-level chat's project and status (working, done, require approval, etc). Choose Codex or T3 Code on each key. Pressing a Codex key opens the chat; pressing a T3 Code key opens the T3 Code app. Codex keys also show subagent progress.
- Usage Limits shows the percentage left in Codex's current rate-limit windows and refreshes from Codex's local app-server.
- Prompt starts a chat with any custom prompt
- Buttons to run shortcuts in Codex, such as:
- Allow / Decline
- Push to Talk / Tap to Talk
- Fast Mode (shows if active)
- Plan Mode (shows if active)
- Increase reasoning / Decrease reasoning
- New Chat
- Submit
- Fork
- Review
- Navigation: Review tab, Terminal, Scheduled, Settings, Skills, Go Back, Go Forward, and Toggle Sidebar.
- Stream Deck 7.1 or newer
- macOS 13+ or Windows 10+
- A Stream Deck device; Stream Deck+ is optional for dial control
- For Codex controls: the Switch chat, Fork chat, Toggle Fast mode, and Toggle plan mode keyboard shortcuts configured in ChatGPT as described below
- On macOS, allow Elgato Accessibility permission if prompted to allow keyboard-driven actions such as Submit and Fork.
Install the plugin and assign the keys you want. For each Agent Status key, choose an app and a different slot from 1–20 for that source. Optionally set an absolute workspace path to filter the keys to one project.
- Add an Agent Status key and choose App → T3 Code.
- Leave SSH host empty for threads on the Stream Deck computer. For remote
threads, enter an SSH alias or
user@hostname. Use additional keys for other hosts; local, remote, and Codex keys can coexist. - Leave T3 home empty for the normal
~/.t3installation, or enter the absolute directory containinguserdataon the selected computer. The reader also honorsT3CODE_HOMEwhen available in its environment. - Assign slots 1–20. Threads are ordered by recent activity, excluding archived and deleted threads. The workspace filter includes project worktrees.
Remote reads require SSH key/agent authentication and Node.js 22.13+ available
as node in the remote SSH shell. Connect with ssh your-alias in a terminal
first to establish trust; ChatGato does not prompt for passwords or accept
unknown host keys. Configure ports and identity files in your SSH config.
T3 Connect alone is not sufficient: ChatGato needs SSH access to the machine
holding the threads. No remote helper installation is required.
Pressing a T3 Code thread key opens or focuses the locally installed T3 Code desktop app. It also acknowledges completion on that key. T3 Code currently does not expose external navigation to an individual thread, so the app keeps its existing selection. This applies to both local and remote threads. Other ChatGato actions, including approval shortcuts, remain Codex controls.
T3 status comes from read-only SQLite queries, supporting both
userdata/state.sqlite and the newer userdata/statev2.sqlite (preferred when
present). It shows working, done, approval/input waits, errors, and idle states
across T3's providers. These are internal, version-sensitive schemas; a missing
or incompatible database or failed SSH read shows an error key and is retried.
Status reflects persisted state and may remain stale if T3 stops unexpectedly.
Reads are shared across keys and refresh every two seconds by default.
ChatGPT exposes app-scoped Switch chat, Fork chat, Toggle Fast mode, and Toggle plan mode commands, but does not assign them by default. Configure them once; ChatGato reads your chosen bindings from .codex/keybindings.json whenever an action runs:
- Open ChatGPT desktop.
- Open Settings → Keyboard Shortcuts.
- Search for “Switch chat” and assign any shortcut you prefer.
- Search for “Fork chat” and assign any shortcut you prefer.
- Search for “Toggle Fast mode” and assign any shortcut you prefer.
- Search for “Toggle plan mode” and assign any shortcut you prefer.
Remote Agent Status navigation and the ChatGato Fork, Fast, and Plan buttons will not work until their shortcuts are configured. Switch chat is only needed for SSH-hosted chats; local chats use exact Codex links. ChatGato reads and validates the relevant binding immediately before sending it, so shortcut changes take effect without rebuilding or restarting the plugin.
Install with one click from the Elgato marketplace.
npm install
npm run linkAfter linking, drag actions from that category onto keys or a Stream Deck+ dial.
If a key shows a warning triangle, start with com.marco.chatgato.0.log. Stream Deck
stores it inside the installed plugin directory at:
| Platform | Log file |
|---|---|
| macOS | ~/Library/Application Support/com.elgato.StreamDeck/Plugins/com.marco.chatgato.sdPlugin/logs/com.marco.chatgato.0.log |
| Windows | %APPDATA%\Elgato\StreamDeck\Plugins\com.marco.chatgato.sdPlugin\logs\com.marco.chatgato.0.log |
After running npm run link for development, the installed plugin is linked to this
checkout, so the same file is also available at
com.marco.chatgato.sdPlugin/logs/com.marco.chatgato.0.log relative to the repository
root. The .0.log file is the current log; higher-numbered files are older rotated
logs. Automation failures include the selected action and the operating-system error.
To create a distributable plugin:
npm run packFor Codex keys, the plugin starts one lazy, long-lived local codex app-server process and shares
its documented stdio JSON-RPC connection across every key. thread/list and
thread/turns/list provide recent chat metadata and status, config/read provides
Fast mode, model/list provides reasoning choices, and
account/rateLimits/read plus account/rateLimits/updated provide usage. Thread,
config, and rate-limit notifications trigger immediate key refreshes; one-to-two-second
reconciliation polling covers persisted or unloaded threads.
ChatGato targets the current app-server protocol and does not fall back when a required RPC is missing. Usage, Fast mode, model choices, and local task discovery show an offline/error state until the shared connection recovers.
Two direct Codex persisted-state reads remain because the current protocol does not
expose the required information. Rollout JSONL supplies Plan mode and the extra
detail needed for unloaded or ambiguous active tasks, including approval and user
input waits. SQLite supplies only the active task's selected model and reasoning
effort; supported choices still come from model/list. ChatGato does not use
Codex SQLite for task discovery and does not read models_cache.json or config.toml
as RPC fallbacks. The SQLite location comes from sqlite_home in
$CODEX_HOME/config.toml, then CODEX_SQLITE_HOME, and otherwise CODEX_HOME
(normally ~/.codex). Relative locations resolve from the plugin's current
working directory. See the official
Codex environment-variable documentation.
For SSH projects saved in the ChatGPT desktop app, ChatGato discovers the
configured host and project path from Codex's global state, then uses the remote
host's documented codex app-server over the same SSH connection to read its
recent chat metadata.
Remote discovery requires the same working SSH alias and remote codex command
as the desktop app's
SSH connection setup.
The normal local path uses the documented app-server API. The two persisted-state
gaps above and remote-project discovery still include internal, version-sensitive
formats. The plugin does not send chat titles, paths, prompts, or status to a
third-party service; remote chat metadata only crosses the user-configured SSH
connection. The Usage Limits key selects the canonical codex bucket rather than
model-specific meters. Press the usage key to force a refresh.
- Codex agent status prefers app-server runtime and turn state, with rollout inference for unloaded or ambiguous active threads. It intentionally avoids private app IPC and cloud APIs.
- Usage limits use only the public local Codex app-server protocol. ChatGato does not read account credentials or call a private remote HTTP endpoint.
The name ChatGato combines both:
- the words for “cat” in French (
chat), and Spanish (gato). - the words ChatGPT and Elgato, the makers of the Stream Deck.
- This app was partially vibe-coded: the maintainer didn't read all its code.
- ChatGato is an independent Stream Deck plugin and is not affiliated with or endorsed by OpenAI or Elgato.
ChatGato processes Codex and T3 Code thread data and plugin settings locally and does not send them to the developer or third parties. See the Privacy Policy for the data it reads, optional SSH behavior, retention, and deletion instructions.


0 comments
log in to comment.