Eylo is a self-hosted platform for building, operating, and observing AI agents. Organizations bring their own model, voice, storage, and integration providers; Eylo supplies the agent runtime and the product workflows around them.
The repository contains the complete application:
server/ — FastAPI API, agent runtime, PostgreSQL persistence, Redis, and
Absurd-backed durable work.web/ — React operator console built with MobX, Tailwind CSS, and Base UI.widget/ — embeddable TypeScript SDK plus a Preact chat and voice UI.cli/ — human-friendly client generated from the running API contract.infra/docker/eylo/ — shared Docker services plus explicit development and
production overlays for the API, worker, PostgreSQL with pgvector, and Redis.Nothing is preconfigured. Eylo never silently selects a vendor, model, or credential. Configure the capabilities an organization needs, then bind those capabilities and tools to a published agent.
The platform documentation follows Diátaxis:
Signed-in organization members can read the same source-backed pages in the operator console under Resources → Documentation. The console does not maintain a second documentation copy; each build renders these Markdown files.
The running OpenAPI document at /docs remains authoritative for exact HTTP
paths and schemas.
The backend keeps domain and provider concerns separate:
| Layer | Responsibility |
|---|---|
eylo/framework/ | Standalone, platform-neutral agent loop |
eylo/modules/ | Domain models, rules, services, and HTTP contracts |
eylo/sockets/ | Vendor protocol adapters |
eylo/pipelines/ | Cross-layer orchestration and durable effects |
eylo/listeners/ | In-process event reactions |
eylo/products/ | Product-level composition |
modules/ and sockets/ do not import one another. A flow that needs both
belongs in pipelines/. The framework has no dependency on the Eylo platform.
Requirements:
Create the ignored Docker environment file:
cp server/eylo/common/config/.env.example \
server/eylo/common/config/.env.docker
openssl rand -hex 32
Paste the generated 64-character value into ENCRYPTION_KEY in
server/eylo/common/config/.env.docker. Generate a separate auth secret for
anything beyond disposable local development.
Start the API, worker, PostgreSQL, and Redis:
docker compose \
-f infra/docker/eylo/docker-compose.yml \
-f infra/docker/eylo/docker-compose.dev.yml \
up -d --build
Only the API is published, on the host loopback interface. PostgreSQL and Redis remain on the Compose network and have no host port mapping. Hosted deployments use the separate production overlay described in Deploy with Docker; do not run the base file by itself.
The API is available at http://127.0.0.1:8000; its interactive contract is at
http://127.0.0.1:8000/docs.
Start the operator console in a second terminal:
cd web
pnpm install --frozen-lockfile
pnpm dev
The console is available at http://127.0.0.1:5173.
Start the widget in a third terminal:
cd widget
pnpm install --frozen-lockfile
pnpm build
cd preact-ui
pnpm dev
The widget is available at http://127.0.0.1:5174.
Register the first member in the console, or use the CLI from the checkout:
uv run --project cli eylo configure --base-url http://127.0.0.1:8000
uv run --project cli eylo auth register
uv run --project cli eylo auth login
uv run --project cli eylo api-surface
Registration creates an organization for the first member. Additional members join through invitations; Eylo deliberately has organization membership rather than role-based access control.
Install backend dependencies and run the API directly:
cd server
uv sync
uv run alembic upgrade head
uv run fastapi dev main.py
Run the durable worker separately:
cd server
uv run python -m eylo.agent_run_worker
Useful local checks:
cd server
uv run python scripts/verify_documentation.py
uv run ruff check eylo ../cli --extend-ignore F401,F403,F811,E712
cd ../web
pnpm lint
pnpm exec tsc -b --pretty false
pnpm exec vite build
cd ../widget
pnpm build
pnpm --dir preact-ui build
The repository intentionally ships no test suite and no hosted CI workflow.
Runtime changes must be exercised through the exact affected path against real
types and disposable infrastructure. Local lint and build gates live in
.pre-commit-config.yaml.
Provider support is a complete vertical path, not a catalog label.
server/eylo/sockets/<capability>/.server/eylo/pipelines/ boundary.server/eylo/modules/provider_onboarding/catalog.py. The console consumes
this catalog; a vendor-specific React form is normally unnecessary.modules/ and sockets/ never import one another. Cross-layer construction
belongs in pipelines/. The full procedure is
Add a capability provider vendor.
Apache License 2.0. See LICENSE.
1 commits
Python
65.1%
TypeScript
30.7%
CSS
3.9%
Eylo is a self-hosted platform for building, operating, and observing AI agents. Organizations bring their own model, voice, storage, and integration providers; Eylo supplies the agent runtime and the product workflows around them.
The repository contains the complete application:
server/ — FastAPI API, agent runtime, PostgreSQL persistence, Redis, and
Absurd-backed durable work.web/ — React operator console built with MobX, Tailwind CSS, and Base UI.widget/ — embeddable TypeScript SDK plus a Preact chat and voice UI.cli/ — human-friendly client generated from the running API contract.infra/docker/eylo/ — shared Docker services plus explicit development and
production overlays for the API, worker, PostgreSQL with pgvector, and Redis.Nothing is preconfigured. Eylo never silently selects a vendor, model, or credential. Configure the capabilities an organization needs, then bind those capabilities and tools to a published agent.
The platform documentation follows Diátaxis:
Signed-in organization members can read the same source-backed pages in the operator console under Resources → Documentation. The console does not maintain a second documentation copy; each build renders these Markdown files.
The running OpenAPI document at /docs remains authoritative for exact HTTP
paths and schemas.
The backend keeps domain and provider concerns separate:
| Layer | Responsibility |
|---|---|
eylo/framework/ | Standalone, platform-neutral agent loop |
eylo/modules/ | Domain models, rules, services, and HTTP contracts |
eylo/sockets/ | Vendor protocol adapters |
eylo/pipelines/ | Cross-layer orchestration and durable effects |
eylo/listeners/ | In-process event reactions |
eylo/products/ | Product-level composition |
modules/ and sockets/ do not import one another. A flow that needs both
belongs in pipelines/. The framework has no dependency on the Eylo platform.
Requirements:
Create the ignored Docker environment file:
cp server/eylo/common/config/.env.example \
server/eylo/common/config/.env.docker
openssl rand -hex 32
Paste the generated 64-character value into ENCRYPTION_KEY in
server/eylo/common/config/.env.docker. Generate a separate auth secret for
anything beyond disposable local development.
Start the API, worker, PostgreSQL, and Redis:
docker compose \
-f infra/docker/eylo/docker-compose.yml \
-f infra/docker/eylo/docker-compose.dev.yml \
up -d --build
Only the API is published, on the host loopback interface. PostgreSQL and Redis remain on the Compose network and have no host port mapping. Hosted deployments use the separate production overlay described in Deploy with Docker; do not run the base file by itself.
The API is available at http://127.0.0.1:8000; its interactive contract is at
http://127.0.0.1:8000/docs.
Start the operator console in a second terminal:
cd web
pnpm install --frozen-lockfile
pnpm dev
The console is available at http://127.0.0.1:5173.
Start the widget in a third terminal:
cd widget
pnpm install --frozen-lockfile
pnpm build
cd preact-ui
pnpm dev
The widget is available at http://127.0.0.1:5174.
Register the first member in the console, or use the CLI from the checkout:
uv run --project cli eylo configure --base-url http://127.0.0.1:8000
uv run --project cli eylo auth register
uv run --project cli eylo auth login
uv run --project cli eylo api-surface
Registration creates an organization for the first member. Additional members join through invitations; Eylo deliberately has organization membership rather than role-based access control.
Install backend dependencies and run the API directly:
cd server
uv sync
uv run alembic upgrade head
uv run fastapi dev main.py
Run the durable worker separately:
cd server
uv run python -m eylo.agent_run_worker
Useful local checks:
cd server
uv run python scripts/verify_documentation.py
uv run ruff check eylo ../cli --extend-ignore F401,F403,F811,E712
cd ../web
pnpm lint
pnpm exec tsc -b --pretty false
pnpm exec vite build
cd ../widget
pnpm build
pnpm --dir preact-ui build
The repository intentionally ships no test suite and no hosted CI workflow.
Runtime changes must be exercised through the exact affected path against real
types and disposable infrastructure. Local lint and build gates live in
.pre-commit-config.yaml.
Provider support is a complete vertical path, not a catalog label.
server/eylo/sockets/<capability>/.server/eylo/pipelines/ boundary.server/eylo/modules/provider_onboarding/catalog.py. The console consumes
this catalog; a vendor-specific React form is normally unnecessary.modules/ and sockets/ never import one another. Cross-layer construction
belongs in pipelines/. The full procedure is
Add a capability provider vendor.
Apache License 2.0. See LICENSE.
1 commits
Python
65.1%
TypeScript
30.7%
CSS
3.9%