UC AI Stack Schematic
UMBRACORE · APPLIED CYBER-PHYSICAL LAB

UC AI Stack Schematic

Current-state system drawing and specifications for the self-hosted AI stack on the lab LAN: two GPU inference nodes, a five-container service tier on Proxmox, the private YaCy index, a Proxmox Backup Server off the storage array, a Tailscale gateway for remote access, a planned MailHub for local email, the UmbraCore website (staging in the lab, production on a Linode), and no cloud model route connected.

Dwg no.
UC-AI-001
Revision
M · 2026-10-18
Baseline
baseline-20261004
Owner
Dennis Cary
Class
Public · scrubbed

System schematic SHEET 1

LAN request path Fallback only Private data / index Leaves the lab Local zone Restricted Cloud Parked / unassigned
PUBLIC WEB SEARCH Bing · Google · Mojeek · Wolfram queries only, via SearXNG GOOGLE GEMINI API NOT CONNECTED TO THE STACK no live route from LiteLLM UBIQUITI UDM PRO · GATEWAY / FIREWALL LAN gateway LAN · routing, NAT, firewall WAN1 gigabit fiber (primary) · WAN2 5G (failover) VLANs, zone rules, IDS/IPS: not captured INTERNET EDGE All lab egress passes the UDM Pro. Out: SearXNG search queries. In: Tailscale tunnel to dcmint. Planned: MailHub fetches from mail providers. Out: website push (SSH) to the Linode. LAN · UNIFI SWITCHING · TAILSCALE MESH OBSIDIAN WORKSTATION Vault in Cryptomator · Google Drive sync anythingllm-sync → Dexter RAG UC-Forge 1.0.1 → LiteLLM :4000 UC Report Inbox ← n8n outbox Pane of Glass → AnythingLLM DCMINT · TAILSCALE GATEWAY LAN · tailnet tailnet address · Linux Mint i7-11700 · 8C / 16T · 16 GB · 256 GB NVMe Remote access into the lab LAN Routes, exit node, ACLs: not captured Desktop box · only remote-access path tailnet · WireGuard YACY INDEX :8090 ~300 GB private index SearXNG engine, local mode queries never leave LAN disk on uc-ai-array iSCSI PROXMOX CLUSTER · PVE 9.2.21 · LXC · CT160, 162–164 DISKS ON uc-ai-array iSCSI CT161 ANYTHINGLLM :3001 · client ws Dexter → dexter ws Becky → becky @agent → stack CT160 LITELLM GATEWAY :4000 · /ui routes dexter · default chat becky · fails closed stack · gadget Postgres 16 (keys, spend) Presidio (no cloud route) message logging OFF ≥ 6 GB RAM CT162 N8N :5678 · SQLite research-library morning-brief report-outbox CT163 CREWAI :8000 · systemd crewai-api (venv) ← /webhook/crew CT164 VANE :3000 · Vane SearXNG bundled embeddings local MiniLM-L6-v2 LLM → stack HERMES AGENT · LXC hc Ubuntu 24 · web dashboard PARKED 2026-10-03 GPU contention on Dexter PVE CLUSTER · 4 NODES 4 × LattePanda Sigma (identical) i5-1340P · 12C / 16T each 32 GB LPDDR5 soldered each Σ 48C / 64T · 128 GB RAM 500 GB NVMe + iSCSI LUNs 1 GbE active per node · no dGPU DEXTER · PRIMARY Ryzen AI 9 HX 370 · 96 GB DDR5 · RTX 5070 12 GB · Ubuntu 26.04.1 AnythingLLM :3001 Docker v1.16.1 · multi-user ws dexter ws becky (restricted) SMB AI-Share mounted LM Studio :1234 llmster headless · CUDA openai/gpt-oss-20b 64K context · sole model CUDA 13.2 · drv 595.91.07 GADGET · FALLBACK G1 Pro · 8945HX · 32 GB · 5060 8 GB · Win 11 AnythingLLM :3001 ws assistant-chats Qwen3-VL 8B Instruct (vision) Answers only when Dexter fails QNAP NAS AI-Share host · second QNAP unit \\AI-Share (SMB) → Dexter ingestion UCArray2 (Proxmox CIFS) Old backup CIFS target offline pbs-1 is now the backup target UC-AI-ARRAY · QNAP TS-932PX · iSCSI TARGET FOR THE CLUSTER QTS 5.2.10 · AL324 4 × Cortex-A57 @ 1.7 GHz · 16 GB RAM · eth0 (1 GbE) carries all traffic · eth1 idle · eth2/eth3 no link HDD · 4 × Seagate 12 TB ST12000DM0007 md2 RAID 5 · 32.7 TiB usable · [UUUU] healthy SSD data · 2 × WD Red SA500 4 TB md3 RAID 1 · 3.45 TiB usable · [UU] healthy SSD cache · 2 × Crucial BX500 2 TB md1 RAID 1 · 1.63 TiB · likely read-write PBS-1 · PROXMOX BACKUP SERVER · BACKUP TARGET OFF THE ARRAY Xeon E-2314 · 4C / 4T · 32 GB RAM · no swap · nic0 LAN on the stack LAN · link speed, PBS version, datastore and jobs not captured rpool · 4 × Seagate ST2000DM008 2 TB ZFS RAIDZ1 · ~5.2 TB usable · 283 GB used · ONLINE Jobs · retention · verify: not captured Dexter storage needs proxmox-backup-client Desktop SMR drives · OS + data on one pool slow resilver · datastore growth can fill / MAILHUB · PLANNED · PROXMOX CONTAINERS · CTID / IP NOT ASSIGNED Local copy of every POP3 / IMAP account · Outlook reads it over IMAP · run-and-done deploy script · AI triage stays on Dexter via LiteLLM 1 · Fetch pull POP3 / IMAP accounts outbound to providers 2 · Store + rules local mailboxes, folder rules IMAP (TLS) → Outlook 3 · Scan spam, phishing, attachments before AI sees it 4 · AI triage → LiteLLM mail is private data · local only no work mailboxes → CT160 LiteLLM :4000 → UDM Pro → mail providers backup → pbs-1 UCWEB · STAGING WEBSITE · LXC Ubuntu 24.04 · nginx + PHP 8.3-FPM (pool user ucweb) + MariaDB · WordPress 7.1.3 · /var/www/umbracore · edits approved here first Push to Live · wp-admin button mu-plugin → trigger file → systemd path unit → /usr/local/sbin/umbracore-push.sh (root) Push sequence preflight → backup live DB → export + rewrite URLs → rsync wp-content → import → health check Safety single-run lock · auto DB rollback if not HTTP 200 one multiplexed SSH session per push LINODE · UMBRACORE-WEB · WWW.UMBRACORE.NET · PRODUCTION Ubuntu 24.04.5 · 4 GB · Nginx :443 (TLS, HTTP/2) → Apache 127.0.0.1:8080 → PHP 8.3-FPM → MariaDB · WordPress 7.1.3 Let's Encrypt · auto-renew umbracore.net → www · HSTS · security headers Host firewall + cloud firewall fail2ban sshd + wp-login rate limit deploy user · sudo: wp as www-data only last 10 live DB backups in ~deploy/backups SSH push · one session per publish · via UDM Pro anythingllm-sync report outbox stack (JSON) dexter · becky stack fallback · gadget SMB ingest CT backups via PVE nodes → pbs-1 iSCSI · LiteLLM n8n CrewAI Vane YaCy

