Round datetime in system prompt to the hour so the prefix stays stable across requests, enabling provider-side prompt caching (Anthropic ~5 min, OpenAI ~1 hr). Trim chat history to 80 messages via the existing History class to prevent context window overflow on long conversations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Eggent
Eggent is a local-first AI workspace with:
- 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).
Contributing and Support
- 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
Installation (All Supported Paths)
| 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 |
1) One-command Installer
curl -fsSL https://raw.githubusercontent.com/eggent-ai/eggent/main/scripts/install.sh | bash
What 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 | bash
On 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.
2) Local Production Setup (Node + npm)
npm run setup:local
This 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 start
Open:
http://localhost:3000
3) Docker Isolated Setup
npm run setup:docker
This 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 down
4) Manual Setup
cp .env.example .env
# ensure python3 is installed and available in PATH
npm install
npm run build
npm run start
Open:
http://localhost:3000
5) Development Mode
npm install
npm run dev
Open:
http://localhost:3000
Runtime Scripts
Defined 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
Configuration
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) |
Data Persistence
- 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
Security Defaults
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
Health Check
curl http://localhost:3000/api/health
Expected response shape:
status: "ok"timestampversion
VPS Production Checklist
- 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).
Troubleshooting
-
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. -
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 --version
For local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y python3
python3 --version
sh: 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 --version
For local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y curl
curl --version
command not foundfor common terminal/skill commands (git,jq,rg)
Install recommended CLI utilities:
sudo apt-get update && sudo apt-get install -y git jq ripgrep
ModuleNotFoundError: 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 --version
For local (non-Docker) deploys:
sudo apt-get update && sudo apt-get install -y python3-pip
python3 -m pip --version
apt-get install ...fails in Code Execution withPermission denied
Use sudo in terminal runtime:
sudo apt-get update && sudo apt-get install -y ffmpeg
Project Layout (High Level)
src/ # 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
Notes
- License: MIT. See
LICENSEat the repository root.