Eidon is a self-hosted, single-container, bring-your-own-provider AI assistant for anyone who wants something in the shape of ChatGPT, Gemini, or Claude, but on infrastructure they control.
What is Eidon? · Features · Providers · Screenshots · Quick Start · GitHub Copilot · Configuration · Local Development · Security
Eidon is an all-in-one assistant workspace you can self-host with a single Docker container. You bring your own model provider, keep your own data, and get a polished chat experience with memory, tools, automations, web search, and multi-user administration in one place.
It is designed to feel approachable on day one, whether you want a private assistant for personal use, day-to-day work, or a shared workspace for a group. Instead of stitching together a chat UI, auth, model routing, memory, browser tooling, and scheduling yourself, Eidon ships the whole workspace and lets you plug in the providers and tools you trust.
- Single Docker deployment with SQLite-backed persistence under
/app/data - Multi-user workspace with
adminanduserroles - Bring-your-own-provider model routing instead of a locked-in hosted backend
- Multiple provider profiles per workspace, including OpenAI-compatible endpoints and GitHub Copilot
- Automatic memory system with conversation compaction for long-running threads
- Chat forking from assistant replies when you want to branch a thread without losing context
- Previous message editing with restart-from-edit flow for fast iteration
- Personas you can switch in the composer to change assistant behavior per task
- Reusable skills stored in-app and available across chats
- MCP server support over
streamable_httpandstdio - Docker image already includes both
uvxandnpxforstdioMCP workflows - Built-in web search with Exa, Tavily, or SearXNG
- Built-in browser automation via the bundled
agent-browserskill - Scheduled automations with run history and transcript views
- Streaming chat with visible action timelines
- Browser speech-to-text in the chat composer
- Image generation support
- Full mobile PWA support for chat and admin flows
- Multiple clients stay in sync live through the websocket runtime
Eidon currently supports these provider options:
- OpenAI-compatible endpoints, including OpenAI and other compatible APIs
- OpenRouter
- Ollama Cloud
- GLM Coding Plan
- GitHub Copilot
The OpenAI-compatible profile is manually configurable, so any service that exposes an OpenAI-compatible API can be connected through the same provider type.
Desktop chat workspace with provider switching, persona selection, queued follow-ups, and visible tool activity.
| Mobile chat | Mobile providers |
|---|---|
![]() |
![]() |
| Chat, queued work, and provider context on a phone-sized layout. | Provider administration still works cleanly on mobile. |
docker build -t eidon:latest .export EIDON_ADMIN_PASSWORD="$(openssl rand -base64 24)"
export EIDON_SESSION_SECRET="$(openssl rand -hex 32)"
export EIDON_ENCRYPTION_SECRET="$(openssl rand -hex 32)"docker run -d \
--name eidon \
--restart unless-stopped \
-p 3000:3000 \
-v eidon-data:/app/data \
-e EIDON_PASSWORD_LOGIN_ENABLED=true \
-e EIDON_ADMIN_USERNAME=admin \
-e EIDON_ADMIN_PASSWORD="$EIDON_ADMIN_PASSWORD" \
-e EIDON_SESSION_SECRET="$EIDON_SESSION_SECRET" \
-e EIDON_ENCRYPTION_SECRET="$EIDON_ENCRYPTION_SECRET" \
eidon:latestservices:
eidon:
build: .
image: eidon:latest
restart: unless-stopped
ports:
- "3000:3000"
environment:
EIDON_PASSWORD_LOGIN_ENABLED: "true"
EIDON_ADMIN_USERNAME: "admin"
EIDON_ADMIN_PASSWORD: "${EIDON_ADMIN_PASSWORD}"
EIDON_SESSION_SECRET: "${EIDON_SESSION_SECRET}"
EIDON_ENCRYPTION_SECRET: "${EIDON_ENCRYPTION_SECRET}"
volumes:
- eidon-data:/app/data
volumes:
eidon-data:Start it with the exported variables above, or put the same values in a local .env file before launching:
docker compose up -d --build- Open your Eidon URL.
- Sign in with
EIDON_ADMIN_USERNAMEandEIDON_ADMIN_PASSWORD. - Go to Settings → Providers.
- Add your provider API key or connect GitHub Copilot.
- Start chatting.
Eidon does not ship with a provider API key. The deployment is ready first; you bring the model access you want to use.
The production image is meant to be useful on its own, not just a way to serve the UI.
- It runs as a non-root user
- Runtime data lives under
/app/data - Password login is supported out of the box
- The browser automation skill is bundled
uvx,npx, and Chromium are available for MCP and browser-backed workflows
Eidon can route chats through your GitHub Copilot subscription instead of a direct provider API key. To enable the OAuth flow, register a GitHub App and set:
EIDON_GITHUB_APP_CLIENT_ID=Iv1.xxxxxxxx
EIDON_GITHUB_APP_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EIDON_GITHUB_APP_CALLBACK_URL=https://your-host/api/providers/github/callback- Go to github.com/settings/developers and create a new GitHub App.
- Use your Eidon URL as the homepage.
- Set the callback URL to
https://<your-host>/api/providers/github/callback. - Under user authorization, enable OAuth during installation.
- Copy the Client ID and generate a Client Secret.
- Open Settings → Providers.
- Add a profile and switch Provider type to GitHub Copilot.
- Click Connect GitHub.
- Approve the authorization flow.
- Pick a model and start chatting.
If those three environment variables are not set, the GitHub Copilot profile type is still visible in settings, but the OAuth connection flow will not work. Set all three values before using Connect GitHub.
| Variable | Purpose | Required in production |
|---|---|---|
EIDON_PASSWORD_LOGIN_ENABLED |
Enables password-based login | No, but true is the normal production mode |
EIDON_ADMIN_USERNAME |
Initial admin username | Yes |
EIDON_ADMIN_PASSWORD |
Initial admin password | Yes |
EIDON_SESSION_SECRET |
Session signing secret | Yes |
EIDON_ENCRYPTION_SECRET |
Encryption seed for stored provider credentials | Yes |
EIDON_DATA_DIR |
Directory for SQLite and runtime data | No |
EIDON_GITHUB_APP_CLIENT_ID |
GitHub App client ID for the Copilot provider | No |
EIDON_GITHUB_APP_CLIENT_SECRET |
GitHub App client secret for the Copilot provider | No |
EIDON_GITHUB_APP_CALLBACK_URL |
OAuth callback URL for Copilot | No |
Useful defaults:
- Default model:
gpt-5-mini - Default API mode:
responses - Default Docker data path:
/app/data
Generate secrets on macOS or Linux with:
openssl rand -hex 32
openssl rand -hex 32- Node.js 22+
- npm
- A local toolchain capable of building
better-sqlite3
npm installCreate a local .env:
EIDON_PASSWORD_LOGIN_ENABLED=false
EIDON_ADMIN_USERNAME=admin
EIDON_ADMIN_PASSWORD=dev-password-change-me
EIDON_SESSION_SECRET=dev-session-secret-change-me-with-32-plus-chars
EIDON_ENCRYPTION_SECRET=dev-encryption-secret-change-me-with-32-plus-charsRun the app:
npm run devOpen http://localhost:3000.
npm run dev uses the custom websocket server, which is required for the realtime chat runtime. npm run dev:next is available when you explicitly want plain Next.js without that websocket layer.
| Command | Purpose |
|---|---|
npm run dev |
Start the websocket-enabled dev server |
npm run dev:next |
Start plain Next.js without the websocket runtime |
npm run lint |
Run ESLint |
npm run typecheck |
Run TypeScript checks |
npm run test |
Run unit tests with coverage |
npm run test:e2e |
Run Playwright smoke and feature tests |
npm run seed:readme-demo |
Create the disposable README screenshot dataset under .context/readme-demo-data |
Eidon is powerful by design, so treat it like an admin-grade internal tool.
- Always terminate TLS before exposing Eidon publicly.
- Rate-limit
POST /api/auth/loginat your reverse proxy. - Use long, random values for the admin password and both secrets.
- Persist
/app/dataon a named volume or host mount. - Treat MCP servers, browser automation, and shell-capable skills as trusted features.
- Rotate provider keys and bootstrap secrets during redeploys when needed.
For a public VPS deployment, the minimum baseline should be:
- HTTPS
- strong secrets
- a persistent data volume
- login rate limiting
- a reverse proxy such as Caddy, Nginx, or Traefik
Eidon is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only). See LICENSE.
- Next.js App Router
- React 19
- TypeScript
- SQLite via
better-sqlite3 argon2for password hashingjosefor signed session cookieszodfor validation