Every request from a client, agent, or workflow enters through CT160 LiteLLM. Two paths leave the LAN: SearXNG public search queries, and the website push from ucweb to the Linode over SSH. The website is not part of the AI stack and holds no private data; it publishes only what is approved on staging. Gemini is not connected, so no model traffic reaches a cloud service. LiteLLM, n8n, CrewAI, Vane and YaCy all run from uc-ai-array iSCSI storage, so the array and its single 1 GbE link sit under the whole service tier. Backups leave the array for pbs-1, a separate box on the same LAN. Remote access comes in through Tailscale on dcmint, an encrypted tunnel that lands inside the LAN, so what a tailnet device can reach is set by the Tailscale ACLs, not the UDM Pro. MailHub (planned) will hold a local copy of personal mail. Its only outbound traffic is fetching from the mail providers, and its triage calls stay on Dexter through LiteLLM. Becky has no fallback and no cloud path.

Compute and storage nodes SHEET 2

Dexter

Hardware profile 2026-10-01
Role
Primary inference and RAG. Keeper node. All private data lives here.
Chassis
Micro (HK) Tech "AI Series" mini-PC · board Meigao F8BAC · BIOS AMI 1.04 (2025-04-11)
CPU
AMD Ryzen AI 9 HX 370 (Zen 5) · 12C / 24T · 5.16 GHz max · 24 MB L3 · XDNA NPU (unused)
Memory
96 GB DDR5-5600 SO-DIMM (2 × 48 GB Micron) · both slots used
dGPU
NVIDIA RTX 5070 · GB205 · 12 GB GDDR7 · 250 W limit · compute 12.0
GPU link
PCIe x4 @ 2.5 GT/s (capable x16 Gen4/5). Runs through a riser.
iGPU
Radeon 890M (drives the HDMI console)
Storage
Crucial P3 2 TB NVMe · 1% wear · root LV 100 GB, ~74% used · ~1.7 TB unallocated in VG
Network
2 × RTL8125 2.5 GbE in bond0 (both linked at 1 GbE) · Wi-Fi 7 down
OS
Ubuntu 26.04.1 LTS · kernel 7.0.0-34 · Docker 29.8.0
GPU stack
nvidia-driver-595-open 595.91.07 · CUDA 13.2 · LM Studio CUDA runtime (Vulkan retired)
LM Studio
Headless llmster under user dc · :1234 OpenAI-compatible · openai/gpt-oss-20b only · 64K context
AnythingLLM
Docker (docker run, not compose) · v1.16.1 · :3001 · multi-user mode · storage /opt/anythingllm/storage · NAS share \\nas\AI-Share
Workspaces
dexter (Chief-of-Staff) · becky (restricted)

