Service Registry

MOC for all OpenClaw services running on the Hetzner VPS (srv1347501). Covers systemd user-scope services (79 enumerated 2026-05-03), PM2 processes (8 active), and key system-scope daemons. The canonical live state is queried via systemctl --user list-units --type=service --all + pm2 list. Read this hub when debugging service restarts, checking process managers, or planning new deployments. Owner: Henry Hill / Claude Opus 4.7.

⚠️ 2 NEW FAILED SERVICES (PF-A, 2026-05-03):

  1. investorlift-cookie-refresh.service — Playwright login fails when AWS Mac Ultra is impaired (403 from InvestorLift; VPS IP is CloudFront-blocked). Last failure: 2026-05-03 13:00 UTC. Root cause: per CLAUDE.md InvestorLift Scraping section, cookie refresh MUST run on EC2 Mac Ultra (ec2-user@100.123.248.46), NOT VPS Playwright. Fix: reroute service to SSH → Mac → run cookie refresh. Status: G-FAILED-SERVICE-MTTR clock started 2026-05-03.
  2. perplexity-daily-summary.serviceTypeError: unsupported operand type(s) for +: 'int' and 'NoneType' in daily_summary.py line 57 (estimated_cost_usd field is None for some records). Last failure: 2026-05-03 16:00 UTC. Fix: add null-coalescing guard in summarize(). Status: G-FAILED-SERVICE-MTTR clock started 2026-05-03.

Quick reference

FieldValue
Canonical live statesystemctl --user list-units --type=service --all + pm2 list
Live state probesystemctl --user list-units --type=service --all | grep -c .service
Documented count~90 (source: ARCHITECTURE + CLAUDE.md)
Live count79 systemd user services (probed: 2026-05-03) + 8 PM2 processes
Drift−11 from documented (acceptable — some timers-only services counted differently)
Last audit2026-05-03
Drift alertG-FAILED-SERVICE-MTTR daily cron (checks --state=failed, Discord ops if >24h)
Governance gateG-SERVICE-PRE-START-DOC · G-FAILED-SERVICE-MTTR
Owner agentsystem / claude-code

Components

  • [[workspace/ARCHITECTURE]] — service table (authoritative service descriptions)
  • [[workspace/port-registry]] — port-to-service mapping
  • [[workspace/FUNNEL-REGISTRY]] — webhook-specific service routing
  • [[wiki/_hubs/systems/port-registry]] — port registry hub (depends-on anchor)
  • [[wiki/_hubs/systems/webhook-architecture]] — webhook handler services subset
  • [[workspace/systemd/]] — unit files for services not yet in /etc/systemd/user/
  • [[workspace/scripts/stack-inventory.js]] — daily stack snapshot collector

Active services by tier

Tier A — Critical path (always-running)

UnitProcess ManagerPortStatusDescription
openclaw-gateway.servicesystemd user18789/18791✅ activeOpenClaw Gateway v2026.4.15 (Go binary)
portkey-proxy.servicesystemd user18900✅ activePortkey per-agent LLM proxy
openphone-webhook.servicesystemd user18792✅ activeOpenPhone/Quo webhook handler
hubspot (PM2 id:3)PM218790✅ onlineHubSpot + DocuSign + Make webhook handler
salesmsg (PM2 id:2)PM218793✅ onlineSalesMsg webhook handler
twilio (PM2 id:1)PM218797✅ onlineTwilio voice + SMS handler
aurora-worker.servicesystemd user✅ activeAurora in-Quo orchestrator (dispatch + confirmations)
quo-watcher-c4.servicesystemd user✅ activeAurora Quo WebSocket mention watcher
quo-mention-receiver.servicesystemd user18798✅ activeAurora Quo mention trigger

Tier B — Supporting services (running)

