Skip to main content

Bytedesk Meet 0.1.0 Preview Released: An Open-Source Audio & Video Conferencing System

· 5 min read
Jack Ning
Maintainer of Bytedesk

Bytedesk Meet 0.1.0 Preview is out. As the open-source conferencing system in the Bytedesk ecosystem, Bytedesk Meet aims to give teams a self-hosted audio and video conferencing solution they fully control: no third-party SaaS dependency, data stays on your own servers, and it integrates natively with Bytedesk's account and permission systems.

The 0.1.0 Preview starts with audio conferencing, focusing on getting the core flow right: create a meeting, share a link, join, and keep participant records. Video conferencing and screen sharing are on the roadmap. This post introduces what this version includes, the technical architecture, and how to get started.

Online Demo​

What's in the 0.1.0 Preview​

1. Meeting Room Management​

  • Meeting rooms are stored as RoomEntity records (name, room code inviteUid, type, description, creation time, and more)
  • The meet frontend lists rooms in an antd ProTable, with support for creating and deleting rooms
  • The room code inviteUid doubles as the share code — no extra QR codes or passphrases needed
  • After creating a meeting, copy an invite link of the form https://your-domain/meet/room/{inviteUid}
  • Members who open the link are guided to log in first, then taken straight into the meeting
  • Participants join with their logged-in identity, and their nickname is displayed in the room — no name entry required

3. Audio Conferencing​

Built on the Janus AudioBridge plugin:

  • Join / leave a meeting
  • Microphone toggle (mute / unmute)
  • Live participant list (driven by Janus events)
  • Server-side audio mixing, so multiple speakers never interfere with each other
  • Rooms are created on demand: the same room code always maps to the same Janus room, and duplicate creation automatically falls back to joining

4. Participant Records (CDR-Style)​

Every join creates a participant record (ParticipantEntity):

  • Join time, leave time, and duration in seconds
  • Participant identity, associated room, host flag, and Janus participant ID
  • Presence status (joined / left); stale "still joined" records from dropped connections are settled automatically on the next operation

These records lay the data foundation for future meeting statistics, attendance, and auditing.

5. The meetAdmin Console​

A dedicated admin console ships alongside:

  • Meeting room management: query, create, edit, and delete rooms
  • Participant record management: query attendance details and inspect individual records
  • Fine-grained permissions: rooms and participant records map to separate permission modules that can be granted per role
  • Janus server monitoring: four pages covering server info, runtime settings, active sessions, and tokens (visible to super admins) for real-time visibility into the media server

6. Browser Compatibility and Permission Preflight​

  • Before joining, the app preflights microphone permissions and gives actionable guidance for each case: permission denied, no microphone, unsupported browser, or insecure context
  • Insecure contexts (plain HTTP on a non-localhost host) are detected automatically, with guidance to switch to localhost or configure HTTPS

7. Internationalization​

Both the meet and meetAdmin frontends support Simplified Chinese, Traditional Chinese, and English. Enum fields such as room type and presence status are fully internationalized.

Technical Architecture​

Bytedesk Meet uses a browser-direct-to-Janus WebSocket architecture with no backend signaling relay — simpler and lower latency:

LayerComponentNotes
MediaJanus AudioBridgeServer-side mixing, room management, participant events
BrowserWebRTC + janus-gateway JS SDKBrowser connects directly to the Janus WS for capture / publishing / playback
Backendmodules/webrtcRoom RoomEntity, participant ParticipantEntity, and REST APIs
Frontendfrontend/apps/meetReact + TypeScript + antd ProTable
Admin consolefrontend/apps/meetAdminRoom / participant management, Janus monitoring

A few key design decisions:

  • Stable room code mapping: the invite code inviteUid is hashed to a stable positive-integer Janus room ID, so all participants land in the same audio room without any server-side preconfiguration
  • Dynamic room creation: the first join sends create; if the room already exists (error code 486), the client automatically falls back to join — no manual room provisioning
  • Login as identity: joining reuses the Bytedesk login session; the backend returns the user's nickname as the display name and records the participation relation
  • Security boundaries: invite links are protected by login; the Janus Admin API is independently protected by admin_secret; the client-config endpoint never exposes secrets

Quick Start​

1. Start the Janus Media Server​

cd deploy/docker
./start.sh webrtc

This starts the Janus container. The WebSocket API is available at ws://localhost:18188/janus, and the Admin API on port 18091.

2. Start the Bytedesk Backend​

Start the starter as usual (it ships with bytedesk.webrtc.janus.enabled=true and sensible defaults for the Janus WS URL and ICE servers).

3. Start the meet Frontend​

cd frontend
pnpm install
turbo dev --filter=meet

4. Run Your First Meeting​

  1. Sign in to meet and click "New Meeting Room" in the room list
  2. Copy the room's invite link and send it to a colleague
  3. They open the link, log in, click "Join", grant microphone access, and the call begins

Tip: browsers only expose microphone capture in secure contexts (HTTPS or localhost). If you access the app over plain HTTP on a LAN IP, meet shows clear guidance; for production, put nginx in front for HTTPS + WSS.

Roadmap​

After the 0.1.0 Preview, Bytedesk Meet will evolve along these directions:

  • Video conferencing (Janus VideoRoom)
  • Screen sharing
  • Scheduled meetings vs. instant meetings
  • Meeting passwords / PINs and host controls
  • Recording and playback
  • Real-time participant statistics with backend push
  • Mobile support

Bytedesk Meet is still in its early days. Feedback and feature requests are welcome on GitHub Issues.