VRAM fit: gpt-oss-20b weights are roughly 12–13 GB in MXFP4, so on a 12 GB card part of the model or KV cache likely sits in system RAM at 64K context. Check the live split with lms ps and nvidia-smi before deciding on a larger card.

Gadget

Model spec 2026-10-08
Role
Current: failover for dexter and stack, direct gadget route. Mostly idle.
Chassis
Minisforum AtomMan G1 Pro · 3.8 L vertical mini-tower · 215 × 57 × 315 mm · 3.81 kg
CPU
AMD Ryzen 9 8945HX (Dragon Range, Zen 4) · 16C / 32T · 5.4 GHz max · 80 MB total cache · iGPU drives one HDMI
dGPU
NVIDIA RTX 5060 · 8 GB GDDR7 · 145 W TDP
Memory
32 GB, one SO-DIMM (slot P0 Channel B, module rated 5600 MT/s) · second slot empty · single-channel · board max 2 × 48 GB DDR5-5200
Storage
2 × M.2 2230/2280 PCIe 4.0 NVMe, 4 TB per slot max · Installed drives not captured
Power
Internal 350 W PSU · 245 W sustained CPU+GPU (100 + 145) · Office / Gaming / Beast profile switch
Cooling
Glacier gen-3: dual 8015 fans, five copper heat pipes, rated 300 W
Network
5 GbE RJ45 (Realtek RTL8126) · Wi-Fi 7 · BT 5.4 · Switch-port speed not captured
Display out
2 × HDMI 2.1 (1 iGPU, 1 dGPU) · 2 × DP 2.1b · 1 × DP 1.4a · up to four 4K
USB
Front: 1 × USB-A 10 Gb, 1 × USB-C data · Rear: 2 × USB-A 10 Gb, 1 × USB-C data
OS
Windows 11 Pro · bare metal (Linux conversion under consideration)
Serving
AnythingLLM :3001 · workspace assistant-chats · Qwen3-VL 8B Instruct (vision) · up from 4B on 2026-10-10
Planned
Blueprint (Oct 7) makes Gadget "The Worker": n8n, Perplexica, vision/OCR via LM Studio. Not implemented.

