Run Eddytor on your own machine or server with one command. Prebuilt images — nothing to clone, nothing to build.
Eddytor is free to self-host. Everything you need is Docker and one command — the installer brings a bundled Postgres and MinIO so you can evaluate without setting anything else up.
curl -fsSL https://get.eddytor.com | shThe installer creates an install directory (~/eddytor), generates secrets into .env, starts the stack, and walks you through creating the first admin. That directory is yours:
~/eddytor/
├── docker-compose.yml # replaced on upgrade — don't edit
├── config.toml # non-secret settings (public URL, CORS, …) — edit this
├── HOSTING.md # the full self-hosting guide
└── .env # secrets (generated) — back this upLosing EDDYTOR_ENCRYPTION_KEY makes every stored secret unrecoverable. Keep a copy of .env somewhere safe.
http://localhost:8080 is the REST + gRPC API, not a UI. You operate Eddytor with the CLI, the API, or MCP. An optional web UI is one prompt away — see Web UI.
The installer prompts you for this. To do it by hand, run the setup tool inside the server container — there is no public setup endpoint and no token to leak:
docker compose exec eddytor-server eddytoradm setup \
--email you@example.com --org "Default"It's idempotent — a no-op once an admin exists. Sign-in is passwordless (magic link); with no SMTP configured the link is printed to the server logs instead of emailed.
# macOS / Linux (Homebrew)
brew install eddytor-labs/tap/eddytor
# macOS / Linux (shell)
curl -fsSL https://raw.githubusercontent.com/eddytor-labs/eddytor-cli/main/install.sh | sh
# Windows (Scoop)
scoop bucket add eddytor https://github.com/eddytor-labs/eddytor-cli
scoop install eddytorPoint it at your install and sign in:
eddytor config set-api-url http://localhost:8080
eddytor config set-flight-url http://localhost:8082
eddytor login # device-code flow; opens your browser
eddytor list tables
eddytor query "SELECT 1"Mint a non-expiring API key from inside the container: docker compose exec eddytor-server eddytoradm create-api-key --email you@example.com, then eddytor config set-key edd_live_…. Use the key (not eddytor login) for eddytor query — login tokens expire after 15 minutes.
Eddytor exposes an MCP endpoint at ${public_url}/mcp — http://localhost:8080/mcp on a local install. Add it to any MCP-aware client. Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"eddytor": {
"url": "http://localhost:8080/mcp"
}
}
}Cursor (Settings → MCP Servers):
{
"eddytor": {
"url": "http://localhost:8080/mcp"
}
}On first use the client triggers an OAuth 2.1 device-code flow — open the URL in your browser, approve, and the client caches the token. No API key to paste.
A bucket named eddytor is created in the bundled MinIO on boot. Register it as a storage connection, then create tables against it:
eddytor create storage s3 --bucket eddytor \
--endpoint http://minio:9000 --region us-east-1 \
--access-key-id eddytor --secret-access-key eddytor-secretRegistration probes the store before saving, so a misconfiguration fails fast with a specific reason instead of a generic error. An empty bucket is fine — it registers with 0 tables.
# bump EDDYTOR_VERSION in .env, then:
docker compose pull && docker compose up -dChange a setting by editing config.toml and running docker compose restart — config is read at boot, not hot-reloaded.
Can't find it? Ask support and a human will answer, usually within a few hours.