Skip to content

Services

Every Sanctum service has an enabled flag in instance.yaml. Disabled services are skipped by the plist generator, excluded from the dashboard, and ignored by the watchdog. This page is the authoritative catalog of all services in the platform.

The Docker ship — containers carrying services across the stack

Sanctum services catalog — every service, every port, organized by category
🔍 Hover to zoom

There are a lot of them. What started as “I’ll just automate the speakers” has become something that requires its own port allocation strategy and a documentation site. This is either a haus automation system or a small government. The line blurred around service number twelve and never came back.

A $600 aluminum rectangle shouldering the responsibilities of a small government. These six services are the load-bearing walls. Remove any one and the house doesn’t just creak — it files a complaint with the watchdog, the dashboard goes red, and your family asks why the chat isn’t working during dinner.

Every hub node runs all of them. No exceptions, no “I’ll enable that later.” Later is where home automation projects go to die.

ServicePortLaunchAgent / UnitDescription
DenchClaw Gateway1977com.sanctum.gatewayMac-side agent gateway. Runs Jocasta (household management agent) and exposes the agent API.
Home Assistant8123Docker containerHome automation hub. Bridge-networked Docker container with HomeKit bridge on port 21063.
Command Center1111com.sanctum.dashboardWeb dashboard for service status, agent activity, and system health.
Health Centercom.sanctum.health-centerHealth monitoring dashboard for family wellness data.
Holocron (Dench)1977com.sanctum.denchFamily chat interface. Bound to LAN, token-authenticated. Accessible at http://holocron/.
Dench Proxy80com.sanctum.dench-proxyLaunchDaemon (runs as root). Reverse proxy from port 80 to Holocron on port 1977.
services:
gateway:
enabled: true
port: 1977
home_assistant:
enabled: true
port: 8123
homekit_port: 21063
dashboard:
enabled: true
port: 1111

Five AI models sharing a single Mac Mini is either an act of architectural genius or the opening scene of a disaster movie. We’ve been running it for months. The jury remains out, but the Mac Mini hasn’t caught fire, so we’re calling it genius until the thermal paste says otherwise.

This is where Apple Silicon earns its keep. The M4 Pro runs local inference, text-to-speech, and a voice agent simultaneously — the kind of multitasking that would make an Intel chip file a workers’ comp claim.

ServicePortCodenameLaunchAgentDescription
LM Studio1234com.sanctum.lmstudio-serverLocal LLM inference. Serves Qwen 3.5 35B (MoE). API key: lm-studio.
Council-27B MLX1337leet — the coding braincom.sanctum.idle-mlxQuantized Qwen 3.5 27B 4-bit with per-agent LoRA adapters. Runs natively on Apple Silicon via MLX. KeepAlive enabled.
XTTS Voice8008BOOB — Yoda’s mouthcom.sanctum.xtts-serverXTTS-v2 text-to-speech server. Runs on the MPS GPU for real-time voice synthesis.
Voice Agent8090com.sanctum.voice-agentYoda voice interface. Integrates with Sonos speakers via Home Assistant media_player.play_media.
Sanctum Proxy4040.40 caliber — the gatewaycom.sanctum.proxyLLM routing proxy on port 4040. A single 4.6 MB Rust binary handling tiered model routing, prompt caching, request sanitization, PII scrubbing, and automatic fallback. KeepAlive enabled.

Agents use a tiered model strategy — each agent tier has its own primary model and fallback chain. When the primary model is unavailable (billing error, rate limit, solar flare), traffic cascades down through increasingly local alternatives until it hits a quantized model running on the same machine. The AI equivalent of “the generator kicked in.”

TierPrimaryFallback ChainUsed By
claude-opus-4-6Claude Opus 4.6 (Anthropic)qwen35-plus → gemini-25-proClaude Code direct
council-brainQwen 3.5 Plus (OpenRouter)claude-opus-4-6 → qwen35-plus → LM Studio → council-27bYoda, Jocasta
council-secureQwen 3.5 Plus (OpenRouter)qwen35-plus → LM StudioWindu
council-routineQwen 3.5 Plus (OpenRouter)qwen35-plus → council-27bQui-Gon, Cilghal, Mundi
council-heartbeatCouncil 27B (local)council-27bAll (heartbeat checks)

