NEST Runbook
Source:
asset-registry.yaml; curl https://nest.thephenom.app → HTTP 200; CF Pages Phenom-Backend main branch (production branch is main — origin/HEAD → main, no prod branch in repo)
C2PA signed · SanMarcSoft AI content credential
What it is
nest.thephenom.app is the production NEST application – the primary authenticated user-facing interface for the Phenom platform. It is deployed to Cloudflare Pages from the main branch of the Phenom-Backend GitHub repository. All production users interact with this deployment. Downtime here is a P1 incident.
Deployment chain
| Layer | Value |
|---|---|
| URL | https://nest.thephenom.app |
| DNS | Cloudflare (proxied, orange-cloud) |
| Hosting | Cloudflare Pages |
| Repo | Phenom-Backend (GitHub) |
| Branch | main |
| CI | Cloudflare Pages build on push to main |
| Auth | Cognito pool us-east-1_knEL7cqS3 (phenom-prod) |
| API backend | https://api.thephenom.app |
Merging to the main branch (via reviewed PR — never a direct push) triggers an automatic build and deployment on Cloudflare Pages.
Feature — Skia media HUD (tactical readout over event video)
The event media player (FloatingMediaCard) can draw a tactical HUD over a
telemetry-bearing clip — a compass/heading tape, pitch ladder, boresight, and a
lat/lon/alt readout — tracking playback time. It is the web mirror of the native
PhenomApp TacticalHUD (CanvasKit/Skia, self-hosted wasm, no CDN egress). The HUD
toggle rides on the media card in both globe view and street view (the card
is shared), and disables gracefully (greyed toggle) when an event has no
telemetry. (#541)
Where the pose comes from (important): the per-sample pose is read from the
media’s signed C2PA app.thephenom.sensor_telemetry assertion, not a
separate sidecar file. FloatingMediaCard fetches
GET /api/events/:id/telemetry; the nest-api route resolves it in order:
- a bundled C2PA extraction for verified events (
BUNDLED_TELEMETRYinadmin_sandbox/nest-api/src/routes/event-telemetry.ts— currently thec101f1bffixture and Lenval Logan’s event80c5231f, extracted from the video’s assertion via c2patool); - any event with a
.sidecar.jsoncapture file (fetched from S3, wrapped); - otherwise
404→ the HUD stays disabled.
So the HUD lights up for any event whose telemetry the endpoint can serve. The durable path is the extract-at-signing pipeline (#471), which will replace the manually-seeded bundled extractions.
Verify a specific event has telemetry:
curl -s https://nest.thephenom.app/api/events/80c5231f-15eb-48eb-92ed-c4725d2fa533/telemetry \
-H "Authorization: Bearer <cognito-id-token>" | head -c 120
# Expected: {"version":2,"sampleRateHz":10,...,"samples":[{"timestampMs":0,"heading":...
Common operations
Deploy a new release to production
# Merge develop -> main via GitHub PR (required path — never push main directly)
gh pr create --base main --head develop \
--title "Release: $(date +%Y-%m-%d)" \
--body "Production release"
# After PR approval and merge, Cloudflare Pages builds automatically.
# Monitor build:
npx wrangler pages deployment list --project-name phenom-backend-prod
Roll back to a previous deployment
# List recent deployments
npx wrangler pages deployment list --project-name phenom-backend-prod
# In the Cloudflare dashboard: Pages > phenom-backend-prod > Deployments
# Select the target deployment > Rollback to this deployment
Purge Cloudflare cache after deployment
curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/purge_cache" \
-H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
Verify it is working
curl -si https://nest.thephenom.app/ | grep -E "^HTTP|^cf-ray"
# Expected: HTTP/2 200, cf-ray header present
curl -sf https://nest.thephenom.app/ | grep -i "phenom\|nest\|<title"
# Expected: HTML with Phenom/NEST branding in page title or body
Common failure modes
| Symptom | Likely cause | Remediation |
|---|---|---|
| Login fails, 401 from API | Cognito pool misconfiguration or API key rotation | Check api.thephenom.app health; verify Cognito pool us-east-1_knEL7cqS3 |
| Blank white screen | JS bundle failed to load or CF Pages build error | Check CF Pages build log; purge cache |
| 502 / 503 | CF Pages deployment failed | Retry or roll back deployment in CF dashboard |
| Old version shown after deploy | Aggressive browser/CDN cache | Hard-refresh; purge CF cache |
| API calls fail from NEST | api.thephenom.app down or CORS misconfiguration |
See API runbook |
Related
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.