[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2114":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":15,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},2114,"hermes_client","lotsoftick\u002Fhermes_client","lotsoftick","Web client for Hermes agent ","",null,"TypeScript",222,13,7,1,0,9,78,3,57.74,"MIT License",false,"main",true,[26,27,28,29,30,31],"ai-ui","client","dashboard","hermes","hermes-agent","react","2026-06-12 04:00:13","# Hermes Client\n\nA web-based chat interface for the [Hermes Agent](https:\u002F\u002Fhermes-agent.nousresearch.com\u002F) by Nous Research. Manage multiple Hermes profiles as separate \"agents\", run conversations with full streaming, and configure cron jobs, skills, and plugins — all through a clean modern UI.\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F88351710-65c9-4052-bdca-7be3d788b7f0\n\n## Features\n\n- **Multi-agent via Hermes profiles** — every UI \"agent\" maps 1:1 to a Hermes [profile](https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Fprofiles), each with its own home directory, config, and sessions. Add, rename, and delete profiles from the UI; the corresponding `hermes profile …` commands run under the hood.\n- **CLI-driven streaming chat** — every turn spawns `hermes -p \u003Cprofile> chat -Q -q \"\u003Cmessage>\"` and streams its stdout to the browser over Server-Sent Events. No `hermes gateway` required, no extra ports to open, no separate API server to babysit.\n- **Cross-app session sync** — sessions started in a standalone `hermes` REPL automatically appear in the sidebar within seconds. Continue a web-UI conversation from the terminal with `hermes -p \u003Cprofile> chat -r \u003CsessionKey>` and new turns stream straight back into the open chat.\n- **Interactive setup terminal** — an `xterm.js` drawer (backed by a tiny Python PTY bridge that ships with the API) hosts the real `hermes -p \u003Cprofile> model` (and other config) commands when you create or reconfigure an agent, so API key wizards and arrow-key model pickers Just Work.\n- **Brand model icons** — each agent shows its provider's logo (OpenAI, Anthropic, Google, Mistral, OpenRouter, Nous, …) sourced from [`@lobehub\u002Ficons`](https:\u002F\u002Fgithub.com\u002Flobehub\u002Flobe-icons), with a one-click \"configure model\" prompt when none is set.\n- **File uploads** — drag files into the composer; they're stored under `~\u002F.hermes_client\u002Fuploads\u002F\u003CconversationId>\u002F` and Hermes is invoked with absolute paths via `--image` (for images) or referenced inline in the prompt (for everything else).\n- **Cron, skills, plugins** — surface Hermes' `cron`, `skills list`, and `plugins list\u002Fenable\u002Fdisable` subcommands through the same UI shell.\n- **User authentication** — JWT-based auth with a default admin account created on first run.\n- **Theming** — built-in color themes with a sidebar picker; the interactive terminal inherits the active theme's sidebar palette.\n- **Installable PWA** — runs as a standalone desktop\u002Fmobile app via the browser's \"Install app\" feature.\n\n## Prerequisites\n\n- [Node.js](https:\u002F\u002Fnodejs.org\u002F) 18+\n- [Hermes Agent](https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fgetting-started\u002Finstallation) installed with `hermes` on your `PATH`\n\nVerify Hermes is set up:\n\n```bash\nhermes --version\nhermes status\n```\n\nThat's it — no `hermes gateway`, no `API_SERVER_*` config, no shared API key. The backend resolves the binary itself via `$PATH` plus a curated list of fallback locations (`~\u002F.local\u002Fbin`, `~\u002F.hermes\u002Fhermes-agent\u002Fvenv\u002Fbin`, Homebrew prefixes…), so launchers like Finder, Cursor, and `launchd` work without a custom shell login.\n\nIf you keep `hermes` somewhere unusual, set `HERMES_BIN` in `api\u002F.env` to its absolute path.\n\n### Platform notes\n\n- **macOS \u002F Linux** — works out of the box.\n- **Windows 10\u002F11** — supported. Additionally requires:\n  - **Git for Windows** (the auto-update flow uses `git`)\n  - **Visual Studio Build Tools** (for the native module `better-sqlite3`).\n  - Run **PowerShell as Administrator** the first time you execute `npm start` so that\n    `npm link` can create the global `hermes_client` shim, and so that auto-start can\n    be installed.\n\n## Quick Start\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Flotsoftick\u002Fhermes_client.git\ncd hermes_client\nnpm start\n```\n\n`npm start` builds everything, deploys to `~\u002F.hermes_client`, installs an OS-appropriate auto-start (macOS **LaunchAgent**, Windows **Startup folder** shortcut), and installs the global **`hermes_client`** command.\n\n| Service  | URL                             |\n| -------- | ------------------------------- |\n| Client   | http:\u002F\u002Flocalhost:18888          |\n| API      | http:\u002F\u002Flocalhost:18889          |\n| API Docs | http:\u002F\u002Flocalhost:18889\u002Fapi\u002Fdocs |\n\n> **Note:** API Docs (Swagger) are only available in development mode (`npm run dev`).\n\n## Default Login\n\nOn first startup, a default admin user is created:\n\n- **Email:** `admin@admin.com`\n- **Password:** `123456`\n\n## Service Commands\n\nAfter `npm start`, the **`hermes_client`** command works from any directory:\n\n| Command                           | What it does                                                           |\n| --------------------------------- | ---------------------------------------------------------------------- |\n| `hermes_client start`             | Start servers from `~\u002F.hermes_client` (no build)                       |\n| `hermes_client stop`              | Stop servers                                                           |\n| `hermes_client restart`           | Stop + start                                                           |\n| `hermes_client status`            | Show service status                                                    |\n| `hermes_client uninstall`         | Remove auto-start, global CLI, api & client artifacts (keeps database) |\n| `hermes_client uninstall --purge` | Also delete database (asks for confirmation)                           |\n\nTo rebuild after code changes, run **`npm start`** from the repo again.\n\n## npm Scripts\n\n| Command         | Description                                                  |\n| --------------- | ------------------------------------------------------------ |\n| `npm start`     | Build, deploy to `~\u002F.hermes_client`, LaunchAgent, global CLI |\n| `npm run stop`  | Stop servers                                                 |\n| `npm run dev`   | API (nodemon) + Client (Vite) in dev mode with hot reload    |\n| `npm run setup` | Generate `api\u002F.env` only                                     |\n\n## Configuration\n\n### Ports (`~\u002F.hermes_client\u002F.env`)\n\nPort configuration lives in a single user-level file at **`~\u002F.hermes_client\u002F.env`**. It is created automatically on first run with sensible defaults.\n\n| Variable               | Default | Description                                                                                          |\n| ---------------------- | ------- | ---------------------------------------------------------------------------------------------------- |\n| `API_PORT`             | `18889` | Port the API listens on                                                                              |\n| `CLIENT_PORT`          | `18888` | Port the web UI uses                                                                                 |\n| `USE_RELATIVE_API_URL` | `0`     | When `1`, the browser issues same-origin requests to `\u002Fapi` and `\u002Fws` instead of `http:\u002F\u002Fhost:18889` |\n\nAfter changing a value, apply it with:\n\n```bash\nhermes_client restart       # production (installed via `npm start`)\nnpm run dev                 # development\n```\n\n### API environment (`api\u002F.env`)\n\nGenerated automatically on first run (see `api\u002F.env.example` for reference):\n\n| Variable                    | Default                    | Description                                                                                                                      |\n| --------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |\n| `NODE_ENV`                  | `development`              | Environment mode                                                                                                                 |\n| `JWT_SECRET`                | _(random)_                 | Secret for JWT signing (also authenticates `\u002Fws\u002Fpty` upgrades)                                                                   |\n| `DB_PATH`                   | `.\u002Fdata\u002Fhermes.sqlite`     | Path to SQLite database file                                                                                                     |\n| `PORT`                      | _(API_PORT)_               | API listen port (driven by `~\u002F.hermes_client\u002F.env`)                                                                              |\n| `ALLOWED_DOMAIN`            | _(unset — allow all)_      | CORS allowlist, comma-separated; only enforced when `HERMES_STRICT_CORS=1`                                                       |\n| `HERMES_STRICT_CORS`        | _(off)_                    | Set to `1` to reject any origin not in `ALLOWED_DOMAIN`                                                                          |\n| `API_PUBLIC_URL`            | _(derived from request)_   | Optional fallback origin for upload URLs when no `Host` header                                                                   |\n| `HERMES_BIN`                | resolved automatically     | Override the absolute path to the `hermes` CLI binary                                                                            |\n| `HERMES_HOME`               | `~\u002F.hermes`                | Override Hermes home directory                                                                                                   |\n| `HERMES_CLIENT_UPLOADS_DIR` | `~\u002F.hermes_client\u002Fuploads` | Override where uploaded files are stored on disk                                                                                 |\n| `HERMES_SINGLE_USER_MODE`   | `1` in prod, `0` otherwise | Lock the UI to a single-user `Account` self-edit page (no multi-user `Users` admin); accepts `1\u002Ftrue\u002Fyes\u002Fon` or `0\u002Ffalse\u002Fno\u002Foff` |\n\n> **CORS \u002F remote access.** Hermes Client is a single-user local app. By\n> default the API allows every origin and the client derives the API URL\n> from `window.location`, so the same install works on `localhost`, on a\n> LAN IP, and over Tailscale without any extra configuration. To lock it\n> down to a fixed allowlist, set `ALLOWED_DOMAIN` and `HERMES_STRICT_CORS=1`\n> in `api\u002F.env` (or `~\u002F.hermes_client\u002Fapi\u002F.env` for production installs).\n\nThe client picks its API origin at runtime: `__HERMES_CONFIG__.apiBaseUrl`\n(injected by the production static server from the request host) ▸\n`VITE_API_BASE_URL` (build-time override) ▸ derived from\n`window.location` + `VITE_API_PORT`.\n\nTo regenerate secrets, delete `api\u002F.env` and run `npm run dev` or `npm run setup` again.\n\n### Production Layout\n\nWhen running `npm start`, built artifacts are deployed to `~\u002F.hermes_client\u002F`:\n\n```\n~\u002F.hermes_client\u002F\n├── api\u002F\n│   ├── build\u002F          # Compiled API (JavaScript)\n│   ├── node_modules\u002F   # Production dependencies only\n│   └── .env            # Auto-generated on first deploy\n├── client\u002F\n│   ├── dist\u002F           # Built static frontend\n│   └── serve.mjs       # Lightweight static file server\n├── data\u002F\n│   └── hermes.sqlite   # SQLite database (UI metadata + a mirror of Hermes session messages)\n├── uploads\u002F\n│   └── \u003CconversationId>\u002F   # Files attached to messages, passed to Hermes by absolute path\n└── hermes.log          # Combined log output\n```\n\nHermes' own conversation state continues to live under `~\u002F.hermes\u002F` (sessions, skills, plugins, profiles…). The Hermes Client never writes there directly — it only invokes the `hermes` CLI and reads session JSON files for sync.\n\nThe source directory is only needed for building. Production processes run entirely from `~\u002F.hermes_client\u002F`.\n\n## Install as an App (PWA)\n\nOnce the client is running, Chromium-based browsers (Chrome, Edge, Brave, Arc, Opera) detect that the app is installable:\n\n- An **Install app** banner appears in the sidebar — click it to install.\n- Alternatively, click the install icon in the address bar, or use the browser menu (**More → Install Hermes…**).\n\nAfter install, the app launches in its own window (no tabs, own dock\u002Ftaskbar icon) and behaves like a native desktop app. It still communicates with the local API server — the PWA is a UI shell, not a replacement for the background service.\n\n| Browser             | Support                                                                          |\n| ------------------- | -------------------------------------------------------------------------------- |\n| Chrome \u002F Edge \u002F Arc | Full — custom install banner, standalone window, auto-updates via service worker |\n| Brave \u002F Opera       | Full                                                                             |\n| Safari (macOS\u002FiOS)  | \"Add to Dock\" \u002F \"Add to Home Screen\" from the Share menu                         |\n| Firefox             | Not installable (Firefox disabled PWA install on desktop); runs as a normal tab  |\n","Hermes Client 是一个基于Web的聊天界面，专为Nous Research开发的Hermes Agent设计。该项目使用TypeScript编写，提供了一个现代且直观的用户界面来管理多个Hermes配置文件作为独立的“代理”，支持全流式对话，并允许通过UI配置定时任务、技能和插件。其核心技术特点包括多代理支持、CLI驱动的实时聊天功能、跨应用会话同步、交互式设置终端以及品牌模型图标展示等。特别适合需要在一个统一且易于操作的平台上管理和与多个AI代理进行交互的场景，如个人或企业级AI助手的应用环境。",2,"2026-06-11 02:48:14","CREATED_QUERY"]