From 965e9004f5c175858a0ecb747c12f00285cb12da Mon Sep 17 00:00:00 2001 From: Ahson Shaikh Date: Fri, 5 Jun 2026 01:56:49 +0500 Subject: [PATCH] Added Template Odysseus --- templates/odysseus/assets/logo.svg | 5 + templates/odysseus/assets/screenshot.png | Bin 0 -> 45964 bytes templates/odysseus/index.ts | 111 +++++++++++++++++++++++ templates/odysseus/meta.yaml | 103 +++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 templates/odysseus/assets/logo.svg create mode 100644 templates/odysseus/assets/screenshot.png create mode 100644 templates/odysseus/index.ts create mode 100644 templates/odysseus/meta.yaml 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 0000000000000000000000000000000000000000..982a00f77df6ad3e9bc2f703a74eda677d3bd9b8 GIT binary patch literal 45964 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 qX!;pVKZB`7FtXe-TKR%|0V#;foA0Z literal 0 HcmV?d00001 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