Audio Calling
ContentLock includes a built-in peer-to-peer audio calling feature so backoffice editors can talk to each other without leaving Umbraco. Calls use WebRTC — a browser-native technology — meaning no external meeting software is required. Most connections work with no server configuration at all.
Starting a Call
Section titled “Starting a Call”- Click the user count in the header to open the “Who’s online?” modal.
- Find the editor you want to call.
- Click the Call button next to their name.
The call button is hidden if:
- The target editor is already in another call (shows “On a call” instead).
- WebRTC calling is disabled in configuration.
Call Flow
Section titled “Call Flow”Caller side
Section titled “Caller side”- A Calling… state appears in the modal with the recipient’s name.
- A ringback tone plays while waiting for the recipient to answer.
- If the recipient answers, the call connects. If they decline or don’t answer within the ring timeout (default 20 seconds), the call ends with an appropriate notification.
Recipient side
Section titled “Recipient side”- An Incoming call notification appears in the modal, showing the caller’s name.
- A ringtone plays to alert the recipient.
- The recipient can click Accept or Decline.
- Accept — connects the call.
- Decline — the caller is notified immediately.
- If the recipient doesn’t answer within the ring timeout, the call is treated as a missed call.
Connected state
Section titled “Connected state”Once connected:
- Both parties can hear each other via their microphone and speakers.
- Mute / Unmute — toggle your microphone.
- Device Settings — select which microphone and speaker to use (browser media device picker).
- Hang Up — end the call for both parties.
Notifications
Section titled “Notifications”| Event | Shown to |
|---|---|
| Call declined | Caller — “[Name] declined the call” |
| Already on a call | Caller — “[Name] is currently on another call” |
| No answer (timeout) | Caller — “Call failed to connect”; Recipient — “Missed call from [Name]“ |
| Call ended by other party | Remaining party — “Call ended” |
TURN Servers
Section titled “TURN Servers”WebRTC uses STUN servers (included by default) to establish direct peer-to-peer connections. This works in approximately 80% of cases across most office and home networks.
A TURN relay server is needed in the remaining ~20% of cases, typically when editors are behind:
- Strict firewalls that block direct peer connections
- Symmetric NATs (common on corporate and managed networks)
- Aggressive security policies that prevent direct IP communication
ContentLock supports three TURN server providers:
| Provider | Description |
|---|---|
| None (default) | STUN only — works for ~80% of connections, no account required |
| Cloudflare ⭐ | Cloudflare Calls TURN — 1 TB free/month (payment method required). Recommended. |
| Twilio | Twilio Network Traversal Service — pay-as-you-go |
| Metered | Metered TURN — free tier (20 GB/month) |
See Audio Calling Configuration for setup instructions.
Sound Notifications
Section titled “Sound Notifications”ContentLock plays audio cues during calls so editors are alerted even if they are focused on another tab:
Ringback tone — plays on the caller’s device, looping while waiting for the recipient to answer. It stops automatically when the call connects or ends.
Ring tone — plays on the recipient’s device when an incoming call arrives, prompting them to accept or decline.
Both sounds use the same bundled ringtone by default:
Unlike the Online Users sound notifications, there is no separate enable/disable toggle for call sounds — they play whenever a call event occurs. To silence them, point the paths to a silent audio file via WebRTC.Sounds.RingSound and WebRTC.Sounds.RingbackSound. See WebRTC Configuration for details.
Enabling / Disabling
Section titled “Enabling / Disabling”Audio Calling is enabled by default and requires no configuration. To disable it, set WebRTC.Enable to false in appsettings.json:
{ "ContentLock": { "WebRTC": { "Enable": false } }}This change is applied without restarting the application — it is pushed to all connected clients via SignalR immediately. When disabled, the call button is hidden in the Online Users modal and no calls can be initiated.
Related
Section titled “Related”- WebRTC Configuration — TURN servers, ring timeout, custom sounds
- Online Users — user presence required for calling