No Wake Zone

Cross-product helpdesk, docs hub, AI triage, and mobile companion

What it is live

NWZ ("No Wake Zone") is the cross-portfolio helpdesk and ticket system. Every SPS product routes its bug reports, feature requests, and customer questions through here. Surfaces include an admin UI for the SPS team, a magic-link-authenticated customer portal for external testers, a per-product docs hub, ops reports (volume, latency, by-product), an org chart of humans + AI personas + reporting lines, and an Android mobile companion app for ticket triage on the go.

The product was renamed from "Help Desk" / "nowakezone" during Phase 1; the public marketing site is at nowakezone.app, and the internal team surface is at nwz.sandpointstudios.ltd.

Hosting

ComponentLocation
Backend code/opt/nowakezone/ on vigil-server
API containernwz-api (port 8005 internally; fronted by cloudflared)
Production DBnwz database on shared vigil-postgres
Dev DBnwz-postgres docker container at :5435 (dev-only)
Prod env file/etc/nwz/env (root:root 0600) — NOT /opt/nowakezone/.env
Public hostnamenwz.sandpointstudios.ltd (via the multi-tenant cloudflared tunnel)
Customer portalnwz.sandpointstudios.ltd/portal/ — magic-link auth (no CF Access; the portal is for external testers)
Admin UInwz.sandpointstudios.ltd/admin/ — CF Access + SPS team allowlist
Mobile companion sourcec:\dev\nowakezone\mobile\ (Expo + RN)
Mobile APK distributiondl.teaganwins.net/<token>/nwz-companion.apk
Env file gotcha. Prod values live at /etc/nwz/env and are referenced by /opt/nowakezone/docker-compose.yml via env_file. The repo-local .env.example is documentation only. Values not in /etc/nwz/env fall through to pydantic-settings defaults in shared/config.py, which include literal dev-only-... placeholders for session secret, mobile JWT secret, and DB password. Audit on every secret rotation. Rotated secrets are stored in BW SPS Service item 0b1d1bbf-e8d7-4da3-9c70-b4490113b863.

System architecture

flowchart TB subgraph EXT[External] USR[Customer / tester] DEV[SPS contributor] PHONE[Phone — NWZ Companion app] end subgraph EDGE[Cloudflare] CF[cloudflared tunnel] ACC[CF Access
admin gated] end subgraph SRV[vigil-server] API[nwz-api
FastAPI :8005] QD[Qdrant
vector index] PG[(vigil-postgres
nwz DB)] GT[GlitchTip
error stream] end USR -->|magic link| CF DEV --> ACC PHONE -->|JWT auth| CF ACC --> CF CF --> API API --> PG API --> QD GT -.error events.-> API API -.AI triage.-> ANT[Anthropic API]

Surfaces

SurfacePathAudienceAuth
Admin UI/admin/SPS teamCF Access + SPS allowlist
Customer portal/portal/External testersMagic-link email auth
Docs hub/admin/docsSPS teamCF Access
Reports/admin/reportsSPS teamCF Access
Org chart/admin/orgSPS teamCF Access
Health/healthmonitorsnone
Marketing sitenowakezone.apppublicnone

Mobile companion

Android-only Expo + RN app at c:\dev\nowakezone\mobile\. Phases 1 and 2 shipped together as of 2026-05-10 — one APK build covers both ticket reading and action triggers (kick fix-bot, approve deploy). Backend Sessions 1-6 are locked and tested green (100/100 mobile tests across migrations 006-008, 4 router files, 4 service modules, 4 test files).

Authentication

Build + distribution

Local gradle build, debug-keystore-signed. tool/publish.sh mirrors the Right Bower pattern — bumps versionCode, runs expo prebuild --clean, runs gradle assembleRelease, scp's to vigil-server:/srv/dl/<token>/nwz-companion.apk, prints share URL. JDK 17 + Android SDK from scoop.

Backend deploy still owed. The mobile app's app.json sets extra.apiBaseUrl = https://nwz.sandpointstudios.ltd. The hostname is reserved in DNS but the cloudflared tunnel ingress rule for nwz-api:8005 at that hostname is NOT yet wired AND nwz-api needs NWZ_MOBILE_GOOGLE_CLIENT_IDS in its env. Until that lands, mobile sign-in 5xx's. Tracked in architecture-tickets.md §14.

Data

StorePurpose
Postgres nwz DBTickets, threads, customer accounts, magic-link tokens, mobile sessions, docs metadata, deploy_approvals
Qdrant vector indexEmbeddings for the docs hub's AI search
Object storage (file attachments)Signed-URL tokens issued by attachment_token.py for thread attachments

Migrations of note

Dependencies

Roadmap

Related