Expansion limit: the 350 W internal supply is already budgeted at 245 W sustained for CPU and GPU, and the chassis has no open slot, so a second GPU in this box is not an option. VRAM growth means an external GPU or a different node. Run Gadget in Beast mode for inference and check its thermals under a long load. VRAM fit: Qwen3-VL 8B at Q4 is about 5–6 GB of weights plus the vision projector, which leaves roughly 2 GB for KV cache on the 8 GB card. Keep context modest, and confirm nothing spills to the single-channel system RAM.

Proxmox cluster · 4 × LattePanda Sigma

Captured 2026-10-08
Nodes
uc-ai-ve-1 + 3 identical nodes · Other node names not captured
System
LattePanda Sigma SBC · BIOS 5.27
CPU / node
Intel Core i5-1340P (Raptor Lake-P) · 4P + 8E = 12C / 16T · Iris Xe iGPU
RAM / node
32 GB LPDDR5, soldered (8 × 4 GB channels) · not upgradeable
Disks / node
WD_BLACK SN770 500 GB NVMe · iSCSI LUNs 2 TB + 1 TB from uc-ai-array (shown on uc-ai-ve-1)
Network / node
nic0 1 GbE up · nic1 down · Wi-Fi down
Cluster total
48 cores / 64 threads · 128 GB RAM · ~2 TB local NVMe
Platform
Proxmox VE 9.2.21 · kernel 7.0.14-23-pve
Stack guests
CT160–164 · unprivileged Ubuntu 24.04 · nesting=1,keyctl=1 · onboot · Current node not confirmed (uc-ai-ve-1 reports 0 CTs)
Guest storage
CT160 LiteLLM, CT162 n8n, CT163 CrewAI, CT164 Vane and YaCy run on iSCSI LUNs from uc-ai-array Stated · CT161 AnythingLLM Not captured
Restore pts
baseline-20261004 (CT160–164) · yacy-20261004 (CT164) · pbs-1 backups Not captured

uc-ai-array

