
Deploy Odysseus v1.0.2 | PewDiePie AI Workspace Whose Web Search Works
Official upstream image, not a 892-commit-stale fork. JSON search works.
Just deployed
/var/cache/ntfy
odysseus
Just deployed
/app/data
Just deployed
chroma
Just deployed
/data
Deploy and Host Odysseus on Railway
Odysseus is the open-source, self-hosted AI workspace from PewDiePie's
archdaemon project — multi-provider chat, an agent system with tools,
persistent memory and skills, Deep Research, side-by-side model comparison,
document editing, RAG over your own uploads, notes, tasks, email and calendar,
in one mobile-friendly app. You bring your own model through any
OpenAI-compatible API, and every conversation stays on infrastructure you
control.
This template deploys Odysseus v1.0.2 from the official upstream image, with a SearXNG that actually answers the app's search calls.
About Hosting Odysseus
Odysseus is not a single container. The web app needs a vector store for its memory and RAG (ChromaDB), a metasearch engine for web search and Deep Research (SearXNG), and a push server for reminders and agent notifications (ntfy). This template wires all four over Railway's private network, gives the app, the vector store and the push cache persistent volumes, exposes only the authenticated web UI publicly, and seeds the admin account from a generated password before the first request is ever served.
Two things are done differently here, and both are measurable:
- The official image, pinned by digest. Every other Odysseus listing on
Railway either builds the app from a personal fork on your build minutes or
runs an unofficial rebuild. The most-deployed one advertises an August update
while its fork's last commit is 2026-06-09 — 892 upstream commits behind,
including roughly ten
fix(security)commits (webhook SSRF and DNS-rebinding guards, sensitive-file deny-list matching, session-owner scoping). The wrapper image here isFROMthe upstream image, pinned by digest, and adds only the three Railway-specific fixes described below. - Web search that returns results instead of 403. Odysseus queries SearXNG
with
format=json. The stock SearXNG image shipssearch.formats: [html]only, so an unmodified SearXNG answers HTTP 403 to every web search and Deep Research call while its own container stays perfectly healthy. The SearXNG image here installs the settings file upstream Odysseus ships for exactly that reason. Verified on the live deploy: a search through the app returns ranked results.
The other Railway fixes in the wrapper image:
- The listener follows Railway's injected
$PORT. Upstream's command hardcodes--port 7000. Railway's HTTP healthcheck dials the injected port, not the domain's target port, so a fixed listener means a healthchecked service never goes healthy. - A real healthcheck. Every other Odysseus listing publishes no
healthcheck path at all, so a half-broken boot still reports SUCCESS. This
one probes
/api/health, which upstream leaves outside the auth middleware. @playwright/mcpis warmed into the npx cache at build time. Upstream installs it over the network on first start; on Railway that cache lives on the ephemeral layer, so the download repeats on every deploy and the Built-in: Browser MCP server is missing until it finishes.- ntfy stays private. It is reachable only over Railway's private network. An ntfy server with a public domain and no auth lets anyone who finds the URL read and publish to your notification topics.
Why Deploy Odysseus on Railway
Instead of a ChatGPT Plus or Claude Pro subscription with its own caps, you run the workspace yourself and pay only your model provider. Railway handles the four-service orchestration, private networking, TLS and volumes that would otherwise be a Docker Compose file, a reverse proxy and a certificate renewal you maintain. Railway also gives new accounts a free trial when signing up with GitHub, so the whole stack can be launched and tried in minutes.
Railway vs other hosting for Odysseus
| Provider | With Railway | With the other provider |
|---|---|---|
| DigitalOcean | Four services, private networking, volumes and HTTPS from one deploy | A droplet, Docker Compose, Nginx and certbot to maintain yourself |
| AWS | Flat usage pricing, no VPC/ECS/IAM wiring | Capable, but multi-container orchestration you configure |
| Hetzner | Managed restarts, logs, metrics, persistent storage | A cheap VPS and every operational task on you |
Common Use Cases
- A private ChatGPT/Claude-style workspace shared with a small team.
- Chat across OpenAI, OpenRouter, Anthropic-compatible gateways or a remote Ollama endpoint from one interface, with your keys.
- Deep Research over a self-hosted search engine, with no per-query search bill.
- RAG: upload documents and query them through Chroma-backed memory.
- Agent workflows with tools, skills, reminders and scheduled tasks.
Dependencies for Odysseus Hosting
- The Odysseus web app (FastAPI/uvicorn), on a persistent volume at
/app/data - ChromaDB for vector memory, on a persistent volume at
/data - SearXNG for web search and Deep Research, JSON output enabled
- ntfy for notifications, private, on a persistent volume at
/var/cache/ntfy - An API key for whichever LLM provider you use — added in the app's Settings page after login, not at deploy time
Deployment Dependencies
- Odysseus: https://github.com/pewdiepie-archdaemon/odysseus
- Wrapper images: https://github.com/bon5co/odysseus-railway and https://github.com/bon5co/odysseus-railway-searxng
- ChromaDB: https://docs.trychroma.com
- SearXNG: https://docs.searxng.org
- ntfy: https://docs.ntfy.sh
First login
The template generates ODYSSEUS_ADMIN_PASSWORD for you. After the deploy
finishes, open the odysseus service → Variables, copy that value, and log in
at the public URL as admin. Change it from the app's Settings page, then add
your model provider key there. Public signup is disabled by default.
Implementation Details
odysseus -> public web app, volume /app/data, healthcheck /api/health
chroma -> private vector store, volume /data
searxng -> private metasearch, JSON output enabled
ntfy -> private push server, volume /var/cache/ntfy
Only odysseus gets a public domain. The app's SQLite database, auth.json,
uploads, generated images, skills and the embedding-model cache all live under
/app/data, so they survive redeploys; the ChromaDB collections live on their
own volume. The upstream entrypoint is preserved rather than replaced by a
start command, because it repairs the ownership of the volume Railway mounts as
uid 0 and runs first-time setup before dropping privileges.
Template Content
