Odysseus is a self-hosted workspace with privileged local capabilities — shell execution, file read/write, model downloads, web research, email and calendar integrations, API token management, and a credential vault. Treat it the same way you would treat an admin console: keep it behind authentication, keep it off the public internet, and be deliberate about who can access it and which tools they are allowed to use. The sections below cover the most important hardening steps for any deployment.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/pewdiepie-archdaemon/odysseus/llms.txt
Use this file to discover all available pages before exploring further.
Security Checklist
Keep AUTH_ENABLED=true
AUTH_ENABLED defaults to true and must stay that way for any deployment reachable over a network. Setting it to false removes authentication from every route — there is no middle ground. This setting has no safe use outside a single-developer local machine where network access to port 7000 is physically impossible.Keep LOCALHOST_BYPASS=false
LOCALHOST_BYPASS is a development-only shortcut that skips auth for requests arriving from the loopback interface. Set it to false (the default) everywhere except a machine that is solely yours and never shared. Docker deployments, LAN deployments, and anything behind a reverse proxy must leave this false.Set SECURE_COOKIES=true when serving over HTTPS
SECURE_COOKIES=true in .env. This marks session cookies with the Secure flag so browsers will not transmit them over a plain HTTP connection. Leave it false for pure-localhost installs where TLS is not in the picture.Do not expose to the public internet without HTTPS and a reverse proxy
Keep sensitive files out of Git and private shares
.env— environment variables and secretsdata/— databases, uploads, auth/session files, API keys, backupslogs/— application logs, which may contain request details- Any local databases, generated media, uploaded files, or model/provider tokens
Review data/auth.json after first boot
signup_enabledisfalseunless you intentionally want open registration.- Only your own account has
"is_admin": true. - Any demo or test accounts are non-admin and have the privileges you intend.
Rotate any exposed API keys or tokens
Create separate API tokens per integration
Prefer binding to 127.0.0.1
APP_BIND=127.0.0.1 (the default). Only change it to 0.0.0.0 when you intentionally want the Odysseus port reachable from other hosts — for example, when routing through a local reverse proxy on a different interface.Keep bundled services internal-only
127.0.0.1 by default in Docker Compose. Keep them that way. Only the authenticated Odysseus web/API entrypoint should be exposed through your trusted proxy or private access layer.Common internal-only ports from the default Compose setup:| Port | Service |
|---|---|
7000 | Odysseus app |
8080 | SearXNG |
8091 | ntfy |
8100 | ChromaDB |
11434 | Ollama |
8000–8020 | Common local model/provider API ports |
Private and Proxied Deployments
Odysseus serves plain HTTP and is designed to sit behind a private access layer or reverse proxy that handles TLS. The recommended pattern:Keep Odysseus on localhost
127.0.0.1:7000. Docker Compose does this by default. For native installs, pass --host 127.0.0.1 to uvicorn or set APP_BIND=127.0.0.1 in .env.Terminate HTTPS at a reverse proxy or private access gateway
Put the Odysseus endpoint behind that layer
http://127.0.0.1:7000. Set AUTH_ENABLED=true, LOCALHOST_BYPASS=false, and SECURE_COOKIES=true in your .env.Cloudflare Access
Tailscale
Caddy
nginx
Traefik
mkcert (LAN/Tailscale)
Non-Admin User Isolation
Shell execution, file read/write, email send/read, MCP tools, calendar management, token and webhook management, model serving, vault access, and app settings are all admin-only by default. Non-admin users get only what their per-user privileges explicitly allow. Review each user’s privilege set before sharing a deployment, and keepcan_use_bash off for any user you do not fully trust.
The tool security layer (src/tool_security.py) blocks any tool whose name starts with mcp__ for non-admin users, regardless of their stored privilege values.
Prompt Injection Risks
The agent operates on content from a variety of sources, some of which are entirely outside your control: fetched web pages, search results, emails read from an inbox, memories, notes, and user-editable skills. Any of these surfaces can contain text that attempts to redirect the agent’s behavior — this is called a prompt injection attack. Odysseus wraps external content in untrusted-context delimiters (viasrc/prompt_security.py) and includes a system-level policy that instructs the model not to follow instructions embedded in that content. However, this is a mitigation, not a guarantee. For multi-user deployments:
- Review which agent tools are enabled for each user, especially shell, file write, and email send.
- Be cautious about enabling
can_use_bashfor users who can also supply their own skills, notes, or memories to the agent. - Treat skills, notes, and memory content as untrusted input even when written by your own accounts.
Security Headers
Every Odysseus response includes a standard set of security headers applied bycore/middleware.py:
| Header | Value |
|---|---|
X-Content-Type-Options | nosniff |
Referrer-Policy | no-referrer |
X-Frame-Options | DENY (except tool-render iframes and PDF previews) |
Content-Security-Policy | Nonce-based script-src; style-src 'unsafe-inline' is intentionally kept (see source comments) |
Permissions-Policy | camera=(), microphone=(self), geolocation=() |
Strict-Transport-Security | Set when X-Forwarded-Proto: https is detected (i.e. behind a TLS proxy) |
Further Reading
For a detailed threat model including trust boundaries, known gaps, and the internal tool loopback mechanism, seeTHREAT_MODEL.md in the repository.