Captured 2026-10-09
Role
iSCSI block storage for the Proxmox cluster. Holds the disks for LiteLLM (CT160), n8n (CT162), CrewAI (CT163), Vane (CT164) and YaCy. If it stops, the gateway stops, and every route stops with it.
Model
QNAP TS-932PX · 9 bays (4 × 3.5" + 5 × 2.5")
Firmware
QTS 5.2.10
CPU
Annapurna Labs Alpine AL324 · 4 × ARM Cortex-A57 @ 1.7 GHz
RAM
16 GB (15.8 GiB visible, 13.1 GiB available) · the model's maximum
Network
eth0 LAN @ 1 GbE, all traffic (≈256 GiB in / 354 GiB out) · eth1 LAN @ 1 GbE, same subnet, nearly idle · eth2, eth3 no link (the 1000 they report is not a live link) · bond0–3 defined, unused
Data arrays
md2 RAID 5 · 4 × 12 TB HDD · 512K chunk · 32.7 TiB (36.0 TB) usable · [UUUU]
md3 RAID 1 · 2 × WD Red SA500 · 3.45 TiB (3.8 TB) usable · [UU]
Cache
md1 RAID 1 · 2 × Crucial BX500 · 1.63 TiB · [UU] · mirrored, which QTS requires for read-write cache
System
md9, md13 (QTS system, all 8 disks) · md256, md321, md322 (swap) · all healthy, no failed members
LUN map
Not captured which array backs the 2 TB and 1 TB LUNs
BayDriveSizeUse
1–4Seagate ST12000DM0007 (3.5" SATA HDD)4 × 10.91 TBData
5Empty——
6–7Crucial BX500 2 TB (2.5" SATA SSD)2 × 1.82 TBCache
8–9WD Red SA500 4 TB (2.5" SATA SSD)2 × 3.64 TBData
Raw / usable54.6 TB / 39.8 TBusable = RAID 5 HDD + RAID 1 SSD

Both copper ports negotiated 1 GbE, so the switch side is gigabit. The TS-932PX's two 10GbE SFP+ ports are the likely eth2/eth3 and have no link, so all iSCSI rides one gigabit port. A RAID 5 rebuild after one 12 TB drive fails reads all three survivors end to end, about a day on this CPU, with no redundancy during that time.

pbs-1

Captured 2026-10-10
Role
Proxmox Backup Server. Backup target for the cluster, on a different box than uc-ai-array
Chassis
Model not captured
CPU
Intel Xeon E-2314 · 4C / 4T (no Hyper-Threading) · 2.8 GHz · 1 socket
Memory
32 GB (31 GiB visible, 2.4 GiB used, 28 GiB available) · no swap
Network
nic0 LAN, same LAN as the stack · 29 RX / 7 TX drops · Link speed not captured
PBS
Not captured version, datastore name and path, backup jobs, prune and verify schedules, encryption
Disks
4 × Seagate BarraCuda ST2000DM008 2 TB (3.5" desktop drive, SMR) · each split 1 GB EFI + ZFS member
Pool
rpool · RAIDZ1 (7.27 TB raw, ~5.2 TB usable) · 283 GB allocated (3%) · 6% frag · dedup off · ONLINE
Filesystem
rpool/ROOT/pbs-1 on / · 206 GB used of 5.2 TB · no separate datastore dataset in the listing, so backups likely share the root dataset
Boot
EFI partition on all four disks · boots from the same pool that holds the backups

The 5.2 TB of space is plenty for this stack. The drives are the weak point. ST2000DM008 is shingled (SMR), and SMR drives slow badly under sustained writes. A ZFS resilver after a disk failure can take days, and with RAIDZ1 the pool has no redundancy until it finishes. Plan to swap in CMR NAS drives (IronWolf or WD Red Plus) as budget allows. Until then, keep a copy of the most important backups somewhere else.

dcmint · Tailscale gateway

Captured 2026-10-10
Role
Tailscale gateway into the lab LAN. The remote-access path for tailnet devices
OS
Linux Mint desktop · Version not captured
CPU
Intel Core i7-11700 (Rocket Lake) · 8C / 16T · 2.5 GHz base
Memory
16 GB (15 GiB visible, 13 GiB available) · 2 GB swap, unused
Storage
WD PC SN530 256 GB NVMe · ext4 / 17 GB used (8%) · 512 MB EFI
LAN
enp0s31f6 LAN (onboard Intel) · 0 errors · 79,149 RX dropped of 8.2 M packets (~1%) · Link speed not captured
Tailnet
tailscale0 tailnet address · MTU 1280 · ~1.3 GB in / 3.2 GB out
Tailscale
Not captured advertised routes, exit node, SNAT, key expiry, tailnet ACLs

Remote access to the lab rides Tailscale through this node; the tailnet policy decides which lab services a remote device can reach.

MailHub · local mail hub

Planned · not deployed
Purpose
Download and keep a local copy of mail from all POP3 / IMAP accounts so Outlook reads one place Stated
Functions
Folder rules · scanning for problems · access for the AI stack Stated
Deploy
Containers on Proxmox, built by a run-and-done script Stated
AI
Triage on Dexter through LiteLLM. Moving it to Gadget was considered and set aside for now Stated
Not captured
CTID, IP, node, disk location, account list, mail store size, component choices
Suggested parts
Fetch: getmail6 or fetchmail · Store: Dovecot IMAP with Sieve for rules · Scan: rspamd + ClamAV · Triage: small worker calling LiteLLM Proposal
Route
Use stack, not dexter. The dexter route passes through AnythingLLM, which drops JSON schema and adds vault RAG and the Chief-of-Staff persona to every email. stack is LM Studio on the same box with structured output intact. Give MailHub its own virtual key limited to stack
Auth
Gmail and Microsoft 365 no longer accept a plain password for IMAP / POP. Plan on app passwords (Gmail) or OAuth2 (Gmail, M365). Keep credentials in a root-only 600 secrets file inside the container
Disk
Mail store on local NVMe or iSCSI, not the AI-Share SMB path. Back it up to pbs-1 from day one

Overlap: Mailsort (Sheet 2, Parked) is a Gmail-only classifier with a morning digest. MailHub covers the same job for every account, so Mailsort can likely be retired or folded into MailHub's triage step once MailHub is up.

UmbraCore website · ucweb → Linode

Built 2026-10-18
Role
Public site www.umbracore.net: portfolio and project field notes. Staging in the lab, production on a Linode. Edits happen on staging only
Staging
LXC ucweb · Ubuntu 24.04 · nginx + PHP 8.3-FPM (pool user ucweb) + MariaDB · WordPress 7.1.3 · /var/www/umbracore · DB umbracore_wp · prefix wp_
Production
Linode umbracore-web · Ubuntu 24.04.5 · 3.8 GB RAM · 79 GB disk · Nginx :80/:443 → Apache 127.0.0.1:8080 (mpm_event, remoteip) → PHP 8.3-FPM → MariaDB · DB wp_umbracore · /var/www/umbracore
TLS
Let's Encrypt (webroot) for www + bare domain · auto-renew with nginx reload hook · issued 2026-10-18, expires 2027-01-16
Hardening
Host and cloud firewalls · fail2ban (sshd, nginx-limit-req) · wp-login 6 req/min · xmlrpc.php blocked · no PHP in uploads · HSTS + security headers · DISALLOW_FILE_EDIT · unattended upgrades
Push trigger
wp-admin 🚀 Push to Live (mu-plugin, staging only) writes /var/lib/umbracore-push/trigger → umbracore-push.path → umbracore-push.service · CLI umbracore-push.sh --dry-run | --push
Push steps
Preflight (siteurl, core versions) → gzip backup of live DB (keep 10) → export staging DB with wp search-replace to https://www.umbracore.net → rsync wp-content (excludes cache, push plugin, mcp-adapter) → import → flush → HTTP 200 health check, auto-restore DB on failure
Transport
SSH key deploy@the Linode · one ControlMaster session per push · deploy may run only wp as www-data · wp-content owned deploy:www-data, setgid

Staging is the source of truth: each push replaces the live database, so comments or edits made directly on the Linode are lost. Update WordPress core on both sides to the same version; plugins and themes on staging, then push.

Supporting systems

Stated
YaCy
:8090 · ~300 GB index · private SearXNG engine (local mode, enable_http: true) · disk on uc-ai-array iSCSI
NAS
QNAP LAN · AI-Share SMB for Dexter · UCArray2 CIFS · Same unit as uc-ai-array not confirmed
Edge
Ubiquiti UDM Pro: gateway, NAT and firewall for the lab · WAN1 gigabit fiber, WAN2 5G failover · Firmware, VLANs, rules not captured
Network
UniFi switching · Tailscale mesh, entering the LAN through dcmint (LAN)
Monitoring
Prometheus / Grafana deployed (no GPU or LiteLLM dashboards yet)

Parked and spare

Not in service
Hermes Agent
LXC hc, Ubuntu 24, web dashboard. Wired to Dexter LM Studio + AnythingLLM RAG. Parked Oct 3: contends with AnythingLLM for Dexter's single GPU.
Gemini route
Not connected to the stack. No live LiteLLM route, no key in use. Presidio config kept for when a cloud route returns.
Mailsort
Built Oct 6 (Gmail classifier + 06:30 digest via local LLM). Deployment unconfirmed

Service containers SHEET 3

CTHostEndpointRuntimeFunctionKey pathsDiskStatus
160litellm:4000Docker: LiteLLM main-stable, Postgres 16, Presidio ×2Single model gateway, virtual keys, PII guardrail (idle: no cloud route)/opt/litellm/{compose.yaml,config.yaml,.env}iSCSIVerified
161anythingllm:3001Docker: AnythingLLM, password setFront door. Holds Dexter and Becky persona prompts/opt/anythingllm/{server.env,storage/}Not capturedVerified
162n8n:5678Docker: n8n, SQLiteOrchestrator: research, morning brief, report outbox, crew relay/opt/n8n/{compose.yaml,data/,workflows/}iSCSIVerified
163crewai:8000Python venv, systemd crewai-apiMulti-agent tasks behind /webhook/crew/opt/crewai/{app.py,.env}iSCSIVerified
164perplexica:3000Docker: Vane (ex-Perplexica) + SearXNGCited web research; YaCy + public engines/opt/perplexica/{compose.yaml,searxng-settings.yml}iSCSIVerified

Model routing · LiteLLM SHEET 4

RouteBackendUpstream URLFallbackAllowed keysUse
dexterDexter AnythingLLM ws dexter:3001/api/v1/openaiGadget assistant-chatsClient keyDefault chat, RAG over vault
beckyDexter AnythingLLM ws becky:3001/api/v1/openaiNone · fails closedClient keyRestricted, manual chat only
stackLM Studio direct, openai/gpt-oss-20b:1234/v1Gadget assistant-chatsAllMachine calls, @agent, JSON schema, tools
gadgetGadget AnythingLLM:3001/api/v1/openai—AllDirect vision model (Qwen3-VL 8B)
mailhub keyMailHub triage worker → stackvia :4000None · triage waitsNew mailhub key, stack onlyPlanned Email classification and summaries
geminiNot connected No live route. Nothing in the stack reaches a cloud model.—
Settings
turn_off_message_logging: true · store_prompts_in_spend_logs: false · drop_params: true with model_info on stack so JSON schema survives
Presidio
No route to guard MASK: person, email, phone, IP, driver license, medical license · BLOCK: SSN, ITIN, passport, bank, card, IBAN · tested fail-closed
Why two Dexter paths
AnythingLLM's OpenAI endpoint drops JSON-schema and tool options, so anything structured goes straight to LM Studio via stack.

Workspaces, agents and workflows SHEET 5

Personas

WhereNameChat@agent
CT161 clientDexter · Chief of Staffdexterstack
CT161 clientBecky · restrictedbeckystack
Dexter nodedexter, becky (RAG stores)gpt-oss-20b
Gadget nodeassistant-chatsQwen3-VL 8B
Stack-wideConfidant / thinking partnerHonest pushback, plain prose

Personas live in the client because AnythingLLM's API replaces the upstream workspace prompt with the caller's. Upstream RAG still applies.

Automation

Agent skills
uc-web-research → n8n /webhook/research · uc-crew-task → n8n /webhook/crew
n8n flows
research-library v2 · morning-brief v2 · report-outbox (→ UC Report Inbox in Obsidian)
CrewAI
FastAPI app behind systemd, model stack
Agent Flow Lab
Four teaching flows installed in AnythingLLM
MailHub
Planned fetch → rules → scan → triage via LiteLLM stack
Gaps
@agent skills not tested end to end from the chat box

Data boundaries SHEET 6

Restricted

  • Becky workspace on Dexter only
  • Manual chat only. No agents, n8n, CrewAI or web paths
  • No fallback, no cloud route

Local · private

  • Vault, RAG, YaCy, all inference on Dexter and Gadget
  • LiteLLM stores usage only, not content
  • Work and patient data excluded from this stack entirely
  • MailHub mail store and triage (planned): personal accounts only, never leaves the LAN

Egress

  • SearXNG public engines (queries)
  • Tailscale: encrypted remote access in through dcmint. An inbound path, not data egress
  • MailHub (planned): fetches from mail providers. Credentials go out, mail comes in
  • Website push: SSH from ucweb to the Linode. Carries only published site content
  • Gemini: not connected. No model traffic leaves the lab
  • Claude and other cloud AIs: no PII

Retired components SHEET 7

Ollama + Open WebUI
Replaced by LM Studio + AnythingLLM. "Gadget" persona and Hindsight memory layer went with it.
mem0 / Qdrant
Dropped after contamination and schema issues
WhiteRabbitNeo
Removed from Dexter; gpt-oss-20b is the only model
l-llm (old router on gap-02)
Superseded by CT160 at LAN
Vulkan runtime
Replaced by CUDA on Dexter
Qwen3-VL 4B
Replaced on Gadget by Qwen3-VL 8B Instruct, 2026-10-10