The Sanctum Proxy (port 4040) intercepts all requests and applies a 7-step pipeline before routing them to the appropriate model. Seven steps between an agent’s thought and the outside world. The TSA wishes they were this thorough.

  1. Smart content-based routing (Gemini-first for non-code tasks)
  2. Anthropic prompt caching injection
  3. Thinking block sanitization
  4. Empty content block fixes
  5. Context window truncation
  6. Assistant message prefill stripping
  7. PII anonymization for OpenRouter
services:
lm_studio:
enabled: true
port: 1234
council_mlx:
enabled: true
port: 1337
voice_agent:
enabled: true
port: 8090
tts:
enabled: true
port: 8008
proxy:
enabled: true
port: 4040

Bridges and tunnels. The unglamorous plumbing that connects a closet-mounted Mac Mini to a router, a mesh access point, a VM with no internet, and the wider world beyond the front door. If the core services are the organs, these are the nervous system — delicate, invisible when they work, and the first thing you suspect when something goes wrong.

There are seven of them. Two are SSH tunnels. Two are mDNS broadcasters. One talks to the router by first authenticating through a cloud server three thousand miles away. Home networking in 2026 is the kind of helpful that gets people killed in horror movies.

ServicePortCodenameLaunchAgentDescription
Firewalla Bridge1984Orwell — Big Brother watchescom.sanctum.firewallaHTTP bridge to the Firewalla Purple router P2P API (port 8833). Bound to 0.0.0.0 so the VM can reach it. KeepAlive enabled.
Orbi Bridge18080 / 18085com.sanctum.orbi-bridgeSocat bridge forwarding traffic from the VM to the Orbi access point (192.168.1.2 ports 80 and 5000). KeepAlive enabled.
Cloudflare Tunnelcom.sanctum.tunnelNamed tunnel manoir-nepveu. Exposes health.nepveu.name and ha.nepveu.name via Cloudflare Zero Trust. KeepAlive enabled.
Network Control4007007 — licensed to pingcom.sanctum.ha-tunnelSSH tunnel forwarding port 4007 to the VM for Home Assistant integrations.
Health Ingester10101binary heartbeatcom.sanctum.health-tunnelSSH tunnel forwarding port 10101 to the VM for the health data ingester. KeepAlive enabled.
mDNS Alias (manoir)com.sanctum.mdns-aliasBroadcasts manoir-nepveu.local via mDNS for LAN discovery. KeepAlive enabled.
mDNS Alias (holocron)com.sanctum.mdns-denchBroadcasts holocron.local via mDNS for the chat interface. KeepAlive enabled.

Two subdomains. Two Cloudflare Zero Trust routes. The entire external attack surface of the instance, right here in a table small enough to fit on a sticky note. That’s the goal. If your external exposure can’t fit on a sticky note, you have too much external exposure.

SubdomainLocal TargetPurpose
health.nepveu.namelocalhost:10101Health data ingestion endpoint
ha.nepveu.namelocalhost:8123Home Assistant remote access
services:
firewalla_bridge:
enabled: true
port: 1984
orbi_bridge:
enabled: true
port: 18080
admin_port: 18085
cloudflare_tunnel:
enabled: true
tunnel_name: manoir-nepveu

The immune system. The janitors. The 3 AM shift workers nobody thanks until something rots. These services watch the other services, rotate secrets before they expire, file documents nobody asked them to file, and occasionally reorganize your music library while you sleep. The system watches itself with more dedication than most humans watch their own cholesterol.

Seven background agents, zero ports for most of them, and one that requires you to physically plug in a hard drive like it’s 2008. We contain multitudes.

ServicePortLaunchAgentDescription
Watchdogcom.sanctum.watchdogRuns every 600 seconds. Checks all enabled services and auto-heals failures via service-doctor.
Secret Rotationcom.sanctum.rotate-secretsRuns on the 1st of each month at 3:30 AM. Rotates gateway tokens and updates Keychain entries.
iCloud Filercom.sanctum.icloud-filerAuto-filing daemon. Organizes documents from iCloud Drive into structured folders. KeepAlive enabled.
iCloud Backupcom.sanctum.icloud-backupPeriodic backup of Sanctum configuration and data to iCloud Drive.
UTM Autostartcom.sanctum.utm-autostartLaunches UTM on login, starts the Ubuntu VM, and sets the bridge100 interface IP to 10.10.10.1.
Music Cleanupcom.sanctum.music-cleanupRuns every Sunday at 3:15 AM. Organizes the Apple Music library via apple-music-organize.sh.
Kiwix8888com.sanctum.kiwix-serveOffline knowledge library. Serves cached reference content. Requires external T9 drive. KeepAlive enabled with 30-second throttle.
Outline3100Docker containerSelf-hosted wiki and documentation service. Provides a collaborative knowledge base for household documentation.
services:
watchdog:
enabled: true
settle_delay: 15
auto_fix: true
dedup_window: 1800
secret_rotation:
enabled: true
schedule: "0 3:30 1 * *"
icloud_filer:
enabled: true
kiwix:
enabled: true
port: 8888

