Nexa — Neural Nexus for Information & Automation¶
Repo: https://git.nuclide.systems/fkrebs/nexa
Stack location: CT104 /opt/stacks/nexa/
Status: Designed, partially implemented — Phase 1 workflows exist; not yet deployed end-to-end.
Synopsis¶
Nexa is a personal AI middleware layer that sits between input sources and organisation tools. It is not a new app — it is a set of wired-together workflows running on top of services already deployed in nuclide.systems.
Mental model: - Memos = mouth and ear (voice interface, reply surface) - n8n = reflexes (workflow logic, classification, routing) - LiteLLM / SAIA = brain (language model gateway) - Qdrant = long-term memory (semantic recall) - Nextcloud = hands (tasks, calendar, files, mail)
The user types (or speaks) into Memos. A Memos webhook fires an n8n workflow. n8n classifies the input (Work vs. Personal, command vs. capture), calls LiteLLM for any reasoning, stores embeddings in Qdrant, and writes back a comment on the original memo. Side effects — task creation, calendar blocks, archive entries — go to Nextcloud.
What Nexa is not¶
- A replacement for specialist UIs (Arcane, Dozzle, Grafana).
- An active document editor.
- A work-IT bridge (work mail/servers remain out of scope).
Core goals¶
- Cognitive offload — sort, filter, propose; don't just store.
- Context separation — clean Work vs. Personal split enforced by LLM classification.
- Single interaction point — Memos is the only interface the user must open.
- Knowledge synergy — link ephemeral memos to deep Obsidian notes via semantic search.
How Nexa maps to nuclide.systems¶
Every component Nexa depends on is already deployed. Nothing new needs to be provisioned for Phase 1–2.
| Nexa concept | nuclide.systems service | Host | URL/port |
|---|---|---|---|
| Interface / voice | Memos | CT104 | https://memos.nuclide.systems |
| Workflow engine | n8n | CT104 | http://192.168.1.40:15678 |
| LLM gateway (SAIA) | LiteLLM | CT104 | https://ai.nuclide.systems (internal :4000) |
| Vector memory | Qdrant (qdrant_scientific) |
CT104 | internal :6333 |
| File / task / calendar | Nextcloud | CT105 | https://nc.nuclide.systems |
| Link curation | Karakeep | CT104 | https://hoarder.nuclide.systems |
| Push alerts | ntfy | CT104 | https://ntfy.nuclide.systems |
| Note vault | Obsidian (via Nextcloud WebDAV) | CT105 | nc.nuclide.systems/Notizen/ |
| Auth / SSO | Pocket-ID | CT110 | https://id.nuclide.systems |
| Reverse proxy | Zoraxy | CT108 | all *.nuclide.systems |
| Push notifications (alerts) | Gotify | CT104 | internal :10003 |
| Social feed | Bluesky | external | API only |
Nextcloud Mail (fkrebs@nucli.de) |
CT105 | IMAP via NC | |
| Web fetch (Phase 2.4) | crawl4ai MCP | CT104 | via MCP gateway |
| Search (Phase 2.4) | SearXNG (if deployed) | CT104 | internal |
What is genuinely missing¶
| Missing component | Phase needed | Notes |
|---|---|---|
| TEI (text-embeddings-inference) | Phase 3.1 | Self-hosted embeddings for Qdrant ingest. bge-m3 model, CPU-only, ~1.1 GB RAM. Deploy as nexa-embed container on CT104. |
| Ontotext GraphDB | Phase 3.4 | SPARQL structural memory. Deferred until Phase 3.1–3.3 ship. Needs ~4 GB heap on CT104. |
nexa_knowledge_text Qdrant collection |
Phase 3.1 | One curl -X PUT against the existing qdrant_scientific instance. |
| n8n workflow import | Phase 1 | JSON exports are in nexa-core/n8n-workflows/. Import via n8n API or UI. |
| Memos → n8n webhook | Phase 1 | One URL field in Memos admin: https://n8n.nuclide.systems/webhook/memos. |
| LiteLLM virtual key for Nexa | Phase 1 | Create nexa user in LiteLLM admin, issue key scoped to one chat model. |
| SearXNG (optional) | Phase 2.4 | Web-search for #nexa:ask --web. Not deployed yet. |
| infinity (Phase 3.2 upgrade) | Phase 3.2 | Replaces TEI to add CLIP-family visual embeddings (jina-clip-v2). |
nexa_knowledge_visual collection |
Phase 3.2 | Second Qdrant collection for image embeddings. Schema already defined in repo. |
Phased roadmap (mapped to infrastructure)¶
Phase 1 — The Spine (no new containers)¶
Wire existing services together. All components are already running.
- Import
nexa-core/n8n-workflows/phase-1/into n8n athttp://192.168.1.40:15678. - Set Memos webhook URL →
https://n8n.nuclide.systems/webhook/memos. - Create LiteLLM virtual key for
nexauser (chat model only — no embeddings yet). - Fill
nexa-core/.envwithMEMOS_API_KEY,SAIA_API_KEY,NC_APP_PASSWORD,QDRANT_API_KEY. - Import
phase-2/2_1_email_butler.jsonand attach Nextcloud Mail credentials in n8n. - Fire
#nexa:configin Memos → confirms Nextcloud lists, calendar IDs, mail folder structure.
Milestone: Memos comment-back works. Work vs. Personal classification active. Email butler running.
Phase 2 — Senses (SearXNG optional)¶
- 2.1 Email butler — already has an n8n workflow JSON. Needs credentials in n8n.
- 2.2 RSS digest — new n8n workflow polling feeds → daily summary memo.
- 2.3 Bluesky antenna — liked posts →
nexa_knowledge_textentries once Qdrant collection exists. - 2.4 Web fetch —
#nexa:ask --web: SearXNG +crawl4aiMCP (already deployed via MCP gateway) + markitdown. - SearXNG not yet deployed on CT104. Deploy if 2.4 is needed.
Milestone: Nexa reads the web, Bluesky, and daily RSS. Morning digest appears in Memos.
Phase 3 — Memory (two new containers; rest is curl commands)¶
- 3.1 TEI + Qdrant collection — deploy
nexa-embedcontainer (CT104), createnexa_knowledge_text, wire TEI into LiteLLM asnexa-embedmodel, add Qdrant ingest step to n8n workflows. - Storage:
/mnt/pve/unas/services/nexa/tei-cache(NFS already mounted on CT104). - 3.2 Visual collection — swap TEI →
infinity, addjina-clip-v2, createnexa_knowledge_visual. Backfill image queue from GraphDB. - 3.3 S3 archive — Qdrant snapshots to
s3.nuclide.systems(Garage). Blocked on Q12/Q20 decision. - 3.4 Ontotext GraphDB — SPARQL pillar. One new container on CT104,
GDB_JAVA_OPTS: -Xmx4g. SPARQL Workbench optionally via Zoraxy →graph.nuclide.systems.
Milestone: #nexa:ask returns answers grounded in Obsidian notes, archived memos, mail threads.
Phase 4 — Motor (no new infrastructure)¶
- Bidirectional NC Tasks sync (Memos checkboxes ↔ Nextcloud Tasks lists).
- Time-boxing agent: calendar-aware gap-finder in NC Calendar → proposes focus slots.
- Karakeep curation: scheduled review workflow flags stale saved links.
Milestone: Memos - [ ] items automatically appear in the right NC Tasks list.
Phase 5 — Daily Integration (HA Voice only new piece)¶
- 5.1 HA Voice — Wyoming protocol bridge from HAOS (VM 100) to Nexa n8n endpoint. Needs Wyoming server container (small) or HA add-on.
- 5.2 System monitoring — Proxmox + Backrest alerts → ntfy → Memos system feed. Homelab watchdog already posts to Gotify; route a copy to Memos via n8n.
- 5.3 Morning digest — daily 07:00 n8n cron: mail summary + tasks + drift report + one open question from
docs/11.
Milestone: Nexa speaks. Morning context summary lands in Memos without user action.
Phase 6 — Homelab Steward (uses existing Arcane + Proxmox APIs)¶
- 6.1 Inventory sync — n8n polls Arcane API + Proxmox API +
docker pson a schedule → snapshot stored in GraphDB. - 6.2 Drift detection — diff snapshot against documented desired state in
docs/→ Memos[STEWARD]comment. - 6.3 Steward commands —
#nexa:retire <svc>,#nexa:document <svc>,#nexa:wishlist-status. - 6.4 Docs self-update — Nexa proposes
docs/11diffs as PRs when the user answers open questions via Memos.
Milestone: Nexa replaces the manual "what's stale?" audit. The homelab docs update themselves.
Tool realization: what's not deployed yet and the options¶
The docs are designed around a specific tool set, but several pieces have alternatives worth considering given the current nuclide.systems stack:
Embeddings (Phase 3.1)¶
The plan calls for TEI + bge-m3. Alternatives:
| Option | Pros | Cons |
|---|---|---|
| TEI + bge-m3 (plan) | Lightest (~500 MB image, ~1.1 GB RAM), OpenAI-compatible, single model, no LLM runtime | CPU-only (fine for the workload) |
| Ollama (already on CT104?) | Already deployed if running | Heavier image, slower cold start, designed for chat not embedding throughput |
| LiteLLM pass-through to Claude | No new container | 10 req/min rate limit — unusable for Qdrant ingest (2k Obsidian notes = 3 h) |
| infinity (skip straight to Phase 3.2) | Supports both text and visual models simultaneously | Slightly more complex setup; Phase 3.2 is not urgent |
Lean: deploy TEI now, swap to infinity when Phase 3.2 visual collection is needed.
Web search (Phase 2.4)¶
The plan calls for SearXNG (not yet deployed):
| Option | Pros | Cons |
|---|---|---|
| SearXNG (plan) | Self-hosted, no API key, privacy-preserving | New container to maintain |
| Exa MCP (already in MCP gateway) | Already wired, no new container | Paid/rate-limited external service |
| crawl4ai alone | Already deployed (Phase 2.4 fetch step) | No search, only direct-URL fetch |
| Brave Search API | Simple, fast | API key + cost |
Lean: use Exa MCP for Phase 2.4 (already available in the gateway), deploy SearXNG only if privacy or rate limits become a concern.
GraphDB (Phase 3.4)¶
The plan calls for Ontotext GraphDB:
| Option | Pros | Cons |
|---|---|---|
| Ontotext GraphDB (plan) | Full SPARQL 1.1, production-grade, free Community Edition | ~4 GB heap; heavyweight for a homelab |
| Apache Jena Fuseki | Lighter, Apache licensed, same SPARQL interface | Less tooling, fewer connectors |
| Oxigraph | Tiny Rust binary (~50 MB), OpenAPI + SPARQL | Newer, smaller community |
| Skip GraphDB entirely | Qdrant alone covers 80% of the Phase 3 value | Phase 6 steward commands lose structural query capability |
Lean: defer until Phase 3.1–3.3 are running. Then re-evaluate Oxigraph vs. GraphDB based on RAM budget at that time.
Open items¶
- [ ] Import Phase 1 n8n workflows (manual step — credentials required in n8n UI).
- [ ] Wire Memos webhook → n8n.
- [ ] Create LiteLLM
nexavirtual key. - [ ] Deploy TEI container on CT104 (Phase 3.1 prerequisite).
- [ ] Create
nexa_knowledge_textQdrant collection. - [ ] Decide SearXNG vs. Exa MCP for Phase 2.4.
See docs/11-open-questions.md in the Nexa repo for all design decisions and their resolution status.