@if (!embeddedMode) {
WebRTC Private Chat
@if (session.currentUser(); as user) {
Signed in
{{ user.displayName }}
{{ user.username }}
{{ session.status() }}
@if (session.isApprovalAdmin()) { Approve accounts }
}
} @if (!session.currentUser()) { @if (embeddedMode) {

Open Settings to sign in

This embedded client expects authentication and backend configuration from the native app settings.

} @else {

Connect to the signaling backend

Use the Fastify server for authentication and peer discovery.

Angular + Bootstrap
@if (authMode === 'register') {
}
@if (authMode === 'login' && session.webAuthnSupported()) {
or
Leave the username blank to choose from discoverable passkeys, or enter it to target one account.
}
@if (session.error()) {
{{ session.error() }}
} @if (session.notice()) {
{{ session.notice() }}
}

Transport model

1. Authenticate

Register or log in against the Fastify API to receive a JWT.

2. Discover peers

Open the WebSocket signaling session and receive the online peer list.

3. Exchange data directly

Create a WebRTC data channel and send text, JSON, or files peer-to-peer.

} } @else {

Connection settings

Manage the backend endpoint used for auth and signaling.

@if (session.isApprovalAdmin()) { Approvals }
@if (!embeddedMode) {
} @else {
Backend settings are managed by the native app in embedded mode.
}
{{ session.status() }}
@if (session.error()) {
{{ session.error() }}
} @if (session.notice()) {
{{ session.notice() }}
}

Access keys

Register one or more WebAuthn credentials for this account.

{{ session.accessKeys().length }}
@if (!embeddedMode && session.webAuthnSupported()) {
} @else if (!embeddedMode) {
This browser does not expose WebAuthn registration APIs.
} @else {
Access keys are managed through the native app in embedded mode.
}
@if (session.accessKeys().length === 0) {
No access keys registered yet.
} @for (key of session.accessKeys(); track key.id) {
{{ key.label }}
Device: {{ key.deviceType }}{{ key.backedUp ? ' / backed up' : '' }}
Transports: {{ key.transports.length > 0 ? key.transports.join(', ') : 'unspecified' }}
Added: {{ key.createdAt | date: 'medium' }}
}
}