IVC WebRTC is a lightweight, zero-retention, peer-to-peer (P2P) anonymous video and text chat application powered by PHP and WebRTC. Built on top of The Fortress IT Security Infrastructure, IVC provides real-time encrypted video streams and end-to-end encrypted data channels directly between browsers without storing messages, media streams, or user metadata on any server.
Create or join a room using custom or randomly generated identities with optional room lock passkeys:

Direct P2P WebRTC media streaming and end-to-end encrypted chat with real-time room sharing link:

- π End-to-End Encrypted (E2EE): Direct peer-to-peer WebRTC video, audio, screen sharing, and DataChannel messaging.
- π΅οΈ Zero Retention & Non-Logging: Ephemeral signaling messages are held only in RAM until delivered and immediately purged.
- π Simplified URL Routing: Direct room joining via
domain.com/<room-id>ordomain.com/?room=<room-id>. - π Optional Room Passkeys: Lock rooms with passphrase protection for private communication.
- β‘ Realtime SSE & Poll Modes: Supports Server-Sent Events (SSE) for low-latency signaling fallback.
- π‘οΈ Fortress IT Security Framework:
- Strict Content Security Policy (CSP), HSTS, and X-Frame-Options headers.
- Ephemeral client key rate limiting.
- Input sanitization and payload validation.
- CSRF protection for signaling actions.
- PHP: 8.1 or higher (PHP 8.3/8.5 recommended) with
OpenSSLextension enabled. - Web Server: Apache (
mod_rewriteenabled), Nginx, or LiteSpeed. - SSL Certificate: HTTPS is required by modern browsers for WebRTC camera and microphone access (e.g. via Let's Encrypt / cPanel AutoSSL).
-
Upload Files: Upload the project directory to your host (e.g.,
public_html/or a subfolder). -
Set Web Root: Point your domain/subdomain document root to the
public/directory. -
Configure
.htaccess: Create a.htaccessfile insidepublic/to handle clean room URLs (domain.com/<room-id>):<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.html [L] </IfModule>
-
Verify HTTPS: Ensure SSL is active. Open
https://yourdomain.comin your browser.
Add the following location configuration block to your Nginx server block:
server {
listen 443 ssl http2;
server_name chat.yourdomain.com;
root /var/www/ivc/public;
index index.html;
# Security Headers provided by PHP Fortress layer, but can also be enforced here
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
location / {
try_files $uri $uri/ /index.html?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Buffer settings for Realtime SSE streaming
fastcgi_buffering off;
fastcgi_read_timeout 60s;
}
}Run the built-in PHP development web server locally:
php -S 127.0.0.1:8080 -t publicOpen http://127.0.0.1:8080 in your web browser.
IVC WebRTC can also be deployed to GitHub Pages! The frontend is fully static and separates state using api/config.php.
- A GitHub Actions workflow (
.github/workflows/deploy-pages.yml) is already configured for this repository. - The workflow automatically uploads the contents of the
public/directory. - GitHub Pages will serve
public/index.htmlas the root of the application seamlessly. - Note: When hosted as a static site, PHP APIs (
/api/signal.php) will not function locally on GitHub Pages. To have full WebRTC and IRC capability, point the JavaScript frontend towards a live external IVC API server, or deploy the full application via Option A, B, or C.
The IVC Signaling API manages ephemeral WebRTC negotiation (offers, answers, ICE candidates, and room state). All endpoints are located at /api/signal.php.
GET /api/signal.php | POST /api/signal.php
Fetches active peer list and pending WebRTC signaling messages for a client in a room.
| Parameter | Type | Required | Description |
|---|---|---|---|
room |
string |
Yes | Sanitized room identifier (alphanumeric, max 64 chars). |
client |
string |
Yes | Unique client identifier. |
mode |
string |
No | Set to sse for Server-Sent Events streaming; default is standard HTTP poll. |
GET /api/signal.php?room=fortress-room&client=peer-abc-123 HTTP/1.1
Host: chat.yourdomain.com{
"status": "ok",
"peers": [
"peer-xyz-789"
],
"messages": [
{
"from": "peer-xyz-789",
"type": "offer",
"sdp": {
"type": "offer",
"sdp": "v=0\r\no=- 123456789..."
},
"timestamp": 1718000000
}
],
"csrf_token": "a1b2c3d4e5f6..."
}Opens an EventStream connection to receive instant WebRTC signaling events without polling.
| Parameter | Type | Required | Description |
|---|---|---|---|
room |
string |
Yes | Target room ID. |
client |
string |
Yes | Client ID. |
mode |
string |
Yes | Must be sse. |
GET /api/signal.php?room=fortress-room&client=peer-abc-123&mode=sse HTTP/1.1
Accept: text/event-streamdata: {"from":"peer-xyz-789","type":"peer-joined","timestamp":1718000000}
data: {"from":"peer-xyz-789","type":"offer","sdp":{...},"timestamp":1718000001}
: keepalive
Broadcasts SDP offers, SDP answers, ICE candidates, or explicit room disconnect notifications.
Content-Type: application/json
| Parameter | Type | Required | Description |
|---|---|---|---|
room |
string |
Yes | Room name/ID. |
client |
string |
Yes | Sending client ID. |
type |
string |
Yes | Signal type: offer, answer, candidate, join, leave, ping. |
sdp |
object/string |
Conditional | WebRTC Session Description Protocol object (for offer/answer). |
candidate |
object |
Conditional | WebRTC ICE Candidate object (for candidate). |
POST /api/signal.php HTTP/1.1
Content-Type: application/json
{
"room": "fortress-room",
"client": "peer-abc-123",
"type": "offer",
"sdp": {
"type": "offer",
"sdp": "v=0\r\no=- 987654321..."
}
}{
"status": "sent"
}POST /api/signal.php HTTP/1.1
Content-Type: application/json
{
"room": "fortress-room",
"client": "peer-abc-123",
"type": "leave"
}{
"status": "left"
}400 Bad Request: Missing required parameters or malformed JSON payload.{ "error": "Room ID and Client ID required" }429 Too Many Requests: Rate limit exceeded (default 120 requests/minute).{ "error": "Rate limit exceeded. Please wait." }405 Method Not Allowed: Unsupported HTTP verb.{ "error": "Method Not Allowed" }
Allows registering, querying, pinging, and executing commands on foreign services operating under different hosts.
GET /api/services.php?action=list HTTP/1.1
Host: chat.yourdomain.comPOST /api/services.php HTTP/1.1
Content-Type: application/json
{
"action": "register",
"service_name": "HELPBOT",
"host": "help.external-domain.org",
"api_endpoint": "https://help.external-domain.org/api/irc",
"metadata": "External AI Help Service"
}POST /api/services.php HTTP/1.1
Content-Type: application/json
{
"action": "execute",
"service_name": "HELPBOT",
"sender": "CyberFox",
"command": "SEARCH WebRTC encryption"
}IVC includes a full IRC Services suite operating natively and supporting foreign services:
| Bot / Service | Function | Key Commands |
|---|---|---|
NAMESERV |
Nickname Registration & Authentication | /msg NAMESERV REGISTER <pass> [email], /msg NAMESERV IDENTIFY <pass> |
CHANSERV |
Channel Registration, Topic & OPs | /msg CHANSERV REGISTER <#chan>, /msg CHANSERV OP <#chan> <nick>, /topic <new_topic> |
MOTDSERV |
Serverwide Message of the Day | /msg MOTDSERV SET <new_motd>, /motd |
MEMOSERV |
Offline Messaging & Memo Storage | /msg MEMOSERV SEND <nick> <msg>, /msg MEMOSERV READ [num], /memo |
HOSTSERV |
User Virtual Host (VHost) Management | /msg HOSTSERV REQUEST <vhost>, /msg HOSTSERV ON, /vhost |
SERVICESERV |
Network & Foreign Services Directory | /msg SERVICESERV LIST, /msg SERVICESERV REGISTER <name> <host> <endpoint> |
Execute the automated backend test suite:
php tests/WebRtcSiteTest.phpAll 49 security, signaling, IRC bot, and foreign service assertions should pass.
IVC is integrated with The Fortress IT Security Infrastructure:
- Security Headers: CSP, HSTS, X-Frame-Options: DENY, Referrer-Policy: no-referrer, Permissions-Policy for WebRTC media constraints.
- Sanitization: Strict character whitelist filtering on room names and client identifiers to eliminate XSS/Injection vectors.
- Ephemeral State: In-memory signaling array reset and immediate queue purge upon delivery (Zero Disk Footprint).
Distributed under the MIT License. See LICENSE for details.