A private, local AI command centre that knows your notes.
Local-first · Ollama · Tailscale · Syncthing · Obsidian
Runs entirely on 127.0.0.1 — no cloud, no accounts, no telemetry.
Aether Hub is a JARVIS-style control dashboard for your personal Linux workstation. It unifies a local AI model and your own knowledge base behind one calm interface: chat with a model running on your machine, and watch it draw on your Obsidian notes rendered as a living graph. Everything is served from a Flask process bound to loopback — your data never leaves the machine.
It is not a browser extension and has no runtime dependencies beyond the local services it talks to. Anything that isn't running simply shows as offline.
One-line installer — creates the virtualenv, installs dependencies, and adds an app launcher:
./install.shOr the manual path:
cd server
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python3 server.pyThen open http://127.0.0.1:5000.
On every launch,
run.shcreatesserver/venvon first run, installs requirements, and starts the server — so./run.shis all you need day to day.
Requirements: Python 3.10+ and python3-venv (sudo apt install python3-venv on
Debian/Ubuntu/Mint). Ollama with a model is optional but required for Chat and
Agents — the first-run wizard can pull one for you.
Everyday tools first, power-user extras last.
| Surface | What it does |
|---|---|
| Chat | Talk to your local model via Ollama. Pick a model per message; toggle tools for vault / files / browser. |
| Memory (your notes) | Your Obsidian vault as a live graph — every note a node, every [[wikilink]] an edge. Search, filter, minimap, and one-click distil (summarise). |
| Overview | At-a-glance status: active model plus live CPU / RAM / temperature / battery. |
| Agents | Supervised, allow-listed background tasks. Each flows QUEUED → RUNNING → REVIEW → DONE, and every result waits for your approval. |
| Systems | Live health tiles for local services, each with a one-click action. |
Conversations run against a model served locally by Ollama. Nothing is sent to a cloud API; the model, the prompt, and the reply all stay on the machine.
Point Aether Hub at an Obsidian vault and it renders your notes as an interactive graph. Notes are
nodes, [[wikilinks]] are edges, and unresolved links appear dimmed. Pan, zoom, search, filter by
type, and open any node to read its snippet and connections.
┌─────────────────────────────────────────────────────────────┐
│ Browser → app/index.dc.html (single-page DCLogic app) │
│ │ │
│ │ GET /api/state ── live telemetry │
│ │ GET /api/models ── installed Ollama models │
│ │ GET /api/vault/graph ── Obsidian notes → graph │
│ │ POST /api/chat ── model chat (token) │
│ │ POST /api/action ── system actions (token) │
│ │ POST /api/swarm/task ── agent tasks (token) │
│ │ GET /api/setup/status ── first-run detection │
│ ▼ │
│ server/server.py (Flask, 127.0.0.1:5000) │
│ ├─ bg_task thread → polls Ollama / Tailscale / … │
│ ├─ swarm_worker thread → runs allow-listed agent tasks │
│ ├─ vault scanner → notes + wikilinks → graph │
│ └─ pull_models thread → auto-pulls + pre-warms default │
└─────────────────────────────────────────────────────────────┘
- Frontend is a single
index.dc.htmlon the small React-like DCLogic framework, with view logic and state inapp/support.js. No build step. - Backend is a single
server/server.py(Flask) with background threads for telemetry, the agent worker, and the vault scanner. Requirements:flask,flask-cors,requests,psutil.
A one-click toggle in the top bar switches modes. Simple shows just Chat, Memory and Overview — hiding Agents, Systems, the top-bar telemetry and the model rail for a clean, non-technical experience. Advanced reveals everything. Your choice is remembered between sessions.
On first launch a setup wizard checks whether Ollama is running, whether a local model is installed, and whether your vault exists — with one-click buttons to pull a starter model and create a starter vault. It only appears when something needs attention; once you're set up, you go straight to Chat.
Aether Hub works out of the box, but a few environment variables let you tune it:
| Variable | Default | Purpose |
|---|---|---|
AETHER_APP_DIR |
../app (relative to server.py) |
Where the frontend is served from |
AETHER_DEFAULT_MODEL |
dolphin-llama3:8b |
Model the wizard pre-warms / auto-pulls |
| Vault path | ~/Obsidian/AetherVault |
Falls back to ~/Obsidian, then ~/Documents |
| Port / host | 127.0.0.1:5000 |
Loopback only (edit server.py to change) |
- Loopback-only. The Flask backend binds to
127.0.0.1:5000and nothing else — it is not reachable from your network. - Per-launch token. Each launch mints a fresh token injected into the served page; state-changing
requests (
/api/chat,/api/action,/api/swarm/*) are refused without it. - Action allow-list. Agents and system actions run only from a fixed allow-list of safe, read-only operations — no arbitrary shell, no injection.
- No telemetry. Aether Hub talks to nothing on the internet. Your notes and conversations stay on the machine.
ensurepip is not available/ venv won't create — install the venv package:sudo apt install python3-venv(orpython3.12-venvfor a specific version), then re-run./install.sh.- Port 5000 already in use — stop the old instance:
lsof -ti:5000 | xargs -r kill. - Chat says a model isn't available — start Ollama (
ollama serve) and pull one (ollama pull dolphin-llama3:8b), or use the first-run wizard's one-click pull. - A Systems tile shows offline — that service simply isn't running; start it and the tile turns green.
- Memory graph is empty — point the vault at an Obsidian folder and add a couple of
.mdnotes, or use the wizard's "Create starter vault".
- Deep-link a view by hash:
#chat-style routing uses the internal view keys#console,#memory,#core,#swarm,#systems— handy for bookmarks. - Theme it with the colour dots in the top bar; the choice persists.
- Launch from your app menu —
install.shadds an "Aether Hub" entry, and can enable autostart-on-login (remove~/.config/autostart/aether-hub.desktopto undo).
- Richer Memory graph (backlinks pane, tag clustering)
- More allow-listed Agent task types
- Per-service quick actions in Systems
- Optional light theme
- Streaming chat responses
Issues and pull requests are welcome. The stack is deliberately small — a single Flask file and a single-page frontend, no build step — so it's easy to run and hack on. Please keep the loopback-only, no-telemetry, allow-listed-actions posture intact for anything that touches the system.
MIT.


