File: README.md
Quick Start
devis the default branch and gets the newest changes first. Usemainif you want the more curated branch.
git clone https://github.com/odysseus-dev/odysseus.git
cd odysseus
cp .env.example .env
docker compose up -d --buildOpen http://localhost:7011 when the containers are healthy. The first admin password is printed in docker compose logs odysseus.
The compose files pull the official multi-arch image ghcr.io/odysseus-dev/odysseus (published by CI on every push to main and dev) and only build locally if the pull fails โ so this also works on hosts without a build toolchain, e.g. as a Portainer stack.
Production deployments: pin the immutable tag instead of :latest. :latest and bare :X.Y.Z tags move on every push to main, but :X.Y.Z-<sha> (e.g. 1.0.2-7c8070f) always refers to one specific build:
ODYSSEUS_IMAGE=ghcr.io/odysseus-dev/odysseus:1.0.2-7c8070f docker compose up -dNative installs, GPU notes, Windows/macOS instructions, HTTPS, and configuration live in the setup guide.
Features
- Chat + Agents โ local/API models, tools, MCP, files, shell, skills, and memory.
- Cookbook โ hardware-aware model recommendations, downloads, and serving.
- Deep Research โ multi-step web research with source reading and report generation.
- Compare โ blind side-by-side model testing and synthesis.
- Documents โ writing-first editor with AI edits, suggestions, Markdown, HTML, CSV, and syntax highlighting.
- Email โ IMAP/SMTP inbox with triage, tags, summaries, reminders, and reply drafts.
- Notes, Tasks + Calendar โ reminders, todos, scheduled agent tasks, and CalDAV sync.
- Extras โ gallery/image editor, themes, uploads, web search, presets, sessions, and 2FA.
Demo
A full hover-to-play tour lives on the Odysseus landing page. Its source lives under website/.
Contributing
Help is welcome. The best entry points are fresh-install testing, provider setup bugs, mobile/editor polish, docs, and small focused refactors. See CONTRIBUTING.md and ROADMAP.md.
Security
Odysseus is a self-hosted workspace with powerful local tools. Keep auth enabled, keep private data out of Git, and do not expose raw model/service ports publicly.
- Keep
AUTH_ENABLED=truefor any network-accessible deployment. - Keep
LOCALHOST_BYPASS=falseoutside local development.
Deployment details are in the setup guide.
Star History
License
AGPL-3.0-or-later -- see LICENSE and ACKNOWLEDGMENTS.md.
File: companion/README.md
Companion bridge
A thin, additive layer so a LAN client (e.g. a phone) can discover what an
Odysseus server offers and pair to it, without duplicating any LLM logic.
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /api/companion/ping |
session or token | cheap, auth-validated health check |
| GET | /api/companion/info |
session or token | server identity + capability flags |
| GET | /api/companion/models |
session or token | the caller's own model endpoints |
| GET | /api/companion/pair |
admin cookie | pairing page (a form; never mints) |
| POST | /api/companion/pair |
admin cookie | mint a one-time pairing token (?format=json for an in-app screen) |
/models scopes to the caller's real owner plus legacy null-owner shared rows
(same rule as owner_filter) and never returns API-key material.
Pairing CSRF posture
Minting happens only on POST. The session cookie is SameSite=Lax
(routes/auth_routes.py), so a browser will not send it on a cross-site POST โ
the same protection POST /api/tokens relies on. A GET would be unsafe (Lax
cookies ride top-level GET navigations), so GET /pair only renders a form.
Minting invalidates the auth middleware's token cache, so a freshly minted token
works on the next request without a restart.
The pairing/scoping rules live in small, tested units (token_owner,owner_can_see, mint_pairing_token, pairing.*) โ seetests/test_companion_readonly.py and tests/test_companion_pairing.py.
File: integrations/codex/README.md
Odysseus Codex Integration
This directory contains the Codex plugin/skill bundle for Odysseus.
User Flow
- Open Odysseus Settings > Integrations.
- Add a Codex Agent.
- Copy the full setup commands shown after the generated token.
- Toggle the tools Codex is allowed to use.
- Configure the terminal Codex session:
export ODYSSEUS_URL=http://your-odysseus-host:7000
export ODYSSEUS_API_TOKEN=ody_generated_token
mkdir -p ~/plugins
curl -fsSL -H "Authorization: Bearer $ODYSSEUS_API_TOKEN" "$ODYSSEUS_URL/api/codex/plugin.zip" -o /tmp/odysseus-codex-plugin.zip
python3 -m zipfile -e /tmp/odysseus-codex-plugin.zip ~/plugins
python3 - <<'PY'
import json
from pathlib import Path
p = Path.home() / ".agents" / "plugins" / "marketplace.json"
p.parent.mkdir(parents=True, exist_ok=True)
if p.exists():
data = json.loads(p.read_text())
else:
data = {"name": "personal", "interface": {"displayName": "Personal"}, "plugins": []}
data.setdefault("name", "personal")
data.setdefault("interface", {}).setdefault("displayName", "Personal")
plugins = data.setdefault("plugins", [])
entry = {
"name": "odysseus",
"source": {"source": "local", "path": "./plugins/odysseus"},
"policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"},
"category": "Productivity",
}
data["plugins"] = [item for item in plugins if item.get("name") != "odysseus"] + [entry]
p.write_text(json.dumps(data, indent=2) + "\n")
PY
codex plugin add odysseus@personal- Verify:
python3 ~/plugins/odysseus/scripts/odysseus_api.py capabilitiesCodex must use /api/codex/* endpoints. SSH, Docker, direct Python imports, database queries, and MCP internals bypass Odysseus Settings and must not be used for user data access.