OpenPhn docs

Changelog

Releases, breaking changes, and fixes — newest first.

Format follows Keep a Changelog. Version tags correspond to the git SHA on phase1-build at the time of deploy.

2026-04-22 — c026bff (§8 mobile + Web Push)

Added

  • Mobile-first responsive layouts. /stage, /numbers, /numbers/:id, /calls, /inspector reflow cleanly at 375 / 768 / 1440. The mobile topbar + Sheet drawer nav handles <768px; desktop sidebar pinned at ≥768px.
  • Playwright viewport-matrix CI. Every PR runs a 15-test responsive smoke across the three breakpoints against a seeded e2e user. Catches regressions before they reach review.
  • Web Push notifications for live inbound calls. Per-device, per-number opt-in on /numbers/:id. iOS 16.4+ installed-PWA + Android Chrome. iOS Safari users see a dismissible Add-to-Home-Screen banner (90-day TTL on the dismissal) since iOS only allows Push API from home-screen-installed PWAs.
  • Backend endpoints for push subscription management: GET /v1/push/vapid-key, POST /v1/push/subscribe, POST /v1/push/unsubscribe, POST /v1/push/delivered, GET /v1/push/subscriptions.
  • Emit hook fires on inbound_runner after the Call row is created with 30s TTL. 410/404 responses tombstone the subscription at failure_count=5; other errors increment.
  • Server-side PostHog backstop. POST /v1/push/delivered fires the push_delivered event from the backend in addition to the SW's client-side capture, so adoption metrics don't silently miss ad-blocked / corp-proxy'd sessions.

Changed

  • Gated by VITE_FEATURE_PUSH_NOTIFICATIONS=1. Until the flag flips on Hetzner, no SW registers, no toggle UI renders, no banner appears. Merging is safe without key provisioning.

Also on 2026-04-22

  • Greeting p50 overview card on Stage. Measures carrier-WS-connect → first bot audio frame per call; compute_summary now returns greeting_latency_p50_ms. Card shows "—" while the window has no first_audio_ms samples yet (expected right after the x1y5z9a3b0c migration lands), then settles into the steady-state sub-1s number.
  • GET /v1/admin/users/{user_id} now returns a user detail row (was 404). Admin UserDetailPage no longer falls through to null.

2026-04-21 — 1575f86

Added

  • Docs site. This site launched at docs.openphn.com.
  • PostHog analytics. $pageview and the explicit event taxonomy (signup_completed, call_created, etc.) now fire from both app and admin surfaces.
  • Sentry. Backend + frontend + admin error capture, with source-map resolution on the SPA bundles.

Fixed

  • Backend crash-loop on startup caused by a missing jinja2 dep pulled in transitively by sentry-sdk[fastapi]'s Starlette integration.
  • CSP on app.openphn.com and admin.openphn.com was blocking Sentry ingest + PostHog POSTs and Sentry Session Replay blob workers.
  • PostHog SDK was lazy-initialized via ensureInit() inside track()/identify()/reset() — pages without actions never called posthog.init(), so $pageview never fired. Now eagerly initialized from main.tsx at boot.

Changed

  • SENTRY_PROJECT_FRONTEND and SENTRY_PROJECT_ADMIN are now required on the Hetzner host .env for source-map upload to complete.
  • Docker-compose build-arg defaults for SENTRY_ORG / SENTRY_PROJECT_* changed from the string "openphn" / "openphn-*" to empty string, so partial-config fail-fast doesn't trip when an auth token isn't set.

Earlier

Earlier changes predate this changelog. See the git log on phase1-build for full history.

On this page