Eggent is a local-first AI workspace for building a team of focused agents.
Create specialized agents with their own skill packs and MCP servers, switch between them in plain human language, and delegate each task to the agent best trained for it.
Built-in platform capabilities:
- project-based organization
- chat and tool-driven workflows
- memory and knowledge ingestion
- MCP server integration
- cron automation
- Telegram integration
The app runs as a Next.js service and stores runtime state on disk (./data).
- Latest release snapshot: 0.1.3 - OAuth Native CLI Providers
- GitHub release body : v0.1.3
- Release archive: docs/releases/README.md
- Contributing guide: CONTRIBUTING.md
- Report a bug: Bug report form
- Request a feature: Feature request form
- Code of conduct: CODE_OF_CONDUCT.md
- Security policy: SECURITY.md
| Path | Best for | Command |
|---|---|---|
| One-command installer | Fastest setup, Docker-first | curl -fsSL https://raw.githubusercontent.com/eggent-ai/eggent/main/scripts/install.sh | bash |
| Local production | Run directly on your machine (Node + npm) | npm run setup:local |
| Docker isolated | Containerized runtime | npm run setup:docker |
| Manual setup | Full control | see Manual Setup |
curl -fsSL https://raw.githubusercontent.com/eggent-ai/eggent/main/scripts/install.sh | bashWhat it does:
- installs Docker (best-effort on macOS/Linux) if missing
- clones/updates Eggent in
~/.eggent - runs Docker deployment via
scripts/install-docker.sh
Installer environment variables:
EGGENT_INSTALL_DIR: target directory (default:~/.eggent)EGGENT_BRANCH: git branch (default:main)EGGENT_REPO_URL: git repo URL (default:https://github.com/eggent-ai/eggent.git)EGGENT_AUTO_INSTALL_DOCKER:1/0(default:1)EGGENT_APP_BIND_HOST: Docker published bind host (Linux default: 0.0.0.0, otherwise127.0.0.1)
Example:
EGGENT_INSTALL_DIR=~/apps/eggent \
EGGENT_BRANCH=main \
EGGENT_AUTO_INSTALL_DOCKER=1 \
curl -fsSL https://raw.githubusercontent.com/eggent-ai/eggent/main/scripts/install.sh | bashOn Linux (including VPS installs), the one-command installer publishes app port on all interfaces by default, so app is reachable at http://<server-ip>:3000.
npm run setup:localThis script:
- validates Node/npm availability
- validates
python3availability (required for Code Execution with Python runtime) - validates
curlavailability (required for terminal commands likecurl ...) - warns if recommended utilities are missing:
git,jq,pip3,rg - creates
.envfrom.env.exampleif needed - generates secure defaults for token placeholders
- installs dependencies
- builds production output
- runs a health smoke-check
Start the app:
npm run startOpen:
http://localhost:3000
npm run setup:dockerThis script:
- validates Docker + Compose
- prepares
.envanddata/ - builds image and starts container
- waits for
GET /api/healthto succeed
Open:
http://localhost:3000
Useful Docker commands:
docker compose logs -f app
docker compose restart app
docker compose downcp .env.example .env
# ensure python3 is installed and available in PATH
npm install
npm run build
npm run startOpen:
http://localhost:3000
npm install
npm run devOpen:
http://localhost:3000
Before updating, back up:
.envdata/
If you installed with the one-command installer, run the same command again:
curl -fsSL https://raw.githubusercontent.com/eggent-ai/eggent/main/scripts/install.sh | bashIt will update the repo in ~/.eggent (or EGGENT_INSTALL_DIR if customized), then rebuild and restart Docker deployment.
If you run Eggent from this repo with Docker:
git pull --ff-only origin main
npm run setup:dockerIf you run Eggent from this repo in local production mode (Node + npm):
git pull --ff-only origin main
npm run setup:localQuick post-update check:
curl http://localhost:3000/api/healthDefined in package.json:
npm run dev: Next.js dev servernpm run build: production buildnpm run start: production startnpm run lint: ESLintnpm run setup:one: one-command installer wrappernpm run setup:local: local production bootstrapnpm run setup:docker: Docker production bootstrap
Base flow:
- copy
.env.exampleto.env - fill required keys
Main environment variables:
| Variable | Required | Purpose |
|---|---|---|
OPENAI_API_KEY |
Usually yes | Default model provider key |
ANTHROPIC_API_KEY |
No | Anthropic provider |
GOOGLE_API_KEY |
No | Google provider |
OPENROUTER_API_KEY |
No | OpenRouter provider |
TAVILY_API_KEY |
No | Web search integration |
EXTERNAL_API_TOKEN |
No (auto-generated in setup scripts) | External message API auth token |
TELEGRAM_BOT_TOKEN |
No | Telegram bot token |
TELEGRAM_WEBHOOK_SECRET |
No (auto-generated in setup scripts) | Telegram webhook secret |
TELEGRAM_DEFAULT_PROJECT_ID |
No | Default project for Telegram |
TELEGRAM_ALLOWED_USER_IDS |
No | Comma/space separated Telegram user_id allowlist |
APP_BASE_URL |
Recommended | Public app URL used by integrations |
APP_BIND_HOST |
No | Docker port bind host (default: 127.0.0.1; set 0.0.0.0 for public access) |
APP_PORT |
No | Published app port (default: 3000) |
APP_TMP_DIR |
No | Docker temp directory passed as TMPDIR (default: /app/data/tmp) |
PLAYWRIGHT_BROWSERS_PATH |
No | Browser install/cache path for Playwright (default: /app/data/ms-playwright) |
NPM_CONFIG_CACHE |
No | npm cache directory for runtime installs (default: /app/data/npm-cache) |
XDG_CACHE_HOME |
No | Generic CLI cache directory (default: /app/data/.cache) |
CODEX_AUTH_FILE |
No | Explicit path to Codex OAuth file (if unset, Eggent auto-discovers .codex/auth.json in common home dirs) |
GEMINI_OAUTH_CREDS_FILE |
No | Explicit path to Gemini OAuth creds file (if unset, Eggent auto-discovers .gemini/oauth_creds.json in common home dirs) |
GEMINI_SETTINGS_FILE |
No | Explicit path to Gemini settings file (if unset, Eggent auto-discovers .gemini/settings.json in common home dirs) |
- Runtime state lives in
./data - Docker mounts
./datainto/app/data - Runtime temp/cache paths are persisted under
./data(for example:tmp/,ms-playwright/,npm-cache/,.cache/) - Keep backups of
data/and.envfor disaster recovery
Docker defaults are security-oriented:
- compose default bind:
127.0.0.1:${APP_PORT:-3000}:3000(APP_BIND_HOST=0.0.0.0exposes publicly) - non-root container user (
node) nodeuser has passwordlesssudoin container to allow AI-driven package installation
curl http://localhost:3000/api/healthExpected response shape:
status: "ok"timestampversion
- Set at least one model API key in
.env(OPENAI_API_KEY,ANTHROPIC_API_KEY,GOOGLE_API_KEY, orOPENROUTER_API_KEY). - Change default dashboard credentials (
admin / admin) in Settings immediately after first login. - If using Telegram integration/webhooks, set public
APP_BASE_URL(HTTPS URL reachable from the internet). - Keep
data/persistent and writable by container runtime user. - Ensure outbound network access to provider APIs (
443/tcp).
-
App works on
localhostbut not on127.0.0.1(or vice versa)
Use one host consistently. Browser storage/cookies are origin-scoped. -
Docker container does not become healthy
Rundocker compose logs --tail 200 appand verify.envvalues. -
Codex/Gemini OAuth says "token file was not found" on VPS
Eggent auto-discovers OAuth files in common home directories and indata/.codex+data/.gemini. For Docker, place files indata/.codex/auth.json,data/.gemini/oauth_creds.json,data/.gemini/settings.json, then recreate container (docker compose up -d --build --force-recreate app) so startup hook can normalize file permissions fornode. -
Linux Docker permissions issues
Try withsudo docker ...or add your user to thedockergroup. -
Build fails after dependency changes
Runnpm installand retrynpm run build. -
Large downloads fail with
No space left on devicedespite free server disk
This usually means temp/cache paths are constrained in the runtime environment. Rebuild and restart with current compose defaults, then verify inside container:
docker compose build --no-cache app
docker compose up -d app
docker compose exec app sh -lc 'df -h /tmp /app/data && echo "TMPDIR=$TMPDIR" && echo "PLAYWRIGHT_BROWSERS_PATH=$PLAYWRIGHT_BROWSERS_PATH"'Process error: spawn python3 ENOENTin Code Execution
python3is missing in runtime environment.
For Docker deploys:
docker compose build --no-cache app
docker compose up -d app
docker compose exec app python3 --versionFor local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y python3
python3 --versionsh: 1: curl: not foundin Code Execution (terminal runtime)
curlis missing in runtime environment.
For Docker deploys:
docker compose build --no-cache app
docker compose up -d app
docker compose exec app curl --versionFor local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y curl
curl --versioncommand not foundfor common terminal/skill commands (git,jq,rg)
Install recommended CLI utilities:
sudo apt-get update && sudo apt-get install -y git jq ripgrepModuleNotFoundError: No module named 'requests'in Python Code Execution
requestsis missing in runtime environment.
For Docker deploys:
docker compose build --no-cache app
docker compose up -d app
docker compose exec app python3 -c "import requests; print(requests.__version__)"For local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y python3-requests
python3 -c "import requests; print(requests.__version__)"/usr/bin/python3: No module named pipwhen trying to install Python packages
pipis missing in runtime environment.
For Docker deploys:
docker compose build --no-cache app
docker compose up -d app
docker compose exec app python3 -m pip --versionFor local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y python3-pip
python3 -m pip --versionapt-get install ...fails in Code Execution withPermission denied
Use sudo in terminal runtime:
sudo apt-get update && sudo apt-get install -y ffmpegsrc/ # App code (Next.js app router, components, libs)
scripts/ # Install and utility scripts
bundled-skills/ # Built-in skill packs
data/ # Runtime state (generated locally)
docs/ # Additional docs
docker-compose.yml # Container runtime
Dockerfile # Multi-stage production image build
- License: MIT. See
LICENSEat the repository root.