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,/inspectorreflow 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_runnerafter the Call row is created with 30s TTL. 410/404 responses tombstone the subscription atfailure_count=5; other errors increment. - Server-side PostHog backstop.
POST /v1/push/deliveredfires thepush_deliveredevent 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_summarynow returnsgreeting_latency_p50_ms. Card shows "—" while the window has nofirst_audio_mssamples yet (expected right after thex1y5z9a3b0cmigration 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.
$pageviewand 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
jinja2dep pulled in transitively bysentry-sdk[fastapi]'s Starlette integration. - CSP on
app.openphn.comandadmin.openphn.comwas blocking Sentry ingest + PostHog POSTs and Sentry Session Replay blob workers. - PostHog SDK was lazy-initialized via
ensureInit()insidetrack()/identify()/reset()— pages without actions never calledposthog.init(), so$pageviewnever fired. Now eagerly initialized frommain.tsxat boot.
Changed
SENTRY_PROJECT_FRONTENDandSENTRY_PROJECT_ADMINare now required on the Hetzner host.envfor 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.