{"id":48439888,"url":"https://github.com/euraika-labs/pan-ui","last_synced_at":"2026-04-06T15:01:05.757Z","repository":{"id":349211656,"uuid":"1201415957","full_name":"Euraika-Labs/pan-ui","owner":"Euraika-Labs","description":"Pan by Euraika — a self-hosted AI workspace for Hermes Agent. Chat, skills, extensions, memory, profiles, and runtime controls.","archived":false,"fork":false,"pushed_at":"2026-04-06T12:00:56.000Z","size":4076,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-06T12:17:49.383Z","etag":null,"topics":["agent","ai-workspace","euraika","hermes","mcp","nextjs","observability","pan","self-hosted","typescript","webui"],"latest_commit_sha":null,"homepage":"https://github.com/Euraika-Labs/pan-ui#readme","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Euraika-Labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-04T16:43:39.000Z","updated_at":"2026-04-06T12:01:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Euraika-Labs/pan-ui","commit_stats":null,"previous_names":["euraika-labs/hermesagentwebui","euraika-labs/pan-ui"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Euraika-Labs/pan-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Euraika-Labs%2Fpan-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Euraika-Labs%2Fpan-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Euraika-Labs%2Fpan-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Euraika-Labs%2Fpan-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Euraika-Labs","download_url":"https://codeload.github.com/Euraika-Labs/pan-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Euraika-Labs%2Fpan-ui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31477013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T14:34:32.243Z","status":"ssl_error","status_checked_at":"2026-04-06T14:34:31.723Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","ai-workspace","euraika","hermes","mcp","nextjs","observability","pan","self-hosted","typescript","webui"],"created_at":"2026-04-06T15:01:04.801Z","updated_at":"2026-04-06T15:01:05.750Z","avatar_url":"https://github.com/Euraika-Labs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pan by Euraika\n\n[![CI](https://github.com/Euraika-Labs/pan-ui/actions/workflows/ci.yml/badge.svg)](https://github.com/Euraika-Labs/pan-ui/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/Euraika-Labs/pan-ui/actions/workflows/codeql.yml/badge.svg)](https://github.com/Euraika-Labs/pan-ui/actions/workflows/codeql.yml)\n[![npm](https://img.shields.io/npm/v/@euraika-labs/pan-ui)](https://www.npmjs.com/package/@euraika-labs/pan-ui)\n[![Release](https://img.shields.io/github/v/release/Euraika-Labs/pan-ui?display_name=tag)](https://github.com/Euraika-Labs/pan-ui/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n\nA self-hosted web interface for [Hermes Agent](https://github.com/NousResearch/hermes-agent) — the AI agent by Nous Research. Chat with your agent, manage skills from the skills.sh marketplace, control extensions and MCP integrations, inspect memory, and operate profiles — all from a single dashboard with live runtime awareness.\n\n![Pan chat with runtime tools](docs/assets/screenshots/chat-runtime.png)\n\n## Why Pan\n\nPan is not a generic chat wrapper. It exposes the full operational surface of a running Hermes Agent instance:\n\n- **Chat with streaming** — SSE-based streaming connected to a real Hermes runtime, with tool timelines, approval cards, and artifact rendering\n- **Skills marketplace** — Browse 112+ installed skills across 27 categories, discover and install 268+ more from [skills.sh](https://skills.sh) with one click\n- **MCP integrations** — View installed MCP servers, their tools, health status, and diagnostics\n- **Persistent memory** — Inspect and edit both global (shared) and profile-scoped user/agent memory, with proper `§`-separated entry parsing\n- **Profile isolation** — Each profile is a full workspace boundary with its own sessions, skills, memory, API keys, and policy presets\n- **Runtime operations** — Approvals, run history, audit trails, telemetry, runtime health, and JSON/CSV exports\n\n## Screenshots\n\n### Login\n\n![Login screen](docs/assets/screenshots/login.png)\n\n### Chat\n\nStreaming chat connected to a live Hermes runtime. Session sidebar with search, pinning, and archiving. Tool timelines expand inline. Composer shows active model, mode, tools, and profile.\n\n![Empty chat workspace](docs/assets/screenshots/chat-empty.png)\n\n![Active chat with runtime output](docs/assets/screenshots/chat-runtime.png)\n\n### Skills — Installed\n\n112 installed skills across 27 categories. Search by name, tag, or category. Each card shows source, tags, linked files count, and whether it's loaded in the current session.\n\n![Skills installed tab](docs/assets/screenshots/skills-installed.png)\n\n### Skills — Discover\n\nBrowse and install skills from the skills.sh hub. Trust badges (Trusted / Official / Community), install counts, security audit results, and direct links to repos.\n\n![Skills discover tab](docs/assets/screenshots/skills-discover.png)\n\n### Extensions \u0026 MCP\n\nInstalled MCP servers with tool inventories, health badges, and capability toggles. Test connections and view diagnostics.\n\n![Extensions page](docs/assets/screenshots/extensions.png)\n\n### Memory\n\nGlobal memory (shared across profiles) displayed as read-only cards with a blue \"shared\" badge. Profile-scoped memory is editable. Entries are separated by `§` and counted correctly.\n\n![Memory page](docs/assets/screenshots/memory.png)\n\n### Profiles\n\nProfile-based workspace isolation. Each profile scopes sessions, skills, memory, extensions, and API keys. Policy presets (safe-chat, research, builder, full-power) control tool access and guardrails.\n\n![Profiles page](docs/assets/screenshots/profiles.png)\n\n### Settings\n\nRuntime status, health monitoring, model selection, run history, audit browser, telemetry, approvals, and MCP diagnostics.\n\n![Settings page](docs/assets/screenshots/settings.png)\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------| \n| Framework | Next.js 15 (App Router) |\n| Language | TypeScript |\n| State | TanStack Query v5 |\n| Styling | Tailwind CSS 4 |\n| Testing | Vitest + Playwright |\n| Runtime | Node.js 20+ |\n\n## Quick Start\n\n### Via npx (recommended)\n\n```bash\nnpx @euraika-labs/pan-ui\n```\n\nThe setup wizard will guide you through connecting to your Hermes runtime on first launch.\n\n### From source\n\n```bash\n# 1. Clone and install\ngit clone https://github.com/Euraika-Labs/pan-ui.git\ncd pan-ui\nnpm install\n\n# 2. Start in dev mode (connects to local Hermes instance)\nnpm run dev\n\n# 3. Open in browser\nopen http://localhost:3199\n```\n\nDefault credentials: `admin` / `changeme`\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `HERMES_MOCK_MODE` | `true` | Set `false` to connect to a real Hermes instance |\n| `HERMES_HOME` | `~/.hermes` | Hermes home directory |\n| `HERMES_API_BASE_URL` | `http://127.0.0.1:8642` | Hermes API endpoint |\n| `HERMES_API_KEY` | — | API key for Hermes (if configured) |\n| `HERMES_WORKSPACE_USERNAME` | `admin` | Login username |\n| `HERMES_WORKSPACE_PASSWORD` | `changeme` | Login password |\n| `HERMES_WORKSPACE_SESSION_SECRET` | — | Cookie signing secret |\n| `PORT` | `3199` | Pan UI port |\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────┐\n│                   Browser                        │\n│  Next.js App Router + TanStack Query + Tailwind  │\n└───────────────────────┬─────────────────────────┘\n                        │ fetch / SSE\n┌───────────────────────▼─────────────────────────┐\n│              Next.js API Routes                  │\n│  /api/chat/stream    /api/skills    /api/memory  │\n│  /api/profiles       /api/extensions  /api/runtime│\n└──────┬────────────────┬─────────────────────────┘\n       │                │\n       ▼                ▼\n┌──────────────┐  ┌──────────────────────────────┐\n│ Hermes API   │  │ Hermes Filesystem            │\n│ :8642        │  │ ~/.hermes/                   │\n│ OpenAI-compat│  │  ├─ profiles/                │\n│ SSE streaming│  │  ├─ skills/                  │\n└──────────────┘  │  ├─ memories/                │\n                  │  └─ state.db                 │\n                  └──────────────────────────────┘\n```\n\n- **Chat streaming** bridges the Hermes OpenAI-compatible `/v1/chat/completions` SSE endpoint to Pan\n- **Skills** are read from `~/.hermes/skills/` with YAML frontmatter parsing; hub skills come from the skills.sh cache\n- **Sessions** are read from `state.db` (SQLite) via the Hermes filesystem\n- **Memory** reads/writes `USER.md` and `MEMORY.md` files at both global and profile scope\n- **Profiles** map to `~/.hermes/profiles/\u003cname\u003e/` directories, each with their own config, memories, sessions, and skills\n\n## Project Structure\n\n```\nsrc/\n├── app/                  # Next.js routes and API endpoints\n│   ├── api/              # Server-side API routes\n│   │   ├── chat/         # Chat stream, sessions\n│   │   ├── skills/       # Skills CRUD, hub, categories\n│   │   ├── memory/       # User/agent memory, context inspector\n│   │   ├── profiles/     # Profile CRUD\n│   │   ├── extensions/   # MCP extensions\n│   │   └── runtime/      # Health, approvals, runs, export\n│   └── [page]/           # Client page routes\n├── features/             # UI feature modules\n│   ├── chat/             # Chat screen, composer, transcript, tools\n│   ├── skills/           # Skills browser, detail, hub cards\n│   ├── memory/           # Memory editor, context inspector\n│   ├── extensions/       # Extension cards, tool inventory\n│   ├── profiles/         # Profile management, switcher\n│   ├── sessions/         # Session sidebar, search\n│   └── settings/         # Runtime, health, audit, approvals, runs\n├── server/               # Server-side logic\n│   └── hermes/           # Hermes filesystem bridge\n├── components/           # Shared layout and UI components\n├── lib/                  # Types, schemas, stores, utilities\n└── styles/               # Global CSS and theme variables\ntests/\n├── unit/                 # Vitest unit tests\n└── e2e/                  # Playwright end-to-end tests\ndocs/                     # Architecture, specs, and screenshots\n```\n\n## Verification\n\n```bash\nnpm run lint          # ESLint\nnpm run test          # Vitest unit tests\nnpm run build         # Production build\nnpm run test:e2e      # Playwright e2e (requires running dev server)\n```\n\n## Security\n\n- CLI commands use an allowlist guard (`ALLOWED_COMMANDS`) before `execFileSync` — no arbitrary command injection\n- Profile isolation ensures each workspace boundary has its own sessions, memory, and API keys\n- CodeQL scanning runs on every push and PR\n- File path parameters are sanitized to prevent directory traversal\n- Login is cookie-based with configurable credentials\n\n## Contributing\n\nPlease read `CONTRIBUTING.md` before opening issues or pull requests.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuraika-labs%2Fpan-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feuraika-labs%2Fpan-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuraika-labs%2Fpan-ui/lists"}