Skip to content

Repository files navigation

Existential

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
Loading
  • 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.

🚀 Quick start

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.

How it fits together

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
Loading

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.

What's in it

AI

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

Your stuff

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

Storage

Nextcloud File sync and sharing
MinIO S3-compatible object storage
Collabora Document editing in the browser
Redis Nextcloud cache

Build your own

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

Hosting and monitoring

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.

What it does with all that

A flow is one complete path from something happened to it was handled:

📖 All flows

Docs

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

Third-party software

This project runs multiple open source projects under their respective licenses. See Open Source Notices and the licensing audit.

About

Active second brain. Personal cloud; Nextcloud, Home Assistant, Hermes AI

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Contributors

Languages