Koris ships a browser dashboard for chatting with the agent and managing its configuration.
The UI is a React 19 single-page app (Vite, React Router, Tailwind) in apps/web/. The server
side is an Express app in core/src/dashboard/ listening on port 3000; it serves the built
bundle from dist-web/ and falls back to index.html for any unmatched route so the SPA owns
routing. Opening / redirects to /admin, which lands on the chat view.
The left nav links to:
/admin/overview) — status at a glance./admin/memories) — the long-term memories rows./admin/heartbeats) — create, update, and delete scheduled beats; cron
expressions are validated on save./admin/skills) — the merged list of skills on disk and in the database;
enable or disable each one, or trigger a manual sync./admin/queue) — the provider and sub-agent queue state./admin/audit) — the token-usage and call audit log.A chats panel lists your sessions; each opens at /admin/chat/<sessionId>, and starting a new
chat goes to /admin/chat.
Prior history is hydrated from the admin API. Replies stream over Server-Sent Events from
/api/chat, which accepts an optional sessionId to target a specific session. A context bar
shows the session's estimated token usage against the manager's num_ctx.
Configuration lives in a modal with four tabs:
Secrets in settings responses are deep-masked. A separate Plugins modal lists every tool and channel plugin with a live on/off toggle; see tools and plugins.
With no koris.json, the first visit opens a setup wizard at /setup that walks through
providers, channels, and a plugins step before writing the initial config.
The admin API is mounted at /api/admin. POST /api/admin/sessions creates a new session
without ending the current one.
pnpm dev:client — Vite dev server on port 5173, proxying /api and /health to
localhost:3000.pnpm build:client — build the frontend into dist-web/.pnpm lint:client — type-check apps/web/.