{"slug": "i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee", "title": "I built a self-hosted AI workspace for macOS — meet Odysee", "summary": "A developer built Odysee, a self-hosted AI workspace for macOS that packages a FastAPI-based local LLM interface into a native macOS app bundle and DMG. The app supports multiple LLM providers including LM Studio, Ollama, and OpenAI, along with document RAG, email triage, and calendar sync features. Odysee uses pywebview to display the web UI in a native macOS window and includes a cleanup mechanism that terminates all child processes when the window closes.", "body_md": "I've been running [Odysseus](https://github.com/pewdiepie-archdaemon/odysseus) as my daily-driver AI interface — local LLMs, document RAG, email triage, calendar sync. It's a web-based FastAPI app that works great in the browser, but I wanted a proper macOS app I could launch from my dock and distribute as a DMG.\n\nSo I built one. Here's what the app does and how I packaged it.\n\n| Layer | Tool |\n|---|---|\n| Web framework | FastAPI (Python 3.11) |\n| Frontend | Vanilla JS + CSS (PWA) |\n| LLM providers | LM Studio, Ollama, DeepSeek, SiliconFlow, OpenAI, Anthropic |\n| Vector store | ChromaDB + fastembed |\n| Model serving | llama.cpp / vLLM |\n| macOS app | Shell launcher + pywebview + DMG |\n\nThe base project already had a `build-macos-app.sh`\n\nscript, but I rewrote it to produce a proper `.app`\n\nbundle and `.dmg`\n\nthat anyone can build:\n\n```\n./build-macos-app.sh\n```\n\nThis creates two things:\n\n**1. dist/Odysseus.app** — A macOS app bundle. The executable is a shell script that:\n\n`uvicorn app:app`\n\n)**2. dist/Odysseus.dmg** — A drag-to-Applications disk image for distribution.\n\nThe `.app`\n\nis just a launcher — no embedded Python, no bundled binary. It drives the venv in the repo directory.\n\nThe key piece is `scripts/app_window.py`\n\n, which uses **pywebview** to open the web UI in a native macOS window — no browser chrome, feels like a real app. If pywebview isn't available, it falls back to opening a chromeless Chromium window via `--app=`\n\n.\n\nClosing the window stops everything: the web server, ChromaDB, all child processes. The cleanup trap in the launcher script makes sure no stray Python processes are left behind.\n\n```\nOdysee/\n├── app.py              # FastAPI entry point\n├── src/                # Core logic\n│   ├── llm_core.py     # Multi-provider LLM abstraction\n│   ├── agent_loop.py   # Agent execution loop\n│   ├── chat_handler.py # Chat processing\n│   ├── model_discovery.py # Auto-detect local models\n│   └── mcp_manager.py  # MCP server management\n├── routes/             # API endpoints\n├── services/           # Background services\n├── static/             # Frontend (JS/CSS/HTML)\n├── scripts/            # CLI tools + app_window.py\n├── tests/              # ~350 tests\n└── data/               # Created on first run\n\nuvicorn app:app --host 127.0.0.1 --port 7860\n```\n\nThe flask-style backend runs on localhost:7860. The frontend is vanilla JS with no build step — just open `index.html`\n\nand it works.\n\n```\ngit clone https://github.com/AlexDesign420/Odysee-MacOS-App.git\ncd Odysee-MacOS-App\npython3.11 -m venv venv\nsource venv/bin/activate\npip install -r requirements.txt\npython setup.py\n./venv/bin/uvicorn app:app --host 127.0.0.1 --port 7860\n```\n\nOpen [http://127.0.0.1:7860](http://127.0.0.1:7860). First boot creates an admin account.\n\nTo build the macOS app:\n\n```\n./build-macos-app.sh\nopen dist/Odysseus.dmg\n```\n\n**GitHub:** [AlexDesign420/Odysee-MacOS-App](https://github.com/AlexDesign420/Odysee-MacOS-App)", "url": "https://wpnews.pro/news/i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee", "canonical_source": "https://dev.to/alexdesign420/i-cleaned-up-a-self-hosted-ai-workspace-and-put-it-on-github-meet-odysee-macos-4291", "published_at": "2026-06-05 13:20:37+00:00", "updated_at": "2026-06-05 13:42:21.585818+00:00", "lang": "en", "topics": ["ai-tools", "ai-products", "ai-infrastructure", "large-language-models", "artificial-intelligence"], "entities": ["Odysseus", "FastAPI", "pywebview", "ChromaDB", "Ollama", "OpenAI", "Anthropic", "LM Studio"], "alternates": {"html": "https://wpnews.pro/news/i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee", "markdown": "https://wpnews.pro/news/i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee.md", "text": "https://wpnews.pro/news/i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee.txt", "jsonld": "https://wpnews.pro/news/i-built-a-self-hosted-ai-workspace-for-macos-meet-odysee.jsonld"}}