Yes, you can self-host Odysseus, the open-source AI workspace PewDiePie launched in May 2026, on a VPS without a graphics card. The app itself needs about 1 GB of RAM. Chat, notes and private web search all worked in our CPU-only lab. A small local model ran at 25 to 28 tokens per second on 4 vCPU when the host was quiet. The catch is Deep Research. With a 1.5B model on CPU it finished a job in 117 seconds and then reported the wrong answer with confidence. So the honest setup is this: Odysseus on a small server, a small local model for everyday chat and notes, and an API model for research. Below are the exact commands we ran, the RAM and disk figures we measured, and which plan fits which setup.
Key facts, checked on 15 October 2026:
- Odysseus lives at github.com/odysseus-dev/odysseus, with about 93,500 stars and 1,600 forks according to the GitHub API. The repository was created on 31 May 2026. The original address, github.com/pewdiepie-archdaemon/odysseus, now redirects to the odysseus-dev organization.
- gittrend.io counted about 6,600 new stars in the last 30 days, roughly 220 a day.
- The license is AGPL-3.0, a copyleft license. If you change the code and let other people use your changed version over a network, you have to offer them your source code.
- PewDiePie (Felix Kjellberg) announced it in a YouTube video on 31 May 2026, TBS News reported the next day.
- The official Docker Compose file starts four containers (Odysseus, ChromaDB, SearXNG and ntfy) and publishes the web UI on 127.0.0.1:7011. Inside the container the app listens on port 7000. GitHub lists no tagged releases. The
latestimage we pulled reported version 1.0.3.
What Odysseus is, in plain words
Odysseus is not a model but a workspace that talks to models, in your browser. The README lists chat with agents and tools, a Deep Research mode that searches the web and writes a report, a Compare mode for blind model tests, a document editor, an IMAP/SMTP email inbox, notes, tasks and a calendar with CalDAV sync. Under the hood it is a Python FastAPI app with a SQLite database.
Three helper services come with it. SearXNG is a private metasearch engine: it asks Google, Bing and others for you and gives the results back without ads or tracking. ChromaDB is a vector database. It stores your notes and chats in a form the AI can search by meaning, which is how Odysseus "remembers" things. ntfy sends push notifications, for example reminders, to your phone.
The models can come from two places. Local models run on your own server through Ollama or llama.cpp, two free programs that run AI models on a normal CPU. API models run at a provider such as OpenAI or OpenRouter, and you pay per use. Odysseus works with both, and you can mix them.
Our lab and what everything weighed
We tested on 15 October 2026 in a Debian 13 container limited to 4 vCPU and 4 GB of RAM, on an AMD EPYC 7742 host whose 8 cores were shared with other test labs at the same time. These results come from our lab. Speed on a real plan can be higher or lower, and we show below how much the neighbours on the host moved our numbers.
| What we measured | Result | Notes |
|---|---|---|
First start, docker compose up -d | 102 seconds | Pulls 4 images and starts them; login page answered under a minute later |
| RAM at idle, Odysseus app | 757 MiB | Includes a small local embedding model (all-MiniLM-L6-v2) the app loads for memory search |
| RAM at idle, SearXNG / ChromaDB / ntfy | 116 / 17 / 16 MiB | About 1.0 GB used in total for the whole stack |
| Disk, Odysseus stack | about 4.2 GB of images | Odysseus 2.84 GB, ChromaDB 826 MB, SearXNG 382 MB, ntfy 123 MB |
| Disk, Ollama image | 9.37 GB | The official image ships GPU libraries even when you only use the CPU |
| Disk, models | 986 MB to 1.9 GB each | qwen2.5:1.5b, llama3.2:1b (1.3 GB), qwen2.5:3b; 13 GB in /var/lib/docker at the end |
| RAM with a 1.5B model loaded | Ollama 1.2 GB | Stack plus model fits in 4 GB with room to spare |
| RAM with a 3B model loaded | Ollama 2.1 GB | Only 880 MB left in the 4 GB container: too tight for daily use |
Speed is measured in tokens per second. A token is a piece of a word, and about 15 tokens per second reads faster than most people do. We asked for the same short answer of about 90 to 120 tokens several times:
| Model | Quiet host, 4 threads | Quiet host, 2 threads | Busy host, 2 threads |
|---|---|---|---|
| qwen2.5 1.5B | 25.5 to 28.1 tok/s | 17.1 to 18.3 tok/s | 14.3 to 14.7 tok/s |
| qwen2.5 3B | 12.4 to 14.5 tok/s | 7.4 to 7.7 tok/s | 7.2 to 7.3 tok/s |
| llama3.2 1B | not run | not run | 11.9 tok/s |
When the other labs were busy (load average 9 to 20 on 8 cores), 4 threads became the worst choice: the 1.5B model fell to 10.4 tokens per second and one run did not finish within 240 seconds. The 3B model dropped to 3 to 5.5, and llama3.2 1B swung between 9.8 and 19.8. Two threads stayed steady. That is the practical difference between shared and dedicated vCPUs, and we come back to it in the plan section.
Install Odysseus with Docker Compose
Start from a fresh Debian 13 server. If it is new, first do the basics in our Debian 13 security guide: SSH keys, a firewall and automatic updates. Then install Docker from Docker's own repository:
# as root
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin git
docker --version; docker compose version
We got Docker 29.9.1 and Compose v5.6.0. Next, create a normal user to own the app. Membership of the docker group is close to root access, so give it only to an account you trust.
# as root
adduser --disabled-password --gecos "" odys
usermod -aG docker odys
id odys
Expected output: uid=1000(odys) gid=1000(odys) groups=1000(odys),100(users),989(docker). Now switch to that user (su - odys) and follow the official install:
# as the odys user
git clone https://github.com/odysseus-dev/odysseus.git
cd odysseus
cp .env.example .env
docker compose up -d
docker compose ps
The README writes docker compose up -d --build. The extra flag forces a local build of the image, which takes longer and uses more RAM. Without it, Compose pulls the ready image from GitHub's registry, and that is what we did. After about 100 seconds docker compose ps showed four containers, SearXNG marked healthy, and these port lines:
# output of docker compose ps (shortened)
odysseus-odysseus-1 127.0.0.1:7011->7000/tcp
odysseus-chromadb-1 127.0.0.1:8100->8000/tcp
odysseus-searxng-1 127.0.0.1:8080->8080/tcp (healthy)
odysseus-ntfy-1 127.0.0.1:8091->80/tcp
Every port is bound to 127.0.0.1, so nothing is reachable from the internet yet. That is the right default. Some guides say the app runs on port 7000. That is the port inside the container. On the server you reach it at 7011, and you can change that with APP_PORT in .env.
On first start Odysseus creates the admin account and prints a temporary password in the log:
# as the odys user, in ~/odysseus
docker compose logs odysseus | grep "Temporary password"
curl -s http://127.0.0.1:7011/api/health
The first line shows Temporary password: ... with a 24-character random password for the user admin. The health check answers {"status":"healthy",...}. Log in, then change the password under Settings straight away. If you prefer to choose it yourself, the log message says you can set ODYSSEUS_ADMIN_PASSWORD before the first start. For production, the README also advises pinning an exact image tag with ODYSSEUS_IMAGE instead of latest, so an update never arrives by surprise. Our Docker on a VPS page explains images, tags and volumes if these words are new to you.
Add a small local model that runs on the CPU
Odysseus does not ship a model. The setup guide suggests running Ollama on the host and opening it with OLLAMA_HOST=0.0.0.0. On a VPS with a public IP that is risky, because a mistake in the firewall exposes your model port to the whole internet. We ran Ollama as a fifth container in the same Compose project instead, with no published port. Only Odysseus can reach it, over the internal Docker network. Compose reads a file called docker-compose.override.yml automatically, so the official file stays untouched and git pull keeps working:
# as the odys user, in ~/odysseus
cat > docker-compose.override.yml <<EOF
services:
ollama:
image: docker.io/ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-models:/root/.ollama
volumes:
ollama-models:
EOF
docker compose up -d ollama
docker compose exec ollama ollama pull qwen2.5:1.5b
We got Ollama 0.40.4. The 1.5B model is a 986 MB download. Then, in Odysseus, add a model endpoint with the base URL http://ollama:11434/v1 and no API key. In our lab the endpoint came up as "online" and listed every model we had pulled. Pick the model in the chat and type.
A quick speed test from the command line:
# as the odys user, in ~/odysseus
docker compose exec ollama ollama run --verbose qwen2.5:1.5b "In two sentences, what is SearXNG?"
Ollama prints the answer and then the timings. The line to read is eval rate: ours showed 28.08 tokens/s, with prompt processing at 71.43 tokens/s. In our lab we ran this test on a copy of the model with a fixed thread count, for the reason explained next.
The thread trap that cost us 0.2 tokens per second
Our first test hung for over ten minutes. The Ollama log explained why:
# as the odys user
docker logs odysseus-ollama-1 2>&1 | grep n_threads
It said n_threads = 8 on a container that had only 4 CPUs. llama.cpp, the engine inside Ollama, keeps every thread spinning at full speed. With twice as many threads as cores, the threads keep pushing each other off the CPU, and speed fell to 0.2 tokens per second. This happened because our lab nests Docker inside a container, which shows the host's 8 cores. A KVM VPS normally shows its real vCPU count, so you are unlikely to hit it. If you ever see a thread count above what nproc prints, or you want fewer threads on a busy shared plan, make a copy of the model with a fixed thread count:
# as the odys user, in ~/odysseus
printf 'FROM qwen2.5:3b\nPARAMETER num_thread 2\n' > /tmp/Modelfile
docker compose cp /tmp/Modelfile ollama:/tmp/Modelfile
docker compose exec ollama ollama create qwen2.5-3b-t2 -f /tmp/Modelfile
The new model qwen2.5-3b-t2 appears in Odysseus next to the original after a model refresh. With the thread count fixed, the same 1.5B model went from 0.2 to over 20 tokens per second.
What worked on CPU and what did not
| Feature | Result in our lab | Verdict |
|---|---|---|
| Login, admin account, settings | Worked, auth on by default | Works |
| Chat with qwen2.5 1.5B | 15.3 seconds for a three-sentence answer, including Odysseus's own system prompt | Works, fine for short questions |
| Notes | Created and listed instantly; no model needed | Works |
| SearXNG web search | 20 results for a test query | Works |
| Memory search (embeddings) | FastEmbed model loaded on CPU at start-up | Works |
| Deep Research with 1.5B or 3B models | Ran, but timed out or gave a wrong answer | Not usable with small CPU models |
| Cookbook model serving with vLLM or SGLang | Not attempted | Needs a GPU (CUDA or ROCm) |
The Deep Research result deserves detail, because it is the feature people install Odysseus for. We asked which Linux kernel Debian 13 ships. Three runs:
- With the 1.5B model on a busy host, it searched, read three pages and after 321 seconds wrote "No information could be gathered".
- With the 3B model on 2 threads, it planned good search queries but every page-reading step timed out (HTTP 504 after 3 attempts). We stopped it after 1,000 seconds.
- With the 1.5B model on a quiet host and one page at a time, it finished in 117 seconds with a neat report saying Debian 13 ships kernel 5.15 and came out in January 2024. Both claims are false. Debian 13 was released on 9 August 2025 with Linux 6.12 (Debian release page).
Small models summarise long web pages badly, and slowly on a CPU. For research, connect an API model in Settings. One more thing we noticed: SearXNG searches from your server's IP address, so search engines localise the results. On our Amsterdam lab a vague query returned Dutch dictionary pages. Specific queries avoid this.
We did not test email, calendar sync or image features, because those need outside accounts or extra models. The Cookbook hardware check also warned "No GPU visible inside Docker", which is expected on a server without a graphics card.
Keep it private: auth, ports and HTTPS
- Leave
AUTH_ENABLED=trueandLOCALHOST_BYPASS=false, both defaults in the official Compose file. A reverse proxy on the same server connects from localhost, so a bypass could let every visitor in without a password. - Do not publish the Ollama, SearXNG, ChromaDB or ntfy ports. The project's own security notes say the same. Our Compose override above gives Ollama no port at all.
- Put the web UI behind HTTPS with a reverse proxy that forwards to 127.0.0.1:7011. Our Caddy, Nginx and Traefik guide covers the setup with free certificates. If only you use it, a VPN is simpler still: see WireGuard on a VPS or Tailscale.
- Turn on two-factor login (2FA) for every account. The README lists 2FA among the built-in features; we did not test the setup.
- Agents can run shell commands and tools. Give extra users only the privileges they need; the admin can switch off agents, shell and research per user.
Which plan and which city
The app is light. The model decides the plan. All plans have NVMe storage, unmetered traffic and their own IPv4 and IPv6 address. VPS plans share their vCPUs with other customers; VDS plans give you dedicated vCPUs. Our test above showed why that matters for local AI: on a busy shared CPU, token speed swung by more than half.
| Your setup | Plan | Why |
|---|---|---|
| Odysseus with API models only, 1 to 3 users | VPS Mini: 4 vCPU (shared), 4 GB RAM, 80 GB NVMe | The stack used about 1 GB of RAM and 4.2 GB of disk; plenty of headroom. The smallest size we tested. |
| API models plus a 1B to 1.5B local model for chat and notes | VPS Mini | Fits in 4 GB with room left. We saw 25 to 28 tok/s on a quiet host and 10 to 15 tok/s when neighbours were busy. |
| A 3B local model for daily use, steady speed | VDS Small: 4 dedicated vCPU, 8 GB RAM, 240 GB NVMe | 3B left only 880 MB free in 4 GB. Dedicated cores keep you near the 12 to 14.5 tok/s we saw on a quiet host. |
| A small team, or 7B models | VDS Medium: 8 dedicated vCPU, 16 GB RAM, 480 GB NVMe | A 7B model is a 4.7 GB download on Ollama's library. We did not test 7B here, so try it before you rely on it. |
| Several models loaded at once, many users | VDS Large: 16 dedicated vCPU, 32 GB RAM, 960 GB NVMe | Room to keep a chat model and a second model in RAM without reloading. |
For the city, pick the one closest to you and your users. In our own ping.pe test on 6 October 2026, our Amsterdam server answered in 6.6 ms from Frankfurt, 6.7 ms from London and 9.3 ms from Paris. Our Prishtina server measured about 19 ms from Vienna, and Skopje is about 3 ms away on our network, which suits users in Kosovo and the Balkans. Dublin is the natural pick for Ireland. Availability by city is on the plans page. If you start small, you can move to a bigger plan later from the client area with a short reboot.
When is Odysseus on a VPS the wrong choice? If you only want a chat window for yourself and you already pay for ChatGPT or Claude, a server adds work without much gain. If you want strong local models at GPU speed, you need a graphics card, and our servers do not have one. If you want a lighter, more mature chat UI for local models, compare it with Open WebUI; we also tested the new Open WebUI 0.12 on CPU.
Frequently asked questions
Can Odysseus run without a GPU?
Yes. The app, SearXNG, ChromaDB and ntfy all run on a normal CPU, and together used about 1 GB of RAM in our lab. Small local models such as qwen2.5 1.5B ran at 25 to 28 tokens per second on 4 vCPU. Only the GPU serving engines in its Cookbook, vLLM and SGLang, need a graphics card.
How much RAM does Odysseus need?
The Odysseus stack itself used about 1.0 GB at idle in our test, of which 757 MiB was the main app. Add the model: a 1.5B model took 1.2 GB in Ollama and a 3B model 2.1 GB. With API models only, 4 GB is comfortable; for a 3B local model, plan for 8 GB.
What port does Odysseus use?
The official Docker Compose file publishes the web UI on 127.0.0.1:7011 on the server, and the app listens on port 7000 inside its container. You can change the server port with APP_PORT in the .env file. Keep it on 127.0.0.1 and reach it through a reverse proxy with HTTPS or a VPN.
Where is the Odysseus admin password?
On first start, Odysseus creates a user called admin and prints a temporary random password in its log. Run docker compose logs odysseus in the project folder and look for the line "Temporary password". Log in and change it in Settings right away.
Does Deep Research work with a local model on CPU?
Not well. In our lab, 1.5B and 3B models either timed out while reading pages or produced a confident but wrong report. Deep Research needs a model that can read long pages quickly and summarise them correctly. Use an API model for research and a small local model for chat and notes.
Is Odysseus made by PewDiePie?
PewDiePie (Felix Kjellberg) started it and announced it on 31 May 2026. The code now lives in the odysseus-dev organization on GitHub, and his original repository address redirects there. It is open source under the AGPL-3.0 license.
Run your own AI workspace
For Odysseus with API models, or a 1.5B model for chat and notes, a VPS Mini is enough. For a 3B local model at steady speed, take a VDS Small with dedicated vCPUs. Compare all plans and cities on the VPS and VDS plans page. If you want us to install Odysseus for you, we quote setup work per job. Ask on Telegram.