On the other side of bridge100, in a QEMU-emulated box with no internet access, lives an entirely separate operating system running its own init system with its own opinions about how services should start. A whole different world. Twelve gigabytes of RAM. Eight CPU cores. Five personalities. Zero contact with the outside world unless the Mac says so.

The VM is, in the most literal sense, a brain in a jar. An air-gapped brain in a jar that runs your household security agent. We thought about this. We thought about this a lot. The architecture diagram made it look intentional.

ServicePortCodenameSystemd UnitDescription
OpenClaw Gateway1977Star Wars — the year hope was bornopenclaw-gateway.service (user)VM agent gateway with 1.5 GB heap. Runs 5 agents: Yoda (main), Windu (security), Qui-Gon (efficiency), Cilghal (health), Mundi (finance).
Dockerdocker.serviceContainer runtime for any VM-side containers.
SSH22ssh.socketRemote access. Key-only auth with PQ key exchange enabled.

Five agents. One gateway. 1.5 gigabytes of heap memory. This is either a well-orchestrated council or a timeshare dispute waiting to happen. So far, the council metaphor holds. We’ll let you know if Windu stages a coup.

AgentRoleSpecialization
YodaMainPrimary household agent. General queries, orchestration, task delegation.
WinduSecurityNetwork monitoring, threat analysis, Firewalla integration, daily security briefings.
Qui-GonEfficiencyEnergy optimization, automation suggestions, system performance tuning.
CilghalHealthFamily health tracking, genome analysis, supplement protocols.
MundiFinanceBudget tracking, investment monitoring, expense categorization.

The gateway uses SOPS+age encryption for secrets. The sops-start.sh wrapper decrypts environment variables at startup and never writes plaintext to disk. Secrets exist in cleartext only in RAM, only while the process runs. Paranoid? Maybe. But Windu insisted, and you don’t argue with the security agent.

Terminal window
# Restart the VM gateway
ssh [email protected] 'systemctl --user restart openclaw-gateway'
# Check status
ssh [email protected] 'systemctl --user status openclaw-gateway'
# View logs
ssh [email protected] 'journalctl --user -u openclaw-gateway -f'

One tool. It searches markdown. That sounds trivial until you have 287 documents spread across four repositories and you’re trying to remember which file documents the port that the service you’re debugging is supposedly listening on. Then it sounds essential.

ServicePortLaunchAgentDescription
QMDOn-device hybrid markdown search (v2.0.1). Combines BM25, vector similarity, and LLM reranking across 4 collections (287 documents). Indexes openclaw, skills, sanctum, and sanctum-docs. Exposes three MCP tools for Claude Code integration: keyword search, semantic search, and deep hybrid search. Nightly index refresh via docs-gardener. Metal-accelerated on Apple Silicon.

Every service follows the same lifecycle through the configuration system. Three states: enabled, disabled, and that liminal space where you changed the YAML but forgot to regenerate the plists. We’ve all been there. The watchdog has opinions about it.

Set enabled: true in instance.yaml, run generate-plists.sh, then load the LaunchAgent:

Terminal window
launchctl load ~/Library/LaunchAgents/com.sanctum.service-name.plist

Nineteen ports. Two hosts. One network that exists entirely inside a closet. Every Deadpool port has a codename because if you’re going to memorize port numbers at 2 AM in your underwear, they should at least be funny.

PortServiceHost
22SSHVM
80Dench Proxy (disabled)Mac
1111Command CenterMac
1234LM StudioMac
1337Council-27B MLXMac
1977GatewayMac + VM
1984Firewalla BridgeMac
3100OutlineMac (Docker)
4040Sanctum ProxyMac
8008XTTS VoiceMac
8090Voice AgentMac
8123Home AssistantMac (Docker)
8888KiwixMac
10101Health IngesterMac -> VM
18080Orbi Bridge (HTTP)Mac
18081Signal BridgeMac
18085Orbi Bridge (API)Mac
21063HomeKit BridgeMac (Docker)
42069Memory VaultMac