[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74344":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},74344,"hermes-workspace","outsourc-e\u002Fhermes-workspace","outsourc-e","Native web workspace for Hermes Agent — chat, terminal, memory, skills, inspector.","https:\u002F\u002Fhermes-workspace.com",null,"JavaScript",5598,840,30,21,0,144,459,859,432,114.77,"MIT License",false,"main",[26,27,28,29,30,31,32],"agent-ui","ai-workspace","hackathon","hermes-agent","nous-research","react","typescript","2026-06-12 04:01:15","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\".\u002Fpublic\u002Fclaude-avatar.webp\" alt=\"Hermes Workspace\" width=\"80\" style=\"border-radius: 16px\" \u002F>\n\u003C!-- avatar filename retained for cache stability — do not rename without coordinated cache-bust -->\n\n# Hermes Workspace\n\n**Your AI agent's command center — chat, files, memory, skills, and terminal in one place.**\n\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-2.3.0-2557b7.svg)](CHANGELOG.md)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg)](LICENSE)\n[![Node](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%3E%3D22.0.0-brightgreen.svg)](https:\u002F\u002Fnodejs.org\u002F)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-6366F1.svg)](CONTRIBUTING.md)\n\n> Not a chat wrapper. A complete workspace — orchestrate agents, browse memory, manage skills, and control everything from one interface.\n\n> **v2 — zero-fork.** Clone, don't fork. Runs on vanilla [`NousResearch\u002Fhermes-agent`](https:\u002F\u002Fgithub.com\u002FNousResearch\u002Fhermes-agent) installed via Nous's own installer. Chat, sessions, memory, skills, jobs, MCP, terminal, dashboard, Agent View, and Operations are all in vanilla parity. **Conductor** uses the dashboard mission API when available and falls back to Workspace-native Swarm dispatch (`mode: native-swarm`) when the dashboard endpoint is absent, preserving zero-fork behavior ([#262](https:\u002F\u002Fgithub.com\u002Foutsourc-e\u002Fhermes-workspace\u002Fissues\u002F262)).\n\n![Hermes Workspace](.\u002Fdocs\u002Fscreenshots\u002Fsplash.png)\n\n\u003C\u002Fdiv>\n\n---\n\n## Swarm Mode\n\nHermes Agent Swarm turns the workspace into a live control plane: unlimited Hermes Agents, 1 orchestrator, 0 humans manually dispatching.\nPersistent tmux workers keep context across tasks, rotate safely, and report proof-bearing checkpoints.\nRole-based dispatch routes builders, reviewers, docs, research, ops, triage, QA, and lab lanes without turning Eric into the task router.\nA byte-verified review gate protects release branches before PRs ship.\nAutonomous PR\u002Fissue lanes, lab experiments, and the repair playbook keep the machine moving while humans handle judgment.\n\nStart here: [docs\u002Fswarm\u002F](.\u002Fdocs\u002Fswarm\u002F)\n\n- **Orchestrator Chat** — ask the control plane for one task, a decomposed mission, or a full broadcast.\n- **Multi-Agent Control Plane** — see persistent Hermes Agents, roles, state, runtime, and routing wires in one surface.\n- **Kanban TaskBoard** — plan backlog, ready, running, review, blocked, and done lanes without leaving the workspace.\n- **Reports + Inbox** — review checkpoints, blockers, handoffs, and ready-for-human decisions.\n- **TUI View built in** — attach to tmux-backed workers or fall back to a live shell\u002Flog stream.\n\n---\n\n## ✨ What's inside\n\n- 💬 **Chat** — Real-time SSE streaming, tool call rendering, multi-session, markdown + syntax highlighting\n- 🧠 **Memory** — Browse, search, and edit agent memory; markdown live editor\n- 🧩 **Skills** — Browse 2,000+ skills with origin badges, filters, source paths, marketplace\n- 🔌 **MCP** — Full \u002Fmcp page (catalog + marketplace + sources), or fallback to local config CRUD\n- 📁 **Files + Terminal** — Full workspace file browser with Monaco; cross-platform PTY terminal\n- 🎮 **Operations** — Multi-agent dashboard with profile presets (Sage\u002FTrader\u002FBuilder\u002FScribe\u002FOps) and 'Needs setup' detection\n- 📡 **Conductor** — Mission dispatch + decomposition with dashboard-backed missions when available and Workspace-native Swarm fallback otherwise\n- 👥 **Agent View** — Live agent panel in chat with avatar, queue, history, usage meter\n- 🐝 **Swarm Mode** — Persistent tmux-backed Hermes Agent workers with role-based dispatch\n- 🗄️ **Dashboard** — Aggregated overview: sessions, model mix, cost ledger, attention card, ops strip\n- 🎨 **Themes** — Hermes, Nous, Bronze, Slate, Mono (light + dark)\n- 🔒 **Security** — Auth middleware on every route, CSP, path-traversal guard, fail-closed remote bind\n- 📱 **PWA + Tailscale** — Install as a native-feeling app; access from any device on your tailnet\n- ⚙️ **Capability gates** — Features that need upstream endpoints (Conductor) show a clean placeholder instead of failing mid-action\n\n---\n\n## 📸 Screenshots\n\n|                 Chat                 |                  Conductor                   |\n| :----------------------------------: | :------------------------------------------: |\n| ![Chat](.\u002Fdocs\u002Fscreenshots\u002Fchat.png) | ![Conductor](.\u002Fdocs\u002Fscreenshots\u002Fconductor.png) |\n\n|                   Dashboard                  |                  Memory                  |\n| :------------------------------------------: | :--------------------------------------: |\n| ![Dashboard](.\u002Fdocs\u002Fscreenshots\u002Fdashboard.png) | ![Memory](.\u002Fdocs\u002Fscreenshots\u002Fmemory.png) |\n\n|                   Terminal                   |                   Settings                   |\n| :------------------------------------------: | :------------------------------------------: |\n| ![Terminal](.\u002Fdocs\u002Fscreenshots\u002Fterminal.png) | ![Settings](.\u002Fdocs\u002Fscreenshots\u002Fsettings.png) |\n\n|                  Tasks                  |                 Jobs                 |\n| :--------------------------------------: | :----------------------------------: |\n| ![Tasks](.\u002Fdocs\u002Fscreenshots\u002Ftasks.png) | ![Jobs](.\u002Fdocs\u002Fscreenshots\u002Fjobs.png) |\n\n---\n\n## 🚀 Quick Start\n\nThree paths — pick the one that matches you:\n\n| Path | Best for | Time |\n|---|---|---|\n| **🐳 [Docker Compose](#-docker-quickstart)** | Self-hosters, home labs, \"give me a compose gig\" | ~2 min |\n| **🌐 One-line install** | Local dev on macOS\u002FLinux | ~3 min |\n| **🔌 Attach to existing `hermes-agent`** | You already run Hermes Agent | ~1 min |\n\n### One-line install\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Foutsourc-e\u002Fhermes-workspace\u002Fmain\u002Finstall.sh | bash\n```\n\nThis installs `hermes-agent` via Nous's official installer, clones this repo, sets up `.env`, and installs dependencies. Then:\n\n```bash\nhermes gateway run                  # terminal 1\ncd ~\u002Fhermes-workspace && pnpm dev   # terminal 2\n```\n\nOpen http:\u002F\u002Flocalhost:3000. That's it.\n\n---\n\n### Already running `hermes-agent`? Attach the workspace to it\n\nIf you already have `hermes-agent` installed (via Nous's official installer, a source checkout, systemd, Docker, or another existing setup) and it's serving the gateway at `http:\u002F\u002F\u003Chost>:8642`, you don't need to reinstall anything — just point the workspace at it.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Foutsourc-e\u002Fhermes-workspace.git\ncd hermes-workspace\npnpm install\ncp .env.example .env\n\n# Point at your existing Hermes Agent services.\necho 'HERMES_API_URL=http:\u002F\u002F127.0.0.1:8642' >> .env\n# Zero-fork installs also need the separate dashboard API for config\u002Fsessions\u002Fskills\u002Fjobs.\necho 'HERMES_DASHBOARD_URL=http:\u002F\u002F127.0.0.1:9119' >> .env\n\n# If your gateway was started with API_SERVER_KEY (auth enabled), set the same value:\n# echo 'HERMES_API_TOKEN=***' >> .env\n\npnpm dev                            # http:\u002F\u002Flocalhost:3000 (override with PORT=4000 pnpm dev)\n```\n\nRequirements on the agent side:\n\n- Gateway bound to an address the workspace can reach (typically `API_SERVER_HOST=0.0.0.0` + the port exposed).\n- `API_SERVER_ENABLED=true` in `~\u002F.hermes\u002F.env` (or the agent's env) so the gateway serves core APIs on `:8642`.\n- `hermes dashboard` running (default `http:\u002F\u002F127.0.0.1:9119`) for zero-fork installs. The dashboard provides config, sessions, skills, and jobs APIs.\n- If `API_SERVER_KEY` is set, the workspace must pass the same value via `HERMES_API_TOKEN` — otherwise leave both unset.\n\nVerify both services before opening the workspace:\n\n- `curl http:\u002F\u002F127.0.0.1:8642\u002Fhealth` should return ok.\n- `curl http:\u002F\u002F127.0.0.1:9119\u002Fapi\u002Fstatus` should return dashboard metadata.\n\nThen start the workspace and complete onboarding — it should detect the gateway + dashboard pair and unlock the enhanced panes automatically.\n\n#### Running on a remote host (Tailscale \u002F VPN \u002F LAN)\n\nIf the workspace and its browser live on different machines — e.g. the workspace runs on a Pi\u002FMac\u002Fhome server and you access it from your phone over Tailscale — point `HERMES_API_URL` at the **reachable** backend address, not `127.0.0.1`:\n\n```bash\n# On the server running the workspace + gateway:\necho 'HERMES_API_URL=http:\u002F\u002F100.x.y.z:8642' >> .env\necho 'HERMES_DASHBOARD_URL=http:\u002F\u002F100.x.y.z:9119' >> .env\n\n# Also tell the gateway to listen on all interfaces so Tailscale peers can reach it.\n# In ~\u002F.hermes\u002F.env (or wherever the gateway reads config):\necho 'API_SERVER_HOST=0.0.0.0' >> ~\u002F.hermes\u002F.env\n```\n\nThen restart the gateway, dashboard, and workspace. Hit the workspace from the remote device and the connection probe will use the Tailscale IP instead of localhost. Both `HERMES_API_URL` and `HERMES_DASHBOARD_URL` must be set to Tailscale\u002FLAN-reachable URLs — setting only one will leave the other probing `127.0.0.1` and failing.\n\n**If you've already started the workspace**, you can update both URLs from `Settings → Connection` without restarting. The values are persisted to `~\u002F.hermes\u002Fworkspace-overrides.json` and take effect immediately (gateway capabilities are reprobed on save). Editing `.env` still works for pre-start config and for CI\u002Fcontainers.\n\n---\n\n### Manual install\n\nHermes Workspace works with any OpenAI-compatible backend. If your backend also exposes Hermes Agent gateway APIs, enhanced features like sessions, memory, skills, and jobs unlock automatically.\n\n#### Prerequisites\n\n- **Node.js 22+** — [nodejs.org](https:\u002F\u002Fnodejs.org\u002F)\n- **An OpenAI-compatible backend** — local, self-hosted, or remote\n- **Optional:** Python 3.11+ if you want to run a Hermes Agent gateway locally\n\n#### Step 1: Start your backend\n\nPoint Hermes Workspace at any backend that supports:\n\n- `POST \u002Fv1\u002Fchat\u002Fcompletions`\n- `GET \u002Fv1\u002Fmodels` recommended\n\nExample Hermes Agent gateway setup (from scratch):\n\n```bash\n# Install hermes-agent via Nous's official installer\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FNousResearch\u002Fhermes-agent\u002Fmain\u002Fscripts\u002Finstall.sh | bash\n\n# Configure a provider + start the gateway\nhermes setup\nhermes gateway run\n```\n\nOur one-liner installer (below) does both steps automatically. If you're using another OpenAI-compatible server, just note its base URL.\n\n### Step 2: Install & Run Hermes Workspace\n\n```bash\n# In a new terminal\ngit clone https:\u002F\u002Fgithub.com\u002Foutsourc-e\u002Fhermes-workspace.git\ncd hermes-workspace\npnpm install\ncp .env.example .env\nprintf '\\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:8642\\n' >> .env\npnpm dev                   # Starts on http:\u002F\u002Flocalhost:3000\n```\n\n> **Verify:** Open `http:\u002F\u002Flocalhost:3000` and complete the onboarding flow. First connect the backend, then verify chat works. If your gateway exposes Hermes Agent APIs, advanced features appear automatically.\n\n#### Environment Variables\n\n```env\n# OpenAI-compatible backend URL\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:8642\n\n# Optional: provider keys the Hermes Agent gateway can read at runtime.\n# You only need the key(s) for whichever provider(s) you actually use.\n# OPENAI_API_KEY=sk-...                # GPT \u002F o-series \u002F OpenAI-compatible\n# OPENROUTER_API_KEY=sk-or-v1-...      # OpenRouter (incl. free models)\n# GOOGLE_API_KEY=AIza...               # Gemini\n# (Ollama \u002F LM Studio \u002F local servers don't need a key)\n\n# Optional: password-protect the web UI\n# HERMES_PASSWORD=your_password\n```\n\n---\n\n## 🧠 Local Models (Ollama, Atomic Chat, LM Studio, vLLM)\n\nHermes Workspace supports two modes with local models:\n\n### Portable Mode (Easiest)\n\nPoint the workspace directly at your local server — no Hermes Agent gateway needed.\n\n### Atomic Chat\n\n```bash\n# Start workspace pointed at Atomic Chat\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:1337\u002Fv1 pnpm dev\n```\n\nDownload [Atomic Chat](https:\u002F\u002Fatomic.chat\u002F), launch the desktop app, and make sure a model is loaded before starting Hermes Workspace.\n\n### Ollama\n\n```bash\n# Start Ollama\nOLLAMA_ORIGINS=* ollama serve\n\n# Start workspace pointed at Ollama\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:11434 pnpm dev\n```\n\nChat works immediately. Sessions, memory, and skills show \"Not Available\" — that's expected in portable mode.\n\n### Enhanced Mode (Full Features)\n\nRoute through the Hermes Agent gateway for sessions, memory, skills, jobs, and tools.\n\nHere are two explicit `~\u002F.hermes\u002Fconfig.yaml` examples for the local providers we support directly in the workspace:\n\n**Atomic Chat**\n\n```yaml\nprovider: atomic-chat\nmodel: your-model-name\ncustom_providers:\n  - name: atomic-chat\n    base_url: http:\u002F\u002F127.0.0.1:1337\u002Fv1\n    api_key: atomic-chat\n    api_mode: chat_completions\n```\n\n**Ollama**\n\n```yaml\nprovider: ollama\nmodel: qwen3:32b\ncustom_providers:\n  - name: ollama\n    base_url: http:\u002F\u002F127.0.0.1:11434\u002Fv1\n    api_key: ollama\n    api_mode: chat_completions\n```\n\nYou can adapt the same shape for other OpenAI-compatible local runners, but `Atomic Chat` and `Ollama` are the two built-in local paths documented in the workspace UI.\n\n**2. Enable the API server in `~\u002F.hermes\u002F.env`:**\n\n```env\nAPI_SERVER_ENABLED=true\n```\n\n**3. Start the gateway, dashboard, and workspace:**\n\n```bash\nhermes gateway run          # Starts core APIs on :8642\nhermes dashboard            # Starts dashboard APIs on :9119\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:8642 \\\nHERMES_DASHBOARD_URL=http:\u002F\u002F127.0.0.1:9119 \\\npnpm dev\n```\n\nFor authenticated gateways, also set `HERMES_API_TOKEN` in the workspace environment to the same value as `API_SERVER_KEY`.\n\nAll workspace features unlock automatically once both services are reachable — sessions persist, memory saves across chats, skills are available, and the dashboard shows real usage data.\n\n> **Works with any OpenAI-compatible server** — Atomic Chat, Ollama, LM Studio, vLLM, llama.cpp, LocalAI, etc. Just change the `base_url` and `model` in the config above.\n\n---\n\n## 🤝 Pair an Agent with the Workspace\n\nWorkspace is the UI. **Hermes Agent** is the brain. They talk over two HTTP services on localhost (or any reachable network).\n\n```\n┌───────────────┐         :8642 gateway          ┌────────────────┐\n│   Workspace    │ ─────────────────────▶ │  Hermes Agent  │\n│   :3000 (UI)   │ ◀───────────────────── │  CLI \u002F brain   │\n└───────────────┘         :9119 dashboard        └────────────────┘\n```\n\n### Two services, three commands\n\n```bash\nhermes gateway run     # terminal 1 · :8642 · chat, models, streaming, jobs\nhermes dashboard       # terminal 2 · :9119 · sessions, skills, config, MCP\ncd ~\u002Fhermes-workspace && pnpm dev   # terminal 3 · :3000 · the UI\n```\n\n> **Tip:** `pnpm start:all` starts gateway + dashboard + workspace in one shot if you've installed via the one-liner.\n\n### Windows (PowerShell + WSL) one-command startup\n\nIf you use Hermes Workspace from Windows with the agent running in WSL, use the helper script in this repo:\n\n```powershell\n# from the repo root\n.\\scripts\\start-hermes-workspace.ps1\n```\n\nTo force a clean relaunch of the tmux session:\n\n```powershell\n.\\scripts\\start-hermes-workspace.ps1 -Restart\n```\n\nOptional parameters:\n- `-Distro \u003Cname>` to target a non-default WSL distro\n- `-WorkspacePath \u003C\u002Fpath\u002Fin\u002Fwsl>` if your clone is not at `~\u002Fhermes-workspace`\n- `-SessionName \u003Cname>` to use a custom tmux session name\n\n### Verify the pairing\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8642\u002Fhealth        # → {\"status\":\"ok\",\"platform\":\"hermes-agent\"}\ncurl http:\u002F\u002F127.0.0.1:9119\u002Fapi\u002Fstatus    # → {\"status\":\"ok\", ...}\n```\n\nBoth must return `200`. If either fails, the workspace will fall back to **portable mode** (chat works, sessions\u002Fskills\u002Fmemory show \"Not Available\").\n\n### `.env` settings the workspace cares about\n\n```env\n# Required: where the gateway is\nHERMES_API_URL=http:\u002F\u002F127.0.0.1:8642\n\n# Recommended: where the dashboard is (unlocks sessions\u002Fskills\u002Fconfig\u002FMCP\u002Fjobs)\nHERMES_DASHBOARD_URL=http:\u002F\u002F127.0.0.1:9119\n\n# Only if your gateway was started with API_SERVER_KEY=... — paste the same value:\n# HERMES_API_TOKEN=***\n\n# Optional: password-protect the web UI itself\n# HERMES_PASSWORD=***\n```\n\n### Common pairing scenarios\n\n| Scenario | Set this |\n|---|---|\n| Workspace + gateway on the same machine | `HERMES_API_URL=http:\u002F\u002F127.0.0.1:8642`, `HERMES_DASHBOARD_URL=http:\u002F\u002F127.0.0.1:9119` |\n| Gateway on a remote server (Tailscale \u002F VPN) | Set both URLs to the reachable IP (e.g. `http:\u002F\u002F100.x.y.z:8642`) and add `API_SERVER_HOST=0.0.0.0` to the gateway's `~\u002F.hermes\u002F.env` |\n| Already-running `hermes-agent` from upstream installer | Just set `HERMES_API_URL` + `HERMES_DASHBOARD_URL` and skip the one-liner installer |\n| Multiple agent profiles | Profiles live under `~\u002F.hermes\u002Fprofiles\u002F\u003Cname>` — the dashboard switches between them at runtime; workspace follows automatically |\n\n### Live re-pairing (no restart)\n\nIf you've already started the workspace, change either URL from **Settings → Connection** without restarting. Values persist to `~\u002F.hermes\u002Fworkspace-overrides.json` and gateway capabilities are reprobed on save.\n\n### Troubleshooting\n\n- **`Could not reach Hermes gateway on 8645, 8642, or 8643`** — gateway isn't running, or `HERMES_API_URL` points somewhere unreachable. Run `hermes gateway run` and re-check.\n- **Workspace shows \"portable mode\" \u002F extended APIs missing** — dashboard isn't running. Start `hermes dashboard` in another terminal and refresh.\n- **`Unauthorized` on every API call** — gateway has `API_SERVER_KEY` set but workspace is missing `HERMES_API_TOKEN`. Match them.\n- **`Could not connect` from your phone over Tailscale** — gateway is bound to loopback. Set `API_SERVER_HOST=0.0.0.0` in `~\u002F.hermes\u002F.env` and restart it.\n\n---\n\n## 🐳 Docker Quickstart\n\n[![Open in GitHub Codespaces](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitHub%20Codespaces-Open-181717?logo=github)](https:\u002F\u002Fgithub.com\u002Fcodespaces\u002Fnew?hide_repo_select=true&ref=main&repo=outsourc-e\u002Fhermes-workspace)\n\nThe Docker setup runs both the **Hermes Agent gateway** and **Hermes Workspace** together.\n\n### Prerequisites\n\n- **Docker**\n- **Docker Compose**\n- **A configured Hermes Agent model provider** — run `hermes setup` \u002F `hermes model`, or provide a key for whichever provider you use. This workspace does not require Anthropic.\n\n### Step 1: Configure Environment\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Foutsourc-e\u002Fhermes-workspace.git\ncd hermes-workspace\ncp .env.example .env\n```\n\nEdit `.env` and add **at least one** LLM provider key — whichever provider you want hermes-agent to use:\n\n```env\n# Pick one (or more). You do NOT need all of these.\n# OPENAI_API_KEY=sk-...                # GPT \u002F o-series \u002F OpenAI-compatible\n# OPENROUTER_API_KEY=sk-or-v1-...      # OpenRouter (free models available)\n# GOOGLE_API_KEY=AIza...               # Gemini\n```\n\nUsing **Ollama, LM Studio, or another local server**? No key needed — just point hermes-agent at your local endpoint via the onboarding flow.\n\n> **Heads up:** `hermes-agent` needs to be able to reach _some_ model. If you don't configure any provider (API key or local server), chat will fail on first message.\n\n### Step 2: Start the Services\n\n```bash\ndocker compose up\n```\n\nThis pulls two pre-built images and starts them:\n\n- **hermes-agent** → `nousresearch\u002Fhermes-agent:latest` on port **8642**\n- **hermes-workspace** → `ghcr.io\u002Foutsourc-e\u002Fhermes-workspace:latest` on port **3000**\n\nNo local build. First run takes a minute to pull; subsequent starts are instant.\nAgent state (config, sessions, skills, memory, credentials) persists in the\nlegacy-named `claude-data` Docker volume, so containers can be recreated without data loss.\n\n### Step 3: Access the Workspace\n\nOpen `http:\u002F\u002Flocalhost:3000` and complete the onboarding.\n\n> **Verify:** Check the Docker logs for `[gateway] Connected to Hermes Agent` — this confirms the workspace successfully connected to the agent.\n\n### Building from source\n\nWant to hack on the workspace and have local changes hot-built into the\ncontainer? Use the dev overlay:\n\n```bash\ndocker compose -f docker-compose.yml -f docker-compose.dev.yml up --build\n```\n\nThe base `docker-compose.yml` stays untouched — the overlay adds a `build:`\nblock for the `hermes-workspace` service so the local repo is compiled\ninstead of pulled. The Hermes Agent service still uses the canonical\n`nousresearch\u002Fhermes-agent:latest` image; if you need a custom agent\nbuild, tag it locally and override `image:` in your own\n`compose.override.yml`.\n\n### Using a Pre-Built Image (Coolify \u002F Easypanel \u002F Dokploy \u002F Unraid)\n\nDeploying Hermes Workspace to a PaaS or home-lab stack? Pull the image\ndirectly from GitHub Container Registry:\n\n```\nghcr.io\u002Foutsourc-e\u002Fhermes-workspace:latest\n```\n\nAvailable tags:\n\n| Tag | What it is |\n|---|---|\n| `latest` | Latest `main` commit (stable; recommended) |\n| `v2.0.0` | Pinned semver tag |\n| `main-\u003Csha>` | Specific commit |\n\nMinimal Coolify \u002F Easypanel config:\n\n```yaml\nservice: hermes-workspace\nimage: ghcr.io\u002Foutsourc-e\u002Fhermes-workspace:latest\nport: 3000\nenv:\n  HERMES_API_URL: http:\u002F\u002Fhermes-agent:8642   # point at your gateway\n  HERMES_API_TOKEN: ${API_SERVER_KEY}        # if gateway auth is enabled\n```\n\nThe image is built for `linux\u002Famd64` and `linux\u002Farm64`. Pair it with either\na `nousresearch\u002Fhermes-agent:latest` container (what our `docker-compose.yml`\ndoes by default) or an existing gateway on another host.\n\n---\n\n## 📱 Install as App (Recommended)\n\nHermes Workspace is a **Progressive Web App (PWA)** — install it for the full native app experience with no browser chrome, keyboard shortcuts, and offline support.\n\n### 🖥️ Desktop (macOS \u002F Windows \u002F Linux)\n\n1. Open Hermes Workspace in **Chrome** or **Edge** at `http:\u002F\u002Flocalhost:3000`\n2. Click the **install icon** (⊕) in the address bar\n3. Click **Install** — Hermes Workspace opens as a standalone desktop app\n4. Pin to Dock \u002F Taskbar for quick access\n\n> **macOS users:** After installing, you can also add it to your Launchpad.\n\n### 📱 iPhone \u002F iPad (iOS Safari)\n\n1. Open Hermes Workspace in **Safari** on your iPhone\n2. Tap the **Share** button (□↑)\n3. Scroll down and tap **\"Add to Home Screen\"**\n4. Tap **Add** — the Hermes Workspace icon appears on your home screen\n5. Launch from home screen for the full native app experience\n\n### 🤖 Android\n\n1. Open Hermes Workspace in **Chrome** on your Android device\n2. Tap the **three-dot menu** (⋮) → **\"Add to Home screen\"**\n3. Tap **Add** — Hermes Workspace is now a native-feeling app on your device\n\n---\n\n## 📡 Mobile Access via Tailscale\n\nAccess Hermes Workspace from anywhere on your devices — no port forwarding, no VPN complexity.\n\n### Setup\n\n1. **Install Tailscale** on your Mac and mobile device:\n   - Mac: [tailscale.com\u002Fdownload](https:\u002F\u002Ftailscale.com\u002Fdownload)\n   - iPhone\u002FAndroid: Search \"Tailscale\" in the App Store \u002F Play Store\n\n2. **Sign in** to the same Tailscale account on both devices\n\n3. **Find your Mac's Tailscale IP:**\n\n   ```bash\n   tailscale ip -4\n   # Example output: 100.x.x.x\n   ```\n\n4. **Open Hermes Workspace on your phone:**\n\n   ```\n   http:\u002F\u002F100.x.x.x:3000\n   ```\n\n5. **Add to Home Screen** using the steps above for the full app experience\n\n> 💡 Tailscale works over any network — home wifi, mobile data, even across countries. Your traffic stays end-to-end encrypted.\n\n---\n\n## 🖥️ Native Desktop App\n\n> **Status: In Development** — A native Electron-based desktop app is in active development.\n\nThe desktop app will offer:\n\n- Native window management and tray icon\n- System notifications for agent events and mission completions\n- Auto-launch on startup\n- Deep OS integration (macOS menu bar, Windows taskbar)\n\n**In the meantime:** Install Hermes Workspace as a PWA (see above) for a near-native desktop experience — it works great.\n\n---\n\n## ☁️ Cloud & Hosted Setup\n\n> **Status: Coming Soon**\n\nA fully managed cloud version of Hermes Workspace is in development:\n\n- **One-click deploy** — No self-hosting required\n- **Multi-device sync** — Access your agents from any device\n- **Team collaboration** — Shared mission control for your whole team\n- **Automatic updates** — Always on the latest version\n\nFeatures pending cloud infrastructure:\n\n- Cross-device session sync\n- Team shared memory and workspaces\n- Cloud-hosted backend with managed uptime\n- Webhook integrations and external triggers\n\n---\n\n## 🔒 Security & deployment env vars\n\nKey safeguards — most are on by default, the env vars below are for remote \u002F Docker deployments where you opt out of the loopback default.\n\n### Built-in safeguards\n\n- Auth middleware on every API route\n- CSP headers via meta tags\n- Path-traversal prevention on file\u002Fmemory routes (real-path boundary check, not string prefix)\n- Rate limiting on endpoints\n- Fail-closed startup guard: refuses to bind non-loopback without `HERMES_PASSWORD`\n- Session cookies: `HttpOnly` + `SameSite=Strict` + `Secure` (in production)\n- Optional password protection for the web UI\n\n### Env vars for remote \u002F Docker deployments\n\n- `HERMES_PASSWORD` — required whenever `HOST ≠ 127.0.0.1` (legacy `CLAUDE_PASSWORD` still honored as a fallback)\n- `COOKIE_SECURE=1` — force the `Secure` cookie flag when terminating HTTPS at a proxy\n- `COOKIE_SECURE=0` — disable the `Secure` flag for plain-HTTP LAN deployments (`HOST=0.0.0.0` without HTTPS); without this, browsers silently drop session cookies and login fails (#149)\n- `TRUST_PROXY=1` — trust `x-forwarded-for` \u002F `x-real-ip` (only set behind a sanitizing reverse proxy)\n- `HERMES_DASHBOARD_TOKEN` — explicit bearer for dashboard API (preferred over the legacy HTML-scrape fallback)\n- `HERMES_API_TOKEN` — bearer for the Hermes Agent gateway when started with `API_SERVER_KEY` (legacy `CLAUDE_API_TOKEN` still honored)\n- `HERMES_ALLOW_INSECURE_REMOTE=1` — bypass the fail-closed guard (not recommended)\n\nSee `.env.example` for the full list. Credits to [@kiosvantra](https:\u002F\u002Fgithub.com\u002Fkiosvantra) for the security audit surfacing #121–#125.\n\n---\n\n## 🔧 Troubleshooting\n\n### \"Workspace loads but chat doesn't work\"\n\nThe workspace auto-detects your gateway's capabilities on startup. Check your terminal for a line like:\n\n```\n[gateway] http:\u002F\u002F127.0.0.1:8642 available: health, models; missing: sessions, skills, memory, config, jobs\n[gateway] Missing Hermes Agent APIs detected. Update hermes-agent to the latest version.\n```\n\n**Fix:** Upgrade to the latest stock `hermes-agent`, which ships the extended endpoints:\n\n```bash\ncd ~\u002Fhermes-agent && git pull && uv pip install -e .\nhermes gateway run\n```\n\n(If you installed via a different path, follow your Nous installer's upgrade instructions.) If you were on the old `outsourc-e\u002Fhermes-agent` fork, it's no longer needed as of v2 — uninstall it and use upstream instead.\n\n### \"Connection refused\" or workspace hangs on load\n\nYour Hermes Agent gateway isn't running. Start it:\n\n```bash\nhermes gateway run\n```\n\nFirst-time run? Do `hermes setup` first to pick a provider and model.\n\n### Ollama: chat returns empty or model shows \"Offline\"\n\nMake sure your `~\u002F.hermes\u002Fconfig.yaml` has the `custom_providers` section and `API_SERVER_ENABLED=true` in `~\u002F.hermes\u002F.env`. See [Local Models](#-local-models-ollama-lm-studio-vllm) above.\n\nAlso ensure Ollama is running with CORS enabled:\n\n```bash\nOLLAMA_ORIGINS=* ollama serve\n```\n\nUse `http:\u002F\u002F127.0.0.1:11434\u002Fv1` (not `localhost`) as the base URL.\n\nVerify: `curl http:\u002F\u002Flocalhost:8642\u002Fhealth` should return `{\"status\": \"ok\"}`.\n\n### \"Using upstream NousResearch\u002Fhermes-agent\"\n\nv2+ runs on vanilla `hermes-agent`. **No fork required.** The upstream ships every endpoint the workspace needs for chat, sessions, memory, skills, config, jobs, MCP, terminal, and Agent View.\n\n**Conductor note:** when the dashboard mission API is available, Workspace uses it directly. When that endpoint is absent, Workspace uses its native Swarm fallback and returns `mode: native-swarm`. The fallback dispatches through Workspace Swarm workers, keeps status available through `\u002Fapi\u002Fconductor-spawn?missionId=...`, and cancels through `\u002Fapi\u002Fconductor-stop`.\n\nIf you're pinned to an older `hermes-agent` version and missing core endpoints, the workspace will degrade gracefully to **portable mode** with basic chat — upgrade upstream to restore full features.\n\n### Docker: \"Unauthorized\" or \"Connection refused\" to hermes-agent\n\nIf using Docker Compose and getting auth errors:\n\n1. **Check at least one provider key is set:**\n\n   ```bash\n   grep -E '_API_KEY' .env\n   # Should show one of: OPENAI_API_KEY, OPENROUTER_API_KEY, GOOGLE_API_KEY, or another provider key you intentionally use.\n   ```\n\n   (hermes-agent reads whichever key matches the provider configured in `~\u002F.hermes\u002Fconfig.yaml`.)\n\n2. **View the agent container logs:**\n\n   ```bash\n   docker compose logs hermes-agent\n   ```\n\n   Look for startup errors or missing API key warnings.\n\n3. **Verify the agent health endpoint:**\n\n   ```bash\n   curl http:\u002F\u002Flocalhost:8642\u002Fhealth\n   # Should return: {\"status\": \"ok\"}\n   ```\n\n4. **Restart with fresh containers:**\n\n   ```bash\n   docker compose down\n   docker compose up --build\n   ```\n\n5. **Check workspace logs for gateway status:**\n   ```bash\n   docker compose logs hermes-workspace\n   ```\n   Look for: `[gateway] http:\u002F\u002Fhermes-agent:8642 mode=...` — if it shows `mode=disconnected`, the agent isn't running correctly.\n\n### Docker: older `claude webapi` docs are wrong\n\nThe `claude webapi` command referenced in some pre-rename docs doesn't exist. The correct commands are:\n\n```bash\nhermes gateway run    # FastAPI gateway on :8642\nhermes dashboard      # dashboard plugin on :9119 (sessions\u002Fskills\u002Fjobs\u002Fconfig)\n```\n\nThe Docker setup runs both automatically — no action needed if using `docker compose up`.\n\n---\n\n## 🗺️ Roadmap\n\n### Shipped ✅\n\n| Feature | What it does |\n|---|---|\n| Chat + SSE streaming | Live agent output with tool call rendering |\n| Files + Terminal | Full workspace file browser + cross-platform PTY |\n| Memory + Skills browsers | Edit memory, browse 2,000+ skills with marketplace |\n| Dashboard | Sessions, model mix, cost ledger, attention card |\n| Operations | Multi-agent management with preset personas |\n| Agent View | Live agent panel in chat |\n| Swarm Mode | Persistent tmux-backed worker pool with role dispatch |\n| MCP page | Full catalog + marketplace + sources |\n| Mobile PWA + Tailscale | Install as native-feeling app on any device |\n| Themes | Hermes \u002F Nous \u002F Bronze \u002F Slate \u002F Mono (light + dark) |\n| Capability gates | Graceful 'upstream not ready' placeholders |\n| Multi-provider | OpenAI\u002FOpenAI-compatible, OpenRouter, Google, Ollama, LM Studio, vLLM, Atomic Chat, and other Hermes-supported providers |\n\n### In progress 🔨\n\n| Feature | Status |\n|---|---|\n| Conductor missions | Workspace UI is shipped; uses dashboard mission API when available and Workspace-native Swarm fallback otherwise (see [#262](https:\u002F\u002Fgithub.com\u002Foutsourc-e\u002Fhermes-workspace\u002Fissues\u002F262)) |\n| Native Desktop App (Electron) | Spec'd; PWA install path works today |\n\n### Coming 🔜\n\n| Feature | Status |\n|---|---|\n| Cloud \u002F Hosted version | Pending infra |\n| Team collaboration | Pending cloud + multi-tenant work |\n\n---\n\n## ⭐ Star History\n\n## [![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=outsourc-e\u002Fhermes-workspace&type=date&logscale&legend=top-left)](https:\u002F\u002Fwww.star-history.com\u002F#outsourc-e\u002Fhermes-workspace&type=date&logscale&legend=top-left)\n\n## 💛 Support the Project\n\nHermes Workspace is free and open source. If it's saving you time and powering your workflow, consider supporting development:\n\n**ETH:** `0xB332D4C60f6FBd94913e3Fd40d77e3FE901FAe22`\n\n[![GitHub Sponsors](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSponsor-%E2%9D%A4-pink?logo=github)](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Foutsourc-e)\n\nEvery contribution helps keep this project moving. Thank you 🙏\n\n---\n\n## 🤝 Contributing\n\nPRs are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n- Bug fixes → open a PR directly\n- New features → open an issue first to discuss\n- Security issues → see [SECURITY.md](SECURITY.md) for responsible disclosure\n\n---\n\n## 📄 License\n\nMIT — see [LICENSE](LICENSE) for details.\n\n---\n\n\u003Cdiv align=\"center\">\n  \u003Csub>Built with ⚡ by \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Foutsourc-e\">@outsourc-e\u003C\u002Fa> and the Hermes Workspace community\u003C\u002Fsub>\n\u003C\u002Fdiv>\n","Hermes Workspace 是一个为 Hermes Agent 设计的原生网页工作区，集成了聊天、终端、记忆、技能和检查器等功能。项目采用 React 和 TypeScript 构建，提供了实时聊天、多会话支持、内存浏览与编辑、超过2000种技能的管理和查看等核心功能。此外，它还引入了 Swarm 模式，能够实现多个 Hermes 代理的协调调度，通过角色分配自动处理不同类型的任务，减少人工干预。适用于需要高效管理AI代理及其任务执行过程的场景，如软件开发协作、研究实验管理以及自动化运维等领域。",2,"2026-06-11 03:49:59","high_star"]