This map covers EVERY listening TCP port on the VPS, all 16 active user-systemd services, all 8 PM2 processes, and all 41 disabled user-systemd units (kept here for reference per Henry’s Q5 directive). Verified by 3 parallel Sonnet sub-agents on 2026-05-04 ~12:20 UTC.
At a glance: 48 listening ports · 8 PM2 procs · 16 active systemd-user services · 41 disabled systemd-user units · 1 webhook DOWN (18801 Gmail Push) · 6 drift findings.
Read this when: troubleshooting webhook connectivity, adding a new service per G-SERVICE-PRE-START-DOC, or verifying which handlers are CF-fronted vs loopback-only.
Live port inventory (48 ports — verified 2026-05-04)
Public webhook handlers (CF Tunnel-fronted)
Port
PID
User
Process
Manager
Health
Notes
18790
1926
opsadmin
hubspot-handler.js
PM2 id=3
200
HubSpot + DocuSign + Make + OAuth callback
18792
4072
opsadmin
quo-handler-enhanced.js
systemd-user openphone-webhook
200
OpenPhone/Quo SMS + calls
18793
1918
opsadmin
salesmessage-handler-v4-complete.js
PM2 id=2
200
SalesMsg (query-token auth, NOT HMAC)
18797
1909
opsadmin
twilio-voice-handler.js
PM2 id=1
200
Twilio voice + SMS (HMAC-SHA1 dual-host)
18801
—
—
gmail-push-handler.js
(none — DOWN)
000
🚨 NOT RUNNING — provider unwired
18802
2328
opsadmin
imessage-handler.js
systemd-user imessage-webhook
200
BlueBubbles, Tailscale-only
OpenClaw core (loopback)
Port
PID
User
Process
Manager
Health
Notes
18789
3514
opsadmin
openclaw-gateway (Go)
systemd-user openclaw-gateway
TCP
Central LLM dispatch
18791
3514
opsadmin
openclaw-gateway (same)
systemd-user openclaw-gateway
401
Internal Quo dispatch
18795
979
opsadmin
api-proxy/proxy-server.js
systemd-system openclaw-api-proxy
200
Internal API proxy
18798
2347
opsadmin
quo-mention-receiver.js
systemd-user quo-mention-receiver
200
Aurora Quo trigger
18820
971
opsadmin
hubspot-webhook-bridge.js
systemd-system hubspot-webhook-bridge
200
⚠ NOT “Atlas dormant” — CLAUDE.md drift
LLM dispatch
Port
PID
User
Process
Manager
Health
Notes
18900
2340
opsadmin
portkey-proxy/proxy.js
systemd-user portkey-proxy
200
Per-agent cost attribution
18903
2272
opsadmin
anthropic-max-router
systemd-user anthropic-max-router
200
⚠ binds wildcard, registry says loopback
18910
2305
opsadmin
claude-max-api-proxy
systemd-user claude-max-api-proxy@teamsteph
200
teamsteph Max plan
18911
reserved
—
—
—
—
Reserved for henryRERI Max plan
Wildcard-public (no CF, no FUNNEL — ⚠ governance gaps)
Port
PID
User
Process
Manager
Health
Notes
18794
964
opsadmin
discord-lovable-bridge.js
PM2 id=7
200 (no /health)
⚠ wildcard bind, no FUNNEL entry
18796
9377
opsadmin
salesmsg-openclaw-gateway.js
systemd-system salesmsg-gateway
200
⚠ internal SMS gateway, wildcard
18799
1904
opsadmin
lovable-api-server.js
PM2 id=0
200
⚠ wildcard bind
18812
2277
opsadmin
broadcast-audit-server.js
systemd-user broadcast-audit
404
⚠ wildcard bind
3001
980
opsadmin
workspace-dispo/openphone-webhook-receiver.js
systemd-system openphone-dispo-webhook?
200
⚠ duplicate openphone path?
3100
2309
opsadmin
serve -s dist -l 3100
systemd-user ops-dashboard
200
static UI
8080
1911
opsadmin
code-server
systemd-system code-server@opsadmin
401
⚠ wildcard bind
nginx-fronted
Port
PID
User
Process
Manager
Health
Notes
80
1036+
www-data
nginx
systemd-system
401
HTTP entry
443
998
root
tailscaled
systemd-system
TCP
Tailscale TLS
8443
1036+
www-data
nginx
systemd-system
400
upstream
8444
1036+
www-data
nginx
systemd-system
404
upstream alt
18803
2345
opsadmin
reri-dispo-model/server.js
systemd-user reri-dispo-page
200
Behind nginx :18804
18804
1036+
www-data
nginx fronts :18803
systemd-system
200
RERI Dispo Model
18810
1036+
www-data
nginx alt vhost
systemd-system
500
⚠ misconfigured upstream
Aurora internal
Port
PID
User
Process
Manager
Health
Notes
3847
956
opsadmin
aurora webhook-server.js
systemd-system aurora-webhook
200
⚠ CLAUDE.md says 3848 IL gateway — WRONG
8890
955
opsadmin
dashboard-server.py
systemd-system aurora-dashboard
404
Python dashboard
8891
963
opsadmin
api-server.js
systemd-system deals-api
404
deals API
Infra / observability (loopback)
Port
PID
User
Process
Manager
Notes
22
1030
root
sshd
systemd
Tailscale-fronted
53
887
systemd-resolve
systemd-resolved
systemd
DNS
631
2578
root
cupsd
systemd
⚠ retire candidate (215 MB)
4317
3762
netdata
otel-plugin
systemd
OpenTelemetry gRPC
6379
984
redis
redis-server
systemd
Cache
8125
976
netdata
netdata StatsD
systemd
Metrics
9050
1094
debian-tor
tor SOCKS
systemd
⚠ retire candidate (101 MB)
19999
976
netdata
netdata UI
systemd
Loopback HTTP
20241
959
root
cloudflared control
systemd
Tunnel control plane
65529
1009
root
monarx-agent
systemd
Hostinger security agent
UI
Port
PID
User
Process
Manager
Notes
3000
2293
opsadmin
open-webui
systemd-user openwebui
Tailscale-only
Ephemeral (VSCode Remote-SSH session)
Port
Process
Notes
5174
playwright-mcp (npx session)
ephemeral
41255 / 50408 / 60704
VSCode extension host children
ephemeral
46043
VSCode command-shell
ephemeral
58306 / 63551
tailscaled control + IPv6
infra-internal
All 41 disabled user-systemd units (Q5 — for reference)
Bucket A — Enable now (6 — drift / governance gaps)
Unit
ExecStart (≤80)
Bucket reason
regen-plan-index + .timer
tools/regen-plan-index.sh
G-PLAN-INDEX-REQUIRED governance gap
tool-calls-health-check.timer
scripts/tool-calls-health-check.js
POSTGRES-CHOKEPOINT-1 / G-DRIFT-LIVE gap
omni-contact-resolver.timer
scripts/workers/contact-resolver.js
Pipeline gap (linker runs, resolver doesn’t)
gmail-attachment-sync.timer
scripts/gmail-attachment-sync.js
Daily 03:00 PDF→HubSpot sync never fires
deal-outreach-auto-approver
scripts/workers/deal-outreach-auto-approver.js
Service disabled, timer firing every 10 min — paperwork drift
omni-conversation-linker
scripts/workers/conversation-linker.js
Same — service disabled, timer firing hourly
Bucket B — Keep disabled (timer-driven oneshots) (22)
D4 fix — Investigate why anthropic-max-router binds wildcard; either restrict to loopback or update port-registry.md to acknowledge (and add firewall rule).
D5 fix — FUNNEL-REGISTRY: change Gmail Push status to pending-provider-config until GCP setup completes (per Q4-revised). Or remove if Henry picks B-pivot.
D6 fix — Investigate nginx vhost for :18810 — may be a stale upstream pointing to a dead service.
D7 fix — port-registry.md: add explicit row for the workspace-dispo openphone receiver at :3001; flag as Bucket D retire-candidate.