An active second brain, unsiloed.
Open source already does everything you need — but every app keeps what it knows to itself. Existential runs them as one system on your own hardware, with a local AI underneath that can act on everything in it.
flowchart TB
you["You<br/>phone · laptop · your voice"]
outside["The outside world<br/>bank email · calendars · the web"]
subgraph house["Your house — one machine, one network"]
ex["Existential<br/>your apps · your storage<br/>your automations · one local AI"]
end
you <--> ex
outside -. "pulled in, never pushed out" .-> ex
classDef me fill:#e8f4fd,stroke:#027bcb,stroke-width:2px,color:#111
classDef core fill:#027bcb,stroke:#014d80,stroke-width:2px,color:#fff
classDef ext fill:#f4f4f4,stroke:#999,stroke-dasharray:4 3,color:#333
class you me
class ex core
class outside ext
style house fill:#fcfcfc,stroke:#027bcb,stroke-width:2px,color:#014d80
- The software already exists. A curated list, not an app store. Adding one is flipping a flag.
- Figure it out once. Hostnames, HTTPS, storage, logging, secrets, backups — solved a single time and applied to everything. The fortieth service costs the same as the second.
- Nothing leaves the house. Your files are on your disks, your models on your GPU. Unplug the internet and it keeps working.
Prerequisites: Docker and Tailscale — tailscale is how every device you own reaches the stack, and the first run derives your hostnames from its address.
git clone https://github.com/jtmckay/existential.git
cd existential
./existential.sh quest # pick your services
docker compose up -d./existential.sh renders each enabled service's templates and merges them into one
docker-compose.yml and one .env at the repo root. Always run compose from the root, never
from a service folder.
📖 Getting Started for the full walkthrough.
Everything reaches the AI the same way — voice, browser, editor and automation all hit one OpenAI-compatible endpoint, so the model, key, skills and memory are configured once instead of four times.
flowchart TB
ha["Home Assistant<br/>voice, in the house"]
owui["Open WebUI<br/>chat in a browser"]
oc["opencode<br/>editor and terminal"]
dec["decree<br/>routines, nobody present"]
hermes["Hermes — the one endpoint<br/>OpenAI-compatible · sessions · skills"]
ollama["Ollama<br/>the models"]
stt["WhisperX<br/>speech → text"]
tts["Chatterbox<br/>text → speech"]
viking["OpenViking<br/>what it knows"]
honcho["Honcho<br/>what it remembers about you"]
craw["Firecrawl<br/>reading the web"]
apps["Your apps<br/>notes · photos · money · files · recipes …"]
platform["The platform — free to every service<br/>Caddy names + TLS · volumes and NAS · logs and metrics"]
ha --> hermes
owui --> hermes
oc --> hermes
dec --> hermes
ha --> stt
ha --> tts
hermes --> ollama
hermes --> viking
hermes --> honcho
hermes --> craw
dec <--> apps
hermes --> platform
apps --> platform
classDef surface fill:#e8f4fd,stroke:#027bcb,color:#111
classDef gateway fill:#027bcb,stroke:#014d80,stroke-width:2px,color:#fff
classDef model fill:#f4f4f4,stroke:#999,color:#333
classDef base fill:#fff,stroke:#666,stroke-dasharray:4 3,color:#333
classDef reach fill:#fdf6e8,stroke:#c98a1b,color:#333
class ha,owui,oc,dec surface
class hermes gateway
class ollama,stt,tts,apps model
class viking,honcho,craw reach
class platform base
Every service is a folder. Its flag — EXIST_IS_<CATEGORY>_<SLUG> — is derived from the path,
so adding a service is adding a folder. Disabled services are skipped entirely: no
templates render, no secrets are generated, nothing lands on disk.
📖 The Pieces for the whole model.
| Hermes | Agent gateway — one OpenAI-compatible endpoint for every surface |
| Ollama | Local models |
| Open WebUI | Day-to-day chat |
| WhisperX | Speech → text, with speaker diarization |
| Chatterbox | Text → speech |
| OpenViking | Context database — memory, resources, skills |
| Honcho | Cross-session memory |
| Firecrawl | Web scraping API for agents |
| ComfyUI | Image and video generation |
| MCP | Tool servers for agents |
| Actual Budget | Budgeting |
| Immich | Photos and video |
| Obsidian | Notes and tasks (desktop app, plain files) |
| Mealie | Recipes and meal planning |
| Home Assistant | Home automation and voice |
| Ntfy | Notifications |
| Nextcloud | File sync and sharing |
| MinIO | S3-compatible object storage |
| Collabora | Document editing in the browser |
| Redis | Nextcloud cache |
| Decree | The automation engine — routines, cron, webhooks |
| NocoDB | Database as a spreadsheet |
| Appsmith | Internal tool builder |
| Lowcoder | Customer-facing app builder |
| code-server | VS Code in the browser |
| IT-Tools | Developer odds and ends |
| Caddy | Hostnames and TLS for everything |
| pi-hole | LAN DNS and ad blocking |
| Dashy | One page linking to all of it |
| Portainer | Container management |
| Grafana · Loki · Prometheus | Dashboards, logs, metrics |
| Uptime Kuma | Notifications when something goes down |
Considered and rejected alternatives, with reasons, live in the graveyard.
A flow is one complete path from something happened to it was handled:
- Note → Action — a thought worth chasing gets chased, and comes back with the right questions
- Camera → OCR — photograph something, get back its text
- Recording → Transcription — recordings become searchable, speaker-labelled text
- Bank Alert → Budget — transaction emails become budget entries
The documentation is layered like a C4 diagram — each level zooms in one step, and you can stop at any of them.
| Level 1 | What It Is | What this is and what it does for you |
| Level 2 | The Pieces | What's actually running and how it fits |
| Level 3 | Flows | How one job gets done, start to finish |
| Level 4 | Build On It | The contract to write against |
This project runs multiple open source projects under their respective licenses. See Open Source Notices and the licensing audit.