diff --git a/templates/odysseus/assets/logo.svg b/templates/odysseus/assets/logo.svg new file mode 100644 index 000000000..d117bc9cd --- /dev/null +++ b/templates/odysseus/assets/logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/templates/odysseus/assets/screenshot.png b/templates/odysseus/assets/screenshot.png new file mode 100644 index 000000000..982a00f77 Binary files /dev/null and b/templates/odysseus/assets/screenshot.png differ diff --git a/templates/odysseus/index.ts b/templates/odysseus/index.ts new file mode 100644 index 000000000..e02019f0d --- /dev/null +++ b/templates/odysseus/index.ts @@ -0,0 +1,111 @@ +import { Output, randomString, Services } from "~templates-utils"; +import { Input } from "./meta"; + +export function generate(input: Input): Output { + const services: Services = []; + + const searxngSecret = randomString(32); + const chromaHostname = `$(PROJECT_NAME)_${input.appServiceName}-chroma`; + const searxngHostname = `$(PROJECT_NAME)_${input.appServiceName}-searxng`; + + const searxngSettings = `use_default_settings: true + +server: + secret_key: "${searxngSecret}" + +search: + formats: + - html + - json +`; + + services.push({ + type: "app", + data: { + serviceName: input.appServiceName, + source: { + type: "github", + owner: "pewdiepie-archdaemon", + repo: "odysseus", + ref: "main", + path: "/", + autoDeploy: false, + }, + build: { + type: "dockerfile", + }, + env: [ + `APP_BIND=0.0.0.0`, + `APP_PORT=7000`, + `AUTH_ENABLED=true`, + `SECURE_COOKIES=false`, + `DATABASE_URL=sqlite:///./data/app.db`, + `CHROMADB_HOST=${chromaHostname}`, + `CHROMADB_PORT=8000`, + `SEARXNG_INSTANCE=http://${searxngHostname}:8080`, + `OLLAMA_BASE_URL=${input.ollamaBaseUrl || ""}`, + `OPENAI_API_KEY=${input.openaiApiKey || ""}`, + `CLEANUP_INTERVAL_HOURS=24`, + `ODYSSEUS_INPROCESS_POLLERS=1`, + `ODYSSEUS_INPROCESS_TASKS=1`, + ].join("\n"), + domains: [ + { + host: "$(EASYPANEL_DOMAIN)", + port: 7000, + }, + ], + mounts: [ + { + type: "volume", + name: "data", + mountPath: "/app/data", + }, + { + type: "volume", + name: "logs", + mountPath: "/app/logs", + }, + ], + }, + }); + + services.push({ + type: "app", + data: { + serviceName: `${input.appServiceName}-chroma`, + source: { + type: "image", + image: "chromadb/chroma:1.5.9", + }, + env: [`ANONYMIZED_TELEMETRY=false`].join("\n"), + mounts: [ + { + type: "volume", + name: "chromadb-data", + mountPath: "/chroma/chroma", + }, + ], + }, + }); + + services.push({ + type: "app", + data: { + serviceName: `${input.appServiceName}-searxng`, + source: { + type: "image", + image: "searxng/searxng:2026.5.31-7159b8aed", + }, + mounts: [ + { + type: "file", + content: searxngSettings, + mountPath: "/etc/searxng/settings.yml", + }, + ], + }, + }); + + return { services }; +} diff --git a/templates/odysseus/meta.yaml b/templates/odysseus/meta.yaml new file mode 100644 index 000000000..364c27ea4 --- /dev/null +++ b/templates/odysseus/meta.yaml @@ -0,0 +1,103 @@ +name: Odysseus +description: + Odysseus is a self-hosted, local-first AI workspace designed as a + privacy-respecting alternative to ChatGPT and Claude. It connects to any + OpenAI-compatible backend — vLLM, llama.cpp, Ollama, LM Studio, or OpenRouter + — and wraps it in a full-featured workspace with chat, agentic tool use, deep + multi-step research, a blind model-comparison tool, a document editor, memory + via ChromaDB vector search, email (IMAP/SMTP with AI triage), CalDAV calendar + sync, and a hardware-aware cookbook that recommends models based on your + available VRAM. All data stays on your infrastructure. This template deploys + Odysseus with its required companion including ChromaDB for vector memory and + SearXNG for private web search. +instructions: + After deployment, open your app domain. On first start, Odysseus generates a + temporary admin password — check the app service logs to find it (look for a + line containing the initial password). Log in with username "admin" and that + password, then go to Settings to change it and configure your LLM backend. + Point the LLM endpoint at a running Ollama, vLLM, or OpenAI endpoint in + Settings → Models. SearXNG is wired automatically via the SEARXNG_INSTANCE + environment variable. +changeLog: + - date: 2026-06-04 + description: Initial Template Release +links: + - label: GitHub + url: https://github.com/pewdiepie-archdaemon/odysseus +contributors: + - name: Ahson Shaikh + url: https://github.com/Ahson-Shaikh +schema: + type: object + required: + - appServiceName + properties: + appServiceName: + type: string + title: App Service Name + default: odysseus + ollamaBaseUrl: + type: string + title: Ollama Base URL + default: "" + description: + Optional. Set to your Ollama instance URL (e.g. + http://host.docker.internal:11434) to auto-populate the model list on + first boot. + openaiApiKey: + type: string + title: OpenAI API Key + default: "" + description: Optional. Leave blank if using only local models. +benefits: + - title: Private, Local-First AI Workspace + description: + All conversations, documents, and memory stay on your own server. No + telemetry, no account required, no data sent to third-party AI providers + unless you explicitly configure an external key. + - title: Any LLM Backend + description: + Connect to Ollama, vLLM, llama.cpp, LM Studio, OpenRouter, or the OpenAI + API — swap or combine backends at any time from Settings without + redeploying. + - title: Full Productivity Suite + description: + Chat, email triage, CalDAV calendar, markdown/HTML/CSV document editor, + notes, tasks, and a deep-research agent in a single cohesive interface. + - title: Vector Memory + description: + ChromaDB powers persistent retrieval-augmented memory so Odysseus + remembers facts, documents, and past context across sessions. +features: + - title: Chat and Agentic Tool Use + description: + Conversational AI with tool-calling support. Agents can search the web via + SearXNG, read and write documents, run scripts, and query memory. + - title: Deep Research + description: + Multi-step research pipeline adapted from Alibaba's DeepResearch that + breaks complex questions into sub-queries, searches, synthesises sources, + and returns a structured report. + - title: Blind Model Comparison + description: + Submit the same prompt to multiple models simultaneously and rate + responses without knowing which model produced which answer. + - title: ChromaDB Vector Memory + description: + Persistent vector + keyword retrieval via ChromaDB and fastembed. Upload + documents to the Library, then reference them in any conversation. + - title: Email with AI Triage + description: + Connect IMAP/SMTP accounts and let Odysseus tag, summarise, and prioritise + incoming mail by urgency automatically. + - title: Hardware Cookbook + description: + Scans your server's VRAM and recommends compatible models with VRAM-aware + serving configurations via tmux background processes. +tags: + - AI + - LLM + - Self-Hosted + - Productivity + - Open Source + - Python