Local command room for AI coding agents.
Quick Start · Features · Connecting Hermes · MCP Bridge · Testing
Athena is a local desktop workspace for running AI coding agents side by side. It gives developers one Electron app for launching Codex, OpenCode, Claude Code, Athena Code, Grok, Hermes, and shell sessions in embedded terminals, resuming native session history, and letting Hermes drive the workspace over MCP.
In search terms: Athena is an AI coding agent workspace, multi-agent desktop app, embedded terminal control room, and Hermes MCP bridge for local software development.
athena-demo.mp4
Athena is an Electron + React desktop application with a FastAPI backend for running local AI coding agents side by side. It embeds PTY terminals through node-pty and xterm.js, discovers native Codex, OpenCode, Claude Code, Athena Code, and Hermes sessions on disk so they can be resumed, and ships an MCP server that lets Hermes drive the running desktop workspace.
AI coding tools often run as isolated terminals, each in its own window. Athena puts them in one local command room:
- Start shell, Hermes, Codex, OpenCode, Claude, Athena Code, and Grok sessions from one UI, singly or as a four-pane grid.
- Resume native agent sessions already stored on disk.
- Keep one tab per project workspace, with attention badges when a background workspace needs you.
- Let Hermes use MCP tools to inspect sessions, message panes, and spawn visible Athena terminals.
| Area | Details |
|---|---|
| App type | Local desktop app for AI coding agent orchestration |
| Frontend | Electron, React, Vite, TypeScript |
| Terminal stack | node-pty + xterm.js (WebGL renderer when GPU acceleration is available) |
| Backend | FastAPI Python service launched by Electron |
| Agent support | Codex, OpenCode, Claude Code, Athena Code, Grok, Hermes, shell |
| MCP support | mcp_server/ exposes Athena tools to Hermes |
| Primary workflow | Launch or resume agents in the Command Room, tune the app in Settings |
- Launch embedded shell, Hermes, Codex, OpenCode, Claude, Athena Code, and Grok panes.
- Launch four-pane grids for parallel work; drag panes to reorder, resize, minimize, or maximize them (double-click a pane's title bar to maximize it).
- Closing a running pane asks for a second click, so an agent is never killed by a stray click.
- Panes always fill the window edge to edge, under the workspace tabs and a slim toolbar.
- The Sessions tab lists native Codex, OpenCode, Claude Code, Athena Code, and Hermes sessions for the active workspace, with search, provider filters, and Resume, Rename, Focus, and Hide actions.
- Chat view reads native user and assistant messages for Codex, Claude Code, OpenCode, Athena Code, Grok, and Hermes, with terminal output as a fallback. Replies retain Markdown, code blocks, and short answers. Use the pane's Terminal button for approvals, menus, and live tool output, then Back to chat to continue with your draft intact.
- The title bar has one gauge control per provider (Claude, Codex). Each signed-in account is a ring: the outer ring is the window closest to its cap (its percentage is shown beside it), the inner ring the other open window. An amber dot marks numbers that are stale or rate limited, a red dot an account that cannot be read (for example an expired sign-in); hover for a one-line summary per account. Click for the plan, account, every quota window with its reset countdown, and a manual refresh.
- Every signed-in account is shown separately, so several accounts can be watched side by side (config homes signed into the same account are merged). See Subscription Usage.
Press Ctrl+Shift+P (⌘⇧P on macOS) for the command palette: launch any agent or grid, switch workspaces, jump to a pane, resume a native session, change theme (highlighting a theme previews it live), adjust density and terminal text, or open any Settings section. Recently used commands appear first.
| Shortcut | Action |
|---|---|
| Ctrl+Shift+P | Command palette |
| Ctrl+, | Settings |
| Ctrl+Shift+T | New shell |
| Ctrl+Shift+N | Launch an agent (opens the palette on the launch commands) |
| Ctrl+Shift+S | Switch Terminals / Sessions |
| Ctrl+Shift+M | Switch agent panes between terminal and chat view |
| Ctrl+Tab / Ctrl+Shift+Tab | Next / previous workspace |
| Ctrl+1 … Ctrl+9 | Go to workspace 1–9 |
On macOS, Ctrl becomes ⌘ except for Ctrl+Tab. App shortcuts avoid the bare Ctrl+letter keys that shells and agent TUIs use, so Ctrl+R, Ctrl+K, Ctrl+T and the rest still reach the terminal.
Thirteen themes, each with its own 16-color terminal palette, plus Match system, which follows your OS light/dark setting:
| Dark | Light |
|---|---|
| Classic, Nightfall, Fjord, Dusk, Ember, Neon, Solstice, Monolith, Press, Mono Dark, High Contrast | Daylight, Mono Light |
Themes are sets of design tokens (client/src/styles/themes.css), so switching is instant and every text/background pair is checked against WCAG contrast in tests/themes.test.mjs. Settings > Appearance shows a live preview of each theme and also sets density (compact, default, comfortable) and the terminal font and size. Fonts ship with the app, so Athena makes no network requests for them and looks the same offline.
- Appearance: theme gallery, density, interface mode (terminal or chat), terminal font and size.
- Workspace, notifications, and terminal restore.
- Agents: detected agent CLIs with Install and Update, Hermes status and install, and the MCP bridge connect helper.
- System: graphics mode (auto, safe, accelerated), backend and Electron control status, and remote access over Tailscale.
- Diagnostics for terminal throughput, event-loop lag, and agent processes, and a keyboard shortcut reference.
- Expose Athena health, Hermes memory, native sessions, transcripts, and terminal spawning through MCP.
- Let Hermes spawn visible Athena terminals through Electron control.
- Let Hermes read native Codex/OpenCode/Claude/Athena Code/Hermes session summaries.
- Keep Hermes as the owner of long-term memory.
backend/ FastAPI backend: Hermes status/ask, memory, native sessions, adapter detection
backend/adapters/ Agent adapter implementations
client/ Electron + React desktop client
client/electron/ Electron main-process services and IPC handlers
client/src/ React UI and browser-side API wrappers
docs/ Public implementation and verification notes
mcp_server/ MCP bridge so Hermes can control Athena
scripts/ Build and verification helpers
tests/ Backend, MCP, native session, and adapter tests
- Node.js and npm
- Python 3.11+ recommended
pip- Optional agent CLIs:
codexopencodeclaudeathena-codegrokhermes
- Optional Hermes Agent install for real shared memory integration
The desktop app can open without every agent CLI installed. Missing agents are marked "not installed" in the New menu; starting one asks whether to install it, runs the install in a terminal you can watch, and launches the agent when it finishes. Settings > Coding agents shows where each CLI was found and has Install and Update buttons.
Athena always runs the machine-wide install of each agent: the same claude, codex or opencode your other terminals find on PATH (for npm CLIs, npm's global prefix, npm prefix -g). Updating an agent inside Athena, from the agent's own update prompt, or from any other terminal updates the same copy. Earlier versions kept private copies in ~/.npm-global and ran those instead; if any are left, Settings offers to remove them.
git clone https://github.com/luckeyfaraday/Athena.git
cd Athena/client
npm install
npm run devFor the full backend/test environment, use the setup steps below.
Install the client dependencies:
cd client
npm installInstall backend dependencies from the repository root:
python3 -m venv .venv
source .venv/bin/activate
pip install -r backend/requirements.txtFor tests, install pytest if it is not already available:
pip install pytestIf your preferred Python is not python3, set:
export CONTEXT_WORKSPACE_PYTHON=/absolute/path/to/pythonDevelopment builds use this value when spawning the FastAPI backend. Packaged
desktop releases include a self-contained backend runtime and do not require
FastAPI, Uvicorn, or Python to be installed on the host. Setting
CONTEXT_WORKSPACE_PYTHON explicitly overrides that bundled runtime.
From client/:
npm run devThis command:
- Builds the Electron TypeScript entry points.
- Starts Vite on
127.0.0.1. - Launches Electron.
- Electron starts the FastAPI backend on a free localhost port.
For a production build:
cd client
npm run buildTo build an AppImage on Linux:
python3 -m pip install -r backend/requirements-build.txt
cd client
npm run distnpm run dist builds and smoke-tests the bundled backend before packaging the
desktop artifact. The same process runs natively for the Windows and macOS
release jobs.
To launch a previously built Electron app:
cd client
npm startFrom the repository root:
python3 -m uvicorn backend.app:app --host 127.0.0.1 --port 8000Useful endpoints:
GET /health
GET /hermes/status
POST /hermes/ask
GET /memory/hermes?q=<query>
GET /memory/recent?limit=10
POST /memory/store
POST /memory/delete
GET /agents/adapters
GET /agents/sessions
GET /agents/sessions/{provider}/{session_id}/transcript
GET /usage/accounts
POST /usage/refresh
Run the complete backend suite and the permanent historical-regression gate from the repository root:
python -m pytest
python scripts/run_regression_checks.pyRun the client unit suites and build checks:
cd client
npm run test:chat
npx playwright install chromium
npm run test:chat-ui
npm run test:electron
npm run test:regression
npm run buildThe regression gate fails when either the backend or client regression corpus is missing. It permanently covers the resource/freeze incidents behind terminal remount and layout, output ACK recovery, bounded execution logs, and session scan amplification. Tests use fake CLI agent fixtures, so these checks do not launch hosted models or external agent tools.
Pull requests run the same suites in .github/workflows/pr-checks.yml. Changes
to terminal streaming, restore, graphics, process launch, session discovery, or
pane layout must add a regression case for the historical behavior they touch.
For the first public release gate, see
docs/release-0.1.0-checklist.md.
Athena's primary workflow is embedded, interactive agent sessions. The Electron main process launches terminal panes for shell, Hermes, Codex, OpenCode, Claude, Athena Code, and Grok. The React UI renders those panes with xterm.js.
Fresh agent panes start clean. Athena only writes a short launch prompt (routing tips for asking Hermes and messaging other panes, plus an optional task) when a task or curated context is supplied, for example by Hermes through MCP. Athena does not write any files into your project directory.
Athena also discovers native provider sessions already on disk, so previous Codex, OpenCode, Claude Code, Athena Code, and Hermes work can be resumed from the Sessions tab. Discovery runs off the main thread, only for the active workspace, and only while the Sessions tab is open.
The backend reads the real subscription quotas of the CLIs you are already signed into. It never asks for a token and never signs in, refreshes, or switches accounts. The CLIs own their logins.
| Provider | Source | Windows |
|---|---|---|
| Claude | The OAuth login Claude Code saved in <config dir>/.credentials.json, sent only to Anthropic's usage endpoint |
Session (5-hour), Weekly, and any model-scoped weekly limits |
| Codex | A short-lived codex app-server per CODEX_HOME (account/rateLimits/read) |
Session, Weekly, and any extra limit buckets |
Config homes are discovered, not configured: CLAUDE_CONFIG_DIR or ~/.claude,
profiles registered with claude-account-switcher, and ~/.claude-accounts/*;
CODEX_HOME or ~/.codex, and ~/.codex-accounts/*. Add other homes with
CONTEXT_WORKSPACE_USAGE_CLAUDE_HOMES / CONTEXT_WORKSPACE_USAGE_CODEX_HOMES
(os.pathsep-separated).
Records are keyed by provider plus a hash of the account's stable identity, not by folder. Homes signed into one account share a record, a home that signs into another account starts a fresh one, and an account signed out everywhere drops its cached numbers. A probe whose home changed accounts mid-flight is discarded.
GET /usage/accounts only reads the cache and schedules due probes in the
background, so the desktop app, Athena Mobile, and any other client share one
set of upstream calls: at most one per account per
CONTEXT_WORKSPACE_USAGE_REFRESH_SECONDS (default 300, minimum 60).
POST /usage/refresh (optional provider or account_key) forces a
deduplicated re-read and waits up to 12 seconds. Failures back off, a 429 honors
Retry-After, and a rejected or expired login is not retried until the CLI
rewrites its credentials. Responses carry display fields only (email, plan,
profile label, ~-relative path), never tokens. A window whose reset time
has passed is dropped rather than shown. Numbers that are not from a fresh
reading are marked stale, and unknown quota is omitted, never shown as 0%.
These are provider-reported limits. Local transcript token counts are a separate thing and are not mixed in. Claude Code on macOS keeps its login in the Keychain, which this does not read.
The Electron main process manages embedded terminals through node-pty. The React UI renders them with xterm.js.
Mounted terminal views use a bounded, sequence-aware stream. Output is sent only to subscribed visible views, retained until xterm's write callback acknowledges it, and replayed from an atomic snapshot after a remount. If a consumer falls behind its bounded budget, Athena sends an explicit reset and truncation marker instead of silently joining incompatible VT fragments. Collapsed, maximized-away, and off-workspace panes keep their PTY alive without receiving raw renderer IPC.
The New menu can launch:
- Shell
- Hermes
- Athena Code
- Athena Code Grid
- Codex
- Codex Grid
- OpenCode
- OpenCode Grid
- Claude
- Claude Grid
Agent panes receive a generated Athena prompt path only for task or curated launches. Clean launches receive no prompt path.
Athena can let your other machines drive this one over Tailscale. It's off by default. Turn it on in Settings > System > Remote access. While it's on, another machine on the same tailnet can call this machine's Electron control API: list terminals, stream their output, type into them, and launch shells or agents. The terminals and agents run on this machine and see this machine's files; the other machine only gets a window into them.
What Athena does when remote access is on:
- It listens only on local addresses confirmed by
tailscale status --json, on port 47821 by default. The Tailscale CLI must be installed, running and signed in; unavailable or stopped Tailscale leaves the listeners closed. Athena checks every 15 seconds, so it picks up Tailscale starting late or changing address. An address in the same IP range on another VPN or LAN does not qualify. - It answers only peers whose source address is on the tailnet, and only when the Host is a Tailscale
address or MagicDNS name. Any request with a browser
Originheader is refused. - Trust my own devices (off by default): when enabled, a request from another device signed in to the same Tailscale
account is let in without a token. Athena asks the local Tailscale client who owns the connecting address
(
tailscale whois). Tagged devices never count as your own, and neither does this machine dialing itself. Leave the setting at Token only to require the token from every device. - Every other request except
/healthneeds the machine's access token (Authorization: Bearer athena_remote_…orX-Athena-Control-Token). The token is persistent, is stored with 0600 permissions in Athena's user-data folder asremote-access.json, and is separate from the local per-launch control token. Regenerate issues a new token and drops existing connections. - After 10 bad tokens in a minute, a peer gets HTTP 429. Settings shows the last accepted and the last rejected request, with the device name and whether it was let in by account or by token.
Your machines (Settings > System) lists the other computers on your tailnet and whether each one's Athena is ready for this machine: Ready, Needs token, Not answering (Athena closed, remote access off, or a firewall), or Offline. It checks the same port this machine uses, so keep the port the same everywhere.
Try it from another of your machines using the token copied from Settings:
export ATHENA_TOKEN='athena_remote_…'
curl -H "Authorization: Bearer $ATHENA_TOKEN" http://my-desktop.tail1234.ts.net:47821/machine
curl -H "Authorization: Bearer $ATHENA_TOKEN" http://my-desktop.tail1234.ts.net:47821/terminals
# After explicitly enabling Trust my own devices, another device on your account can omit the token:
curl http://my-desktop.tail1234.ts.net:47821/machineAnyone who can reach the port from one of your devices, or who has the token, can run commands on the machine. Keep the port off Funnel. For extra safety, add a Tailscale ACL that limits port 47821 to your own devices. On Windows, allow Athena through Windows Defender Firewall for private networks the first time you turn it on.
The backend uses HermesManager and HermesMemoryStore to find Hermes status and read/write memory.
Memory query endpoint:
GET /memory/hermes?q=<query>
The response is plain text so CLI agents can consume it easily with tools like curl.
On every launch, the Athena desktop app installs a bundled agent skill named
athena-context-workspace into the local skill directories of the supported
coding agents:
~/.codex/skills/athena-context-workspace
~/.claude/skills/athena-context-workspace
~/.config/opencode/skills/athena-context-workspace
The skill source lives in agent-skills/athena-context-workspace/ and is copied
by installManagedAgentSkills() (client/electron/agent-skills.ts). Athena
tracks what it installed in ~/.context-workspace/agent-skills.json, so updates
are applied cleanly and directories with your own edits are never overwritten.
This skill teaches Codex, Claude Code, and OpenCode how to behave inside an
Athena workspace, including how to route ask hermes requests. There is no
separate ask-hermes skill to install — the Hermes routing rules live inside
athena-context-workspace.
When the user says ask hermes ..., the agent routes the question through Athena
instead of shelling out to the hermes binary directly:
- If the Athena MCP tools are loaded, it calls
context_workspace_ask_hermes(workspace, question). - Otherwise, if
CONTEXT_WORKSPACE_BACKEND_URLis set, it POSTs to/hermes/askwith{ project_dir, question }.
Both paths reach the local Athena backend, which runs Hermes once with the project as context and returns the answer. Routing through the backend keeps logging and project scoping consistent across agents.
"Connecting Hermes" is two independent steps. The Settings → Hermes card in the desktop app shows the current state of both and provides actions where it can.
-
Install the Hermes Agent CLI. When the in-app installer is supported (Linux and macOS with
bashandcurl), the Hermes card shows an Install Hermes button wired toPOST /hermes/install. On native Windows, install the native Hermes build separately and make surehermesis on yourPATH. Athena resolvesHERMES_BINfirst, then PATH and known Hermes-managed virtual-environment locations.HERMES_HOMEoverrides~/.hermes.Athena's one-shot
/hermes/askendpoint uses the provider and model from the user's Hermes config by default. Operators can pin that path withHERMES_ASK_PROVIDERandHERMES_ASK_MODEL. One-shot processes and their retrying descendants are terminated when the request timeout expires. -
Point Hermes at the Athena MCP bridge. So Hermes can call Athena's
context_workspace_*tools, add the bridge block to your Hermes config (~/.hermes/config.yaml). The Hermes card has a Connect Hermes to Athena helper with a copyable snippet; the full setup (paths, tokens) is in Hermes MCP Bridge below.
The coding-agent skills above and the Hermes bridge are complementary: the skills let Codex/Claude/OpenCode ask Hermes through Athena, while the bridge lets Hermes drive Athena (spawn terminals, read sessions, message panes).
Athena includes an MCP server under mcp_server/ so Hermes can call into the running desktop workspace.
Packaged desktop builds automatically launch this bridge from Athena's bundled
runtime for Codex, Claude, OpenCode, and Athena Code, so those agents do not
need Python or MCP dependencies installed on the host. The manual setup below
is only for a separately installed Hermes process that needs to drive Athena.
Install the MCP server dependencies into the Python environment Hermes will use:
pip install -r ~/context-workspace/mcp_server/requirements.txtAdd the bridge to the Hermes config at ~/.hermes/config.yaml:
mcp_servers:
context_workspace:
command: "python"
args:
- "/home/you/context-workspace/mcp_server/server.py"
timeout: 120
connect_timeout: 30
env:
CONTEXT_WORKSPACE_BACKEND_STATE: "/home/you/.context-workspace/backend.json"If Hermes uses its own virtual environment, set command to that interpreter:
command: "/home/you/.hermes/hermes-agent/venv/bin/python3"The Electron app writes backend discovery state to:
~/.context-workspace/backend.json
(On Windows: C:\Users\you\.context-workspace\backend.json.)
Start the Athena desktop app before starting Hermes so the backend state file exists. If you run the backend directly on a fixed port, you can use CONTEXT_WORKSPACE_BACKEND_URL instead:
env:
CONTEXT_WORKSPACE_BACKEND_URL: "http://127.0.0.1:8000"Windows notes:
- Launch the backend as a module from the repo root:
python -m backend.launcher --host 127.0.0.1 --port 8000. Running the file path directly (python backend/launcher.py) fails withModuleNotFoundError: No module named 'backend', because the repo root never lands onsys.path. - When a system-wide proxy is active (Clash, v2rayN, etc.),
httpxin the MCP bridge picks up the Windows system proxy and sends localhost traffic through it, producing502 Bad Gatewayeven though the backend is running. Exclude loopback viaNO_PROXYin the bridge env:
env:
CONTEXT_WORKSPACE_BACKEND_URL: "http://127.0.0.1:8000"
NO_PROXY: "127.0.0.1,localhost"The bridge exposes tools for health checks, asking Hermes, Hermes memory reads/writes through the backend, native agent session discovery and transcript reads, visible embedded terminal spawning and input, and agent-to-agent messages between panes.
Visible terminal tools require the Electron app itself, not only the FastAPI backend. Electron writes control discovery state to:
~/.context-workspace/electron-control.json
(On Windows: C:\Users\you\.context-workspace\electron-control.json.)
Set CONTEXT_WORKSPACE_ELECTRON_CONTROL_URL only when you need to override this discovery file.
The Electron control server requires a per-launch secret token for every
endpoint except /health. The desktop app generates the token at startup and
writes it into electron-control.json (created with 0600 permissions). The
MCP bridge reads the token from that discovery file automatically and sends it
as a Bearer token, so no manual configuration is needed in the normal flow.
When you override discovery with CONTEXT_WORKSPACE_ELECTRON_CONTROL_URL, also
set CONTEXT_WORKSPACE_ELECTRON_CONTROL_TOKEN to the token from that file. The
token, loopback-only Host enforcement, and rejection of cross-origin requests
together prevent other local processes and malicious web pages from driving the
control server (process spawning, terminal input injection, buffer reads).
If the same projects live under different usernames on different machines (for
example C:\Users\you\... on Windows and /home/you/... on Linux), set
CONTEXT_WORKSPACE_HOME_ALIASES to the extra usernames (comma-separated, e.g.
you,work-user) so project-scoped memory matching recognizes both home paths.
Useful MCP tools:
context_workspace_ask_hermes(project_dir, question, context?)
context_workspace_list_agent_sessions(project_dir, provider?, query?, limit?)
context_workspace_summarize_agent_sessions(project_dir, provider?, query?, limit?)
context_workspace_read_agent_session(provider, session_id, max_bytes?, tail?)
context_workspace_open_workspace(project_dir, select?)
context_workspace_spawn_agent(project_dir, task, agent_type?, context_mode?, context?, open_workspace?, model?)
context_workspace_spawn_terminal(project_dir, kind?, count?, title?, resume_session_id?, session_label?, open_workspace?)
context_workspace_list_live_terminals(project_dir?)
context_workspace_inject_terminal_input(target, text, ...)
context_workspace_send_message(to, text, project_dir?, from_terminal_id?, ...)
context_workspace_list_messages(...)
context_workspace_kill_terminal(target)
context_workspace_close_workspace(project_dir)
context_mode is one of none (clean launch), task (compact task prompt), or curated (task plus caller-selected background passed in context).
Use context_workspace_spawn_agent for user-requested Codex, OpenCode, Athena Code, or Claude work. Pass agent_type="athena-code" or agent_type="athena" for Athena Code. It opens a visible Command Room PTY by default through Electron control, so Athena must be running. Set open_workspace=true when Hermes should add/select a project folder in Athena before spawning. Use context_workspace_spawn_terminal for lower-level terminal control such as shells, grids, Hermes panes, or explicit resumes; its kind accepts athena-code as an alias for the live athena terminal kind.
Use context_workspace_kill_terminal to stop one live Athena PTY by terminal id or provider session id. Use context_workspace_close_workspace to close a workspace tab and stop its live embedded terminals.
If visible spawning fails with an Electron control error, check ~/.context-workspace/electron-control.json and restart the Athena desktop app.
Athena owns these app-side tools. Hermes still owns its own config, session_search, and long-term memory writes.
- Run several AI coding agents against one local project.
- Resume prior Codex, OpenCode, Claude Code, Athena Code, or Hermes work.
- Send the same prompt to a grid of agents and compare their output.
- Let Hermes control visible Athena terminals through MCP.
Athena Code is a standalone opencode fork in the
luckeyfaraday/athena-code
repository and installs its own athena-code CLI. Athena treats it exactly like Codex,
OpenCode, and Claude Code: the Command Room launches it from the New menu
as a regular embedded PTY, it must be on PATH, and it participates in the
same clean/task/curated context modes as every other agent.
Install Athena Code:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/luckeyfaraday/athena-code/main/scripts/install.sh | bash# Windows PowerShell
irm https://raw.githubusercontent.com/luckeyfaraday/athena-code/main/scripts/install.ps1 | iexEvery agent launch starts Clean unless a task or curated context is supplied.
Packaged releases use Athena's bundled backend. Check
~/.context-workspace/backend.json for the captured startup error. For local
development, verify that backend dependencies are installed and Electron is
using the expected Python:
export CONTEXT_WORKSPACE_PYTHON=/path/to/pythonThen restart the desktop app.
Start the agent from New, or open Settings > Coding agents: Athena offers to install a missing CLI and runs the install in a visible terminal. The commands it uses:
| Agent | Windows | macOS / Linux |
|---|---|---|
| Claude Code, Codex, OpenCode | npm install -g @anthropic-ai/claude-code@latest (@openai/codex, opencode-ai) |
same |
| Grok | irm https://x.ai/cli/install.ps1 | iex |
curl -fsSL https://x.ai/cli/install.sh | bash |
| Athena Code | irm https://raw.githubusercontent.com/luckeyfaraday/athena-code/main/scripts/install.ps1 | iex |
curl -fsSL https://raw.githubusercontent.com/luckeyfaraday/athena-code/main/scripts/install.sh | bash |
| Hermes | iex (irm https://hermes-agent.nousresearch.com/install.ps1) |
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash |
To install by hand, run the command in any terminal, then make sure the CLI is on PATH for the Electron process:
which codex
which opencode
which claude
which athena-code
which grok
which hermesSee the Grok Build documentation.
Quit all running Athena/AppImage instances before testing a newly built AppImage. Linux AppImages mount into /tmp/.mount_ATHENA..., so an older running instance can make it look like a rebuild did not change the UI.
Open Settings → Graphics to inspect the active graphics mode. Athena keeps hardware acceleration enabled on healthy Linux systems so terminal painting does not overload the software compositor. A GPU-process crash or interrupted accelerated launch quarantines the next launch into safe mode, preventing a crash loop. The setting always requires a restart.
Environment overrides remain available for diagnosis:
CONTEXT_WORKSPACE_ENABLE_GPU=1 npm start
CONTEXT_WORKSPACE_SAFE_GRAPHICS=1 npm startThe explicit GPU override wins over quarantine and should only be used when you can recover from a native graphics crash. Settings also shows terminal stream subscribers, retries, resets, dropped/truncated characters, and event-loop lag.
If the app is launched through npm run dev, the embedded shell may inherit npm environment variables. With nvm, this can produce:
nvm is not compatible with the "npm_config_prefix" environment variable
This comes from shell startup, not the terminal renderer. A narrow fix is to sanitize npm_config_prefix from the PTY environment before spawning embedded terminals.
Electron asks the OS for a free backend port. Vite uses 127.0.0.1:5173 during development.
- Never write Athena state into the user's project directory; app state lives in
~/.context-workspace/. - Do not overwrite user-owned
AGENTS.md,CLAUDE.md, or tool configuration files without explicit opt-in. - Keep Hermes memory as the durable source of shared context.
- Prefer adapter-specific behavior over assuming every agent CLI handles instructions the same way.
- Run
pytestandnpm run buildbefore opening a PR.

