A cross-browser (Chrome + Firefox, Manifest V3) extension that turns your organization's soft phone into a floating, always-on window — so a live WebRTC call survives navigating to any website, and inbound calls ring even when the phone window is minimized or fully closed.
It hosts your tenant's first-party https://{domain}/softphone page in a dedicated,
resizable popup window (no iframe, no cookie/framing work), and keeps its own
authenticated SignalR connection to the tenant's telephony hub alive in a Chrome
offscreen document / Firefox background page. That lets it raise a desktop
notification + popup + ringtone and Decline/Voicemail a call without the window being
open. It's provider-agnostic: it never loads a telephony SDK and speaks only to
your tenant's own endpoints.
This extension is a companion to a website running on OrchardCore with the
CrestApps Telephony module enabled. The server side — the /softphone page, the
/softphone/extension-config endpoint, and the telephony hub the extension connects
to — is provided by:
➡ CrestApps.OrchardCore — Telephony module
The tenant must enable the module's Soft Phone Extension feature. Point the extension at your tenant domain (below) and sign in with your normal site login — the extension uses that existing session, no separate password.
Install from the Chrome Web Store / Firefox Add-ons (or load unpacked for development, below). Then:
- Open the extension options.
- Enter your tenant domain (e.g.
phone.example.com) and click Save & grant access — this requests host permission for only that site. Nothing is injected into any other website. - Click the toolbar button to open the phone. Click it again to collapse it to a circle or expand it back; it remembers its size and position.
npm install
npm run build # builds dist/chrome and dist/firefox (+ versioned zips)
npm run watch # rebuild on change
npm run typecheck
npm run lint
npm test- Chrome:
chrome://extensions→ Developer mode → Load unpacked →dist/chrome. - Firefox:
npm run start:firefox(temporary profile viaweb-ext), orabout:debugging→ This Firefox → Load Temporary Add-on →dist/firefox/manifest.json.
TypeScript · esbuild (build.mjs, per-browser dist/) · webextension-polyfill ·
@microsoft/signalr (bundled locally; MV3 forbids remote code) · Vitest · web-ext.
build.mjs bundles the TypeScript entry points, substitutes the version into each
per-browser manifest template under manifests/, copies static assets, and packages
dist/<target> into versioned zips for store upload.
Store publishing is automated. Push a vX.Y.Z tag to build, package, publish to the
Chrome Web Store + Firefox AMO, and cut a GitHub Release — or use the Publish
(manual) GitHub Action to publish to a single store. See
docs/RELEASING.md for the one-time account setup and required
secrets.
© CrestApps. All rights reserved.