UnitProcess ManagerPortStatusDescription
anthropic-max-router.servicesystemd user18903✅ activeMax Plan OAuth router (teamsteph)
claude-max-api-proxy@teamsteph.servicesystemd user18910✅ activeMax API proxy (teamsteph, idle)
reri-dispo-page.servicesystemd user18803✅ activeRERI Dispo Model landing page
imessage-webhook.servicesystemd user18802✅ activeBlueBubbles iMessage handler
broadcast-audit.servicesystemd user18812✅ activeBroadcast Response Audit UI
models-guardian.servicesystemd user✅ activemodels.json guardian (max-plan agents)
slack-thread-manager.servicesystemd user✅ activeSlack thread hygiene monitor
openwebui.servicesystemd user3000/Tailscale✅ activeOpen WebUI (Kimi/DeepSeek/Ollama)
ops-dashboard.servicesystemd user✅ activeRERI Operations Dashboard (static serve)
lovable-api (PM2 id:0)PM218799✅ onlineLovable API server
discord-lovable-bridge (PM2 id:7)PM218794✅ onlineDiscord-Lovable bridge
discord-reaction (PM2 id:5)PM2✅ onlineDiscord reaction handler
inbound-alert-watcher (PM2 id:6)PM2✅ onlineInbound alert watcher
pgmq-consumer (PM2 id:4)PM2✅ onlinePGMQ consumer (Supabase queue)

Tier C — Timer-triggered one-shots (inactive between runs)

Key scheduled services (triggered by paired .timer units):

UnitScheduleLast RunStatus
security-audit-funnel.serviceMon 06:00 PT2026-04-27 ⚠️inactive (timer firing Mon 2026-05-04)
master-env-backup.serviceWeekly2026-05-03inactive (runs fine)
escrow-deadline-reminder.serviceDaily 17:00 UTC2026-05-03inactive (runs fine)
openclaw-vault-sync.serviceEvery 15 minruns frequentlyinactive between runs
openclaw-vault-pull.serviceEvery 5 minruns frequentlyinactive between runs
memory-worker.servicescheduledrecentinactive between runs
embed-if-text.servicescheduledrecentinactive between runs
perplexity-daily-summary.serviceDailyFAILED 2026-05-03 16:00 ⚠️inactive/dead — NEEDS FIX
investorlift-cookie-refresh.servicescheduledFAILED 2026-05-03 13:00 ⚠️inactive/dead — NEEDS FIX

Tier D — Business logic one-shots

UnitPurposeStatus
acquisitions-perplexity-intel.serviceDaily Perplexity intel for Acq agentinactive (timer-triggered)
atlas-perplexity-intel.serviceDaily Perplexity intel for Atlasinactive (timer-triggered)
dispo-perplexity-intel.serviceDaily Perplexity intel for Dispoinactive (timer-triggered)
research-perplexity-intel.serviceCompetitive intelligenceinactive (timer-triggered)
email-deal-intake.serviceGmail deal intake → Supabaseinactive
hubspot-showing-sync.serviceHubSpot showing requests sync (30 min)inactive
showing-day-confirmations.serviceShowing day SMS confirmations (7:30 AM PT)inactive
showing-followup-trigger.serviceShowing follow-up trigger (every 15 min)inactive
deal-outreach-auto-approver.serviceYellow-zone auto-approver (4h window)inactive
gmail-email-harvest.serviceGmail email harvest → Supabaseinactive
gmail-inbox-scanner.serviceGmail inbox auto-labelinactive
gmail-label-worker.serviceGmail label workerinactive
sm-broadcast-sync.serviceSalesMsg broadcast syncinactive
sm-token-refresh-aurora.serviceSalesMsg OAuth token refreshinactive
webhook-health-monitor.serviceWebhook health monitoringinactive
coordinate-plans-heartbeat.serviceActive plan heartbeatinactive
monitoring-alerts.serviceOpenClaw monitoring alerts → Discordinactive
stack-inventory.serviceDaily stack inventory snapshotinactive
audit-weekly-triage.serviceWeekly vendor-audit Discord postinactive
vendor-audit-url-verify.serviceDaily URL verification for audit citationsinactive
external-tool-benchmark.serviceDaily latency + cost trackinginactive
founder-mem-checkpoint.serviceFounder memory checkpointinactive
omni-conversation-linker.serviceLink events to conversationsinactive
orphan-approval-sweep.serviceOrphan approval catch (Phase 1 Step 17)inactive
prediction-daily.servicePrediction market daily analyticsinactive
prediction-expiring.servicePrediction market resolution decay scaninactive
prediction-history.servicePrediction market history snapshotinactive
prediction-reconcile.servicePrediction market position reconciliationinactive
prediction-trader.servicePrediction market paper tradinginactive
arbitrage-monitor.serviceBetterTrading cross-venue arbitrage monitorinactive
portfolio-cache-refresh.servicePortfolio snapshots cache refreshinactive
cost-monitor.serviceLLM cost monitor (Max Plan quota)inactive
openclaw-logrotate.serviceLog and temp file cleanupinactive
openclaw-gateway-restart.serviceNightly gateway restart (memory leak bounds)inactive
bluebubbles-memory-sync.serviceBlueBubbles → Aurora memory syncinactive
email-signal-stage-updater.serviceAuto-update deal stages from TC email eventsinactive

Tier E — System scope (root systemd)

UnitStatusNotes
nginx.serviceactiveHTTP redirect :80 + nginx upstreams
redis.serviceactiveRedis cache (:6379 loopback)
cloudflared.serviceactiveCloudflare Tunnel daemon (:20241 control)
netdata.serviceactiveObservability (:19999 loopback)
tailscaled.serviceactiveTailscale node daemon
otel-pluginactiveOpenTelemetry collector (:4317 loopback)
tor.serviceactive ⚠️Tor SOCKS — disable candidate (F2 audit M3)
cupsd.serviceactive ⚠️Printing — disable on headless server (F2 audit M4)
sshd.serviceactiveSSH (:22, Tailscale-fronted)

Live state snapshot (2026-05-03)

MetricDocumentedLive (probed)DriftStatus
Total user services (systemctl)~9079−11within range
PM2 processes880ok
Active/running services14 (systemd user)ok
Failed services00 (currently inactive/dead, not failed state)monitor
investorlift-cookie-refreshinactive/dead (failed last run)⚠️ needs fix
perplexity-daily-summaryinactive/dead (failed last run)⚠️ needs fix
security-audit-funnel timerMon 06:00 PTlast fired 2026-04-276 days stale⚠️ flagged

How it’s used

  • Service health check: systemctl --user status <unit> + journalctl --user -u <unit> --no-pager --since "1h ago"
  • Start/restart: systemctl --user restart <unit> (confirm with Henry per action-gate unless session-level authorization)
  • Add new service: create unit file → add to port-registry → add to ARCHITECTURE → daemon-reload → start (G-SERVICE-PRE-START-DOC)
  • Failed service triage: G-FAILED-SERVICE-MTTR: fix within 24h, explicitly disable, or archive per feedback_archive_not_delete
  • Failure mode: undocumented wildcard-public bind or credential hardcoded in unit file → security finding

Agents that touch this

  • _summary — aurora-worker, quo-watcher-c4, quo-mention-receiver
  • _summary — acquisitions-perplexity-intel
  • _summary — dispo-perplexity-intel
  • _summary — atlas-perplexity-intel

Skills that invoke this

Plans that govern this

Feedback rules

KB / source docs

  • README — VPS config, systemd user scope
  • README — cloudflared tunnel service
  • README — salesmsg-gateway ⚠️ P0: hardcoded key in unit file

System maps

  • port-registry — port assignments for all services above
  • webhook-architecture — webhook service subset (18790/18792/18793/18797/18801)
  • mcp-registry — MCP server processes (not systemd — stdio via .mcp.json)
  • hetzner — VPS host (systemd user scope runs here)
  • aws — EC2 Mac Ultra (investorlift-cookie-refresh must SSH here)

⚠️ Security finding

salesmsg-gateway.service — unit file at /etc/systemd/system/salesmsg-gateway.service contains hardcoded ANTHROPIC_API_KEY=<redacted> in plaintext. P0 — rotation pending per G-NO-PLAINTEXT-CREDS. Replace with op://Aurora/anthropic/api-key reference.

Open issues / TODOs

  • P0 — fix investorlift-cookie-refresh.service: reroute to SSH → EC2 Mac Ultra; VPS Playwright always 403
  • P0 — fix perplexity-daily-summary.service: add or 0 null-coalescing in daily_summary.py line 57
  • P0 — rotate salesmsg-gateway unit file credential (G-NO-PLAINTEXT-CREDS)
  • Phase 2.1: build service registry audit cron (complement to port-registry-audit.timer)
  • Identify undocumented processes on ports 3001, 3100, 5174, 8080, 8891 — add to service registry
  • Disable cupsd and tor on hardening pass
  • security-audit-funnel.timer last fired 2026-04-27 — manual run recommended before next Monday

Recent activity

  • 2026-05-03: system hub created (W2-S4, Wave 2), live probe executed (79 user services, 8 PM2)
  • 2026-05-03 16:00 UTC: perplexity-daily-summary.service failed (TypeError NoneType)
  • 2026-05-03 13:00 UTC: investorlift-cookie-refresh.service failed (Playwright 403 from VPS)
  • 2026-05-02: openclaw-vault-sync.timer + openclaw-vault-pull.timer added to CLAUDE.md