Skip to main content
Integrations

API Proxy Architecture

How Arcturus-Prime SSR routes proxy requests to backend services with credential injection, caching, and dev/prod URL switching

February 23, 2026

API Proxy Architecture

Arcturus-Prime runs on Cloudflare Pages (Workers) with no direct access to the homelab network. To reach backend services, the site uses API proxy routes that forward requests from the browser through Cloudflare’s edge to internal services exposed via Cloudflare Tunnels or Tailscale.

Why Proxies?

The browser cannot directly call 10.42.0.199:8093 or 192.168.20.50:8888 — those are private LAN addresses. Instead:

  1. The browser calls Arcturus-Prime.com/api/services/health
  2. The Cloudflare Worker validates admin auth
  3. The Worker fetches https://status.Arcturus-Prime.com/health (a tunnel hostname)
  4. The Worker injects server-side credentials the browser never sees
  5. The response is returned to the browser

This keeps all backend credentials server-side and provides a single origin for CORS.

Routing: Dev vs. Production

Each proxy reads its backend URL from an environment variable with a fallback default:

Env VarProduction DefaultDev Default
GATEWAY_API_URLhttps://gateway.Arcturus-Prime.comhttp://10.42.0.194:8100
COMMAND_CENTER_URLhttps://status.Arcturus-Prime.comhttp://10.42.0.199:8093
SWARM_API_URLhttps://swarm.Arcturus-Prime.comhttp://10.42.0.100:8100
SWARM_ADMIN_URLhttps://swarm-admin.Arcturus-Prime.comhttp://10.42.0.100:8093
MM_ARGOBOX_URLhttps://mm-admin.Arcturus-Prime.comhttp://192.168.20.50:8888
TITAN_ADMINBOX_URLhttps://Tarn-Host-admin.Arcturus-Prime.comTailscale only
JOBS_API_URLhttps://jobs-api.Arcturus-Prime.comhttp://10.42.0.100:8585
LAB_ENGINE_URLhttps://labs.Arcturus-Prime.comDirect
PLAYGROUND_SWITCH_URLhttps://playground-switch.Arcturus-Prime.comDirect
OPENCLAW_API_URLhttps://oc.Arcturus-Prime.comDirect
OLLAMA_API_URLhttp://localhost:11434http://localhost:11434

In production, all backends are reached via Cloudflare Tunnel hostnames. In dev mode (npm run dev), direct LAN IPs are used.

Complete Proxy Route Table

Build Swarm Proxies

RouteBackendAuthPurpose
/api/gateway/[...path]gateway.Arcturus-Prime.comRead: public, Write: adminv4 gateway. Status, binhost, build submission. KV-cached reads.
/api/command/[...path]gateway.Arcturus-Prime.comRead: public, Write: adminControl plane (v4 combines gateway + orchestrator).
/api/orchestrator/[...path]Auto-discoveryRead: public, Write: adminResilient orchestrator discovery with 60s cache.
/api/swarm/[...path]swarm.Arcturus-Prime.comRead: public, Write: adminv3 control plane. Mutations inject SWARM_CONTROL_KEY.
/api/swarm-admin/[...path]swarm-admin.Arcturus-Prime.comAdminDirect orchestrator admin. Injects SWARM_ADMIN_KEY.

Infrastructure Proxies

RouteBackendAuthPurpose
/api/services/[...path]status.Arcturus-Prime.comAdminFull unsanitized services data.
/api/proxy/[...path]status.Arcturus-Prime.comPublicPublic API with KV caching. Legacy shorthand paths.
/api/mm-Arcturus-Prime/[...path]mm-admin.Arcturus-Prime.comAdminMeridian-Host Unraid admin. Injects MM_ARGOBOX_TOKEN.
/api/Tarn-Host-adminbox/[...path]Tarn-Host-admin.Arcturus-Prime.comAdminProxmox Tarn-Host admin. Injects TITAN_ADMINBOX_TOKEN.
/api/uptime-kuma/[...path]status.Arcturus-Prime.comPublicUptime Kuma status. Restricted to status-page paths.

Lab & Playground Proxies

RouteBackendAuthPurpose
/api/labs/healthlabs.Arcturus-Prime.comPublicLab engine health check (Izar-Host CT 130).
/api/playground/healthplayground-switch.Arcturus-Prime.comSecret/AdminDual-node playground health.
/api/playground/statuslabs.Arcturus-Prime.comSecret/AdminLab engine admin status.
/api/playground/switchplayground-switch.Arcturus-Prime.comSecret/AdminNode switching (50s timeout).
/api/playground/node-controllabs.Arcturus-Prime.comSecret/AdminNode enable/disable control.

Specialized Proxies

RouteBackendAuthPurpose
/api/jobs/[...path]jobs-api.Arcturus-Prime.comAdminAuto-Apply job engine. SSE on status/stream.
/api/admin/pentest/[...path]Config-drivenAdminMulti-node pentest (Izar-Host/Tarn-Host via ?node=).
/api/admin/rt-control/[...path]mm-admin.Arcturus-Prime.comAdminrt-controller on Meridian-Host.
/api/admin/openclawoc.Arcturus-Prime.comAdminOpenClaw AI gateway health + chat.
/api/admin/openclaw-manageoc.Arcturus-Prime.comAdminOpenClaw skill/config/cron management.
/api/status/ai-servicesOLLAMA_API_URLPublicOllama status check (30s cache).

Credential Injection

Backend services expect authentication but the browser should never see those credentials. Each proxy injects credentials server-side:

ProxyCredential Env VarInjection Method
mm-Arcturus-PrimeMM_ARGOBOX_TOKENAuthorization: Bearer {token}
Tarn-Host-adminboxTITAN_ADMINBOX_TOKENAuthorization: Bearer {token}
swarm-adminSWARM_ADMIN_KEYX-Admin-Key: {key}
swarm (mutations)SWARM_CONTROL_KEYX-Control-Key: {key}
jobsAUTOAPPLY_API_KEYX-API-Key: {key}
openclawOPENCLAW_API_TOKENAuthorization: Bearer {token}

Caching Strategy

Read-only proxy routes use KV-backed stale-while-revalidate caching in production:

  • /api/gateway and /api/proxy cache GET responses in Cloudflare KV
  • Cache keys include the full request path
  • Fresh TTL: 5 minutes for most endpoints
  • Stale responses served while revalidating in the background
  • ?force=true query parameter bypasses cache (admin use)

Timeouts

ProxyTimeoutReason
Most proxies10sStandard API response time
Playground switch50sNode switching involves VM operations
Playground health4sFast-poll for status
OpenClaw health15sLLM inference may be slow
apiproxyarchitecturecloudflare-workersbackend