Daedalus is my self-hosted AI assistant I build and maintain for myself and my wife. I'm Brandon Tuttle, an independent developer, and our two-person household guides the design of this personal project. It is also used as an educational medium for me as LLMs, agents and technology progress. This started as a Gradio app in early 2024 and has progressed into what you see today.
It combines a Next.js chat application, a Rust agent runtime built with Rig, Tokio, and Axum, and a Python tool service. Chat history and streaming work with the local setup below. Image creation, retrieval, durable memory, integrations, and scheduled work depend on the additional services you configure.
You can steer a running response by sending another direction in the composer. The agent keeps results from tools already started and uses your direction for the next model round. See the request path for the execution and recovery boundaries.
Forks are encouraged but this is a personal project so I'll likely never look for contributions. I maintain this around my own use and available time; there is no support team, guaranteed response time, or fixed release schedule. Use by two people does not establish suitability for a public service.
| You want to... | Read this |
|---|---|
| Run local text chat | Local setup |
| Find code or add one integration | Architecture and adaptation |
| Operate an installation or move to Kubernetes | Operations, Helm chart |
| Develop the UI or run browser tests | Frontend, Browser tests |
| Change shared payloads or agent instructions | Protocol, Skill guidelines |
| Contribute a fix | Contributing, Repository guidelines |
| Understand tool execution and exact answers | Tool contracts |
| Validate model or research changes | Evaluation guide, Research workflows |
| Review long-running workflows and recovery limits | Workflow guide |
| Use Daedalus from OpenAI or Anthropic clients | Compatibility API |
| Run isolated experiments with durable files | Sandbox exploration |
| Understand Rust ownership and rollback | Runtime compatibility |
| Understand skill maintenance or image signing | Skill guidelines, Content Credentials |
Prerequisites: Git, Docker with the Compose plugin and BuildKit support, Bash, curl, and a model endpoint supporting the Responses API and tool calling. Have its API root, model name, and credential ready. The containers supply Node, Python, and Rust; no host language toolchains or GPU are required for this path. The first build includes substantial Python dependencies and can take longer than the configuration steps.
Run all commands below from the repository root in the same Bash session.
git clone https://github.com/tuttlebr/daedalus-agent.git
cd daedalus-agent
cp .env.example .envFill in these settings in .env:
| Variable | Value |
|---|---|
TOOL_CALLING_LLM_MODEL_BASE_URL |
Your provider's API root, usually ending in /v1 |
TOOL_CALLING_LLM_MODEL_MODEL |
A tool-capable model available there |
TOOL_CALLING_LLM_MODEL_API_KEY |
Its credential |
AUTH_USERNAME, AUTH_NAME |
Your login and display name |
Leave AUTH_PASSWORD_HASH empty until step 2. Keep .env private and out of Git.
Inside Docker, localhost refers to the container; a self-hosted model needs a
URL reachable from the backend container.
The example selects backend/local-chat-config.yaml:
one model and a native clock tool. It configures no MCP servers, retrieval,
Hindsight memory, sandbox, autonomy, or tracing. It sends model requests to
/responses. If your endpoint supports Chat Completions instead, change
llms.main.api_type to chat in that YAML before starting the backend.
docker compose build backend frontend redis
docker compose build nginx object-storeThe second command builds the repository's proxy and object-store images; they are also needed by a fresh installation. Use the built frontend image to hash your password, without installing Node or npm packages on the host:
read -rsp 'Password: ' DAEDALUS_PASSWORD; printf '\n'
printf '%s' "$DAEDALUS_PASSWORD" | docker compose run --rm -T --no-deps \
--entrypoint node frontend -e \
'console.log(require("bcryptjs").hashSync(require("node:fs").readFileSync(0, "utf8"), 12))'
unset DAEDALUS_PASSWORDCopy the hash into AUTH_PASSWORD_HASH in .env, enclosed in single quotes
so Compose preserves its $ characters. The application requires bcrypt cost
12 or greater. For multiple accounts or an existing plaintext configuration,
see login configuration.
docker compose up -d nginx frontend stream-worker backend redis object-store object-store-init
docker compose ps -a
curl -fsS http://127.0.0.1:8000/health/readyThe backend, Redis, object store, and stream worker should become healthy;
redis-volume-init and object-store-init should exit successfully. Readiness
checks backend dependencies, not your model credentials.
Open http://localhost:8080, sign in, and ask: "Use the clock tool to tell me the current date and time." A completed tool-backed answer verifies the model, tool, queue, and streaming path. Start a second conversation and reload to check saved history.
If startup or chat fails, inspect service logs:
docker compose logs --tail=100 backend stream-worker frontendFor model errors, check the API root, model name, credential, and selected API
type. After changing .env or backend YAML, recreate the affected services:
docker compose up -d --force-recreate backend stream-worker frontend nginxStop with docker compose down. Redis history remains in redis/data/ and
document objects remain in the Docker volume. Compose publishes plaintext HTTP
with development storage credentials; use a trusted development machine. See
exposure and storage before making
an installation accessible to others.
Start with one integration at a time.
The full example, backend/tool-calling-config.yaml
and .env.template, is opinionated around my home services and
assistant preferences. It is a reference for adapting your working setup.
Compose supplies Redis and S3-compatible storage. The UI also exposes features whose external services are absent; those features need their own configuration. The capability requirements identify what to add for images, retrieval, memory, tools, sandbox, autonomy, and tracing.