v0.7.0
Brings full two-way WebRTC calling to the browser, a redesigned web UI with dark mode and brand theming, and stronger webhook origin/signature validation.
Changes
- Add end-to-end browser WebRTC calling: outbound dialer, inbound answer/decline, in-call controls (mute, DTMF, duration, hangup), and audible ringtone/ringback, all driven by a single CallController state machine
- Register browser tabs as web devices and reap orphaned registrations without disturbing Android/push devices or devices on an active call
- Redesign the web UI with dark mode, purple brand theming, redesigned call/conversation/provider/numbers/settings components, unified nav and dashboard icons, and a design guide
- Rebuild the dashboard into live recent-activity sections for conversations and calls, with provider-number dots, tooltips, quick actions, and websocket-driven updates
- Unify transient notifications into a single app-wide notification center with auto-dismissing toasts, and add auto-hiding overlay scrollbars
- Add configurable webhook origin validation for 46elks providers (IP allowlist with documented defaults) and a toggleable webhook_validation flag for Vonage and 46elks
- Enable Fastify trustProxy so the real client IP is used behind a reverse proxy or tunnel
- Turn the dummy telephony provider into an end-to-end test harness with a MediaBridge echo (delayed-loopback) leg and web controls to simulate inbound SMS and calls
- Rename "Call History" to "Calls" and move the Dial action into the Calls view header
- Add a web calling voice spec (requirements, design, and task list)
Fixes
- Decouple session validity from device liveness and add web logout, avoiding an infinite logout to 401 loop
- Normalize webhook endpoints across providers and return 404 for unknown ones
- Verify inbound Vonage webhooks with the signature secret via HS256, drop the insecure application_id fallback, and require signature verification
- Present inbound calls in the browser by broadcasting a ringing call_event, and reliably tear down calls on decline via call_cancelled
- Only send a JSON content-type/body when a body exists, so bodyless POSTs (decline, hangup, answer) are no longer rejected
- Guarantee a visible in-call surface whenever a live peer connection or mic track exists, and never let audio outlive the UI
- Drive the connected/failed state off the aggregate connection state so media that flows without an ICE connected transition no longer gets torn down mid-call
- Unskip 5 pre-existing test failures
- Remove unused type imports in web-device-reaper
v0.6.0
Adds USB modem support as a telephony provider, live provider health checks, and a range of Android app and call/SMS reliability improvements.
Changes
- Add modem-gateway telephony provider for USB modems, with durable at-least-once inbound SMS delivery and server acknowledgements
- Add live provider health checks and fix provider status/URL display in the web UI
- Identify conversations by (provider number, recipient) pair so threads stay separate across provider numbers
- Add manual AT command flag to modem-gateway, plus modem identity and band fields in status
- Android: start the app on boot, add copy/paste support to call history and the dial pad, and show a numeric unread badge in the conversation list
- Android: back navigates to the dialpad from other tabs and is handled within the contact search overlay
- Decouple version from package.json into a dedicated version source
- Add a PR checks workflow (Svarla, Mediabridge, Android)
Fixes
- Buffer concatenated SMS parts off-SIM and delete immediately to prevent a "+SMS FULL" storage deadlock
- Correct modem signal percentage, preserve modem identity across status ticks, and register provider hooks on creation
- Recover wedged PCM audio state to prevent one-way calls
- End inbound calls reliably when the remote caller hangs up
- Correct SMS provider routing and improve push notification delivery reliability
- Refetch conversations on a new message signal and fix cold-start re-notification of read items
- Android: keep the message input visible above the keyboard and dismiss the keyboard when leaving conversation detail
- Preserve the number label across modem-gateway restarts
- Assign unique, stable, and distinct number colors, including on the incoming call screen
v0.5.3
APK download reliability and documentation improvements.
Changes
- Add
/api/download/status endpoint to report APK availability before showing the download button
- Rewrite download page to check APK availability on mount with loading state and clear unavailable messaging
- Add 'Download' link to main navigation for discoverability from any device
- Documentation refinements for guides and configuration
Fixes
- Resolve APK not being fetched at startup due to version check blocking downloads for the actual package version
- Prevent 404 on APK download when file is not yet provisioned
v0.5.2
Bug fix release focused on call reliability, device startup behavior, and documentation improvements.
Changes
- Improved release flow with per-version release files and auto-discovery
- Restructured README and documentation site
- Bundle APK in server container with self-hosted distribution
- Handle 46elks 'busy' and 'state' field in voice_event webhook
- App autostarts on phone boot
- Call signaling improvements
Fixes
- Ask mic permission on first call