
Cometchat Calls
Wire CometChat Calls into a solo builder’s app for broadcast-style town halls, webinars, and large-audience sessions with presenter-led video and raise-hand Q&A.
Overview
CometChat Calls is an agent skill for the Build phase that guides solo builders through CometChat broadcast and webinar call flows, settings, and optional RTMP streaming.
Install
npx skills add https://github.com/cometchat/cometchat-skills --skill cometchat-callsWhat is this skill?
- End-to-end broadcast flow: presenter group, auto-join calls, default mute for attendees, raise-hand Q&A
- Recommended call settings (SIDEBAR layout, lock layout, moderator roles) for webinar-style UX
- Scale guidance: ~50 simultaneous WebRTC streams; RTMP push to YouTube/Twitch/CDN for 100+ viewers
- Post-event recording upload and replay notification pattern for attendees
- Server-side group pre-creation and password-gated joins for paid or private events
- CometChat Calls SDK supports up to ~50 simultaneous video streams per call (plan-dependent)
- Documented 8-step end-to-end broadcast flow from group creation through recording replay
Adoption & trust: 1 installs on skills.sh; 35 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need large-audience live video in your app but WebRTC limits, presenter layouts, and streaming bridges are easy to get wrong without a spelled-out integration pattern.
Who is it for?
Indie SaaS or mobile apps adding CometChat-powered webinars, all-hands, or launch events with Q&A and optional YouTube/RTMP reach.
Skip if: Teams that only need 1:1 chat with no calls, or products that do not use CometChat and want a provider-agnostic WebRTC tutorial.
When should I use this skill?
You are implementing CometChat voice/video calls, broadcast or webinar modes, or RTMP streaming for large events in your application.
What do I get? / Deliverables
You get a documented end-to-end broadcast flow, recommended SDK settings, and scale options so you can ship presenter-led calls and optional replays without guessing CometChat behavior.
- Broadcast call flow wired to CometChat groups and call settings
- Presenter vs attendee mute/camera defaults and raise-hand Q&A behavior
- Optional RTMP bridge and post-call recording plus replay notification flow
Recommended Skills
Journey fit
Real-time voice and video is product plumbing you add while building the app, not a launch or growth tactic. This skill documents CometChat group/call flows, RTMP bridges, and SDK settings—classic third-party communications integration work.
How it compares
Use as a CometChat-specific integration playbook rather than generic WebRTC or daily.co setup docs.
Common Questions / FAQ
Who is cometchat-calls for?
Solo and indie developers shipping customer-facing apps who already chose or are evaluating CometChat for real-time communications and need broadcast-style call behavior documented for their coding agent.
When should I use cometchat-calls?
During Build when you are implementing group calls, presenter-moderator roles, raise-hand Q&A, or RTMP streaming for town halls, product launches, or paid webinar events in a CometChat-backed product.
Is cometchat-calls safe to install?
Treat it as procedural integration guidance; review the Security Audits panel on this Prism page and validate any network, API, and streaming credentials in your own environment before production.
SKILL.md
READMESKILL.md - Cometchat Calls
# Use case — Broadcast / Webinar A presenter (or panel) addresses a large audience. Most attendees have audio + video off; a small set of presenters are visible. Q&A via raise-hand. Optional broadcast to YouTube/RTMP via server-side bridge. **Examples:** Town halls, all-hands, product launches, conference sessions. **Scale note:** CometChat Calls SDK supports up to ~50 simultaneous video streams per call (varies by plan). For 100+ broadcast use cases, consider streaming-protocol bridges (RTMP push to YouTube/Twitch) where most attendees consume via streaming, not bidirectional WebRTC. --- ## End-to-end flow ``` 1. Presenter creates a "Broadcast" group (CometChat group keyed to event ID) ↓ 2. Server pre-creates the group with presenters as moderators ↓ 3. Attendees join the group (group is public OR password-gated for paid events) ↓ 4. Event time: presenter starts call → attendees auto-join (no incoming-call ring) ↓ 5. By default: all attendees mic + camera OFF Presenter has mic + camera ON ↓ 6. Q&A: attendee taps "Raise hand" → presenter sees → presenter unmutes them ↓ 7. Server-side: optional RTMP push streams the call to YouTube Live / Twitch / a CDN ↓ 8. Presenter ends call → recording uploaded → notification + replay link sent to all attendees ``` --- ## Recommended call settings ```ts const settings = { layout: "SIDEBAR", // Presenter dominant hideChangeLayoutButton: true, // Don't let attendees change hideRecordingButton: false, // Presenter records startRecordingOnCallStart: true, // Always record broadcasts (replay value) hideScreenShareButton: false, // For slides hideVirtualBackgroundButton: false, hideChatButton: false, // Q&A overflow + reactions hideShareInviteButton: false, // Encourage sharing hideRaiseHandButton: false, // Critical for Q&A // Attendee-side: mic + camera off by default joinWithMutedAudio: true, joinWithMutedVideo: true, callIdleTime: 0, // Disable idle timeout — events run long }; ``` Presenters override `joinWithMutedAudio/Video: false` in their flow. --- ## Roles + permissions In the CometChat group, set scopes: ```ts // Server-side, when creating the broadcast group: await cometchatApi.createGroup({ guid: `event-${eventId}`, members: [ { uid: presenterUid, scope: "admin" }, ...coPresenterUids.map((uid) => ({ uid, scope: "moderator" })), // Attendees added on join (or batch-added pre-event for paid) ], }); ``` Then enforce role-based UI: ```tsx function CallControls({ groupGuid, currentUserUid }: Props) { const role = useUserRoleInGroup(groupGuid, currentUserUid); const isPresenter = role === "admin" || role === "moderator"; return ( <div> {isPresenter && <RecordingButton />} {isPresenter && <ScreenShareButton />} {!isPresenter && <RaiseHandButton />} {/* Attendees see a stripped-down toolbar */} </div> ); } ``` --- ## Raise-hand → unmute flow ```tsx // Presenter's view: see attendees with raised hands, tap to unmute function PresenterRaisedHandsList() { const [raised, setRaised] = useState<RaisedHand[]>([]); useEffect(() => { CometChatCalls.addEventListener("onParticipantHandRaised", (event: RaisedHand) => { setRaised((prev) => [...prev, event]); }); CometChatCalls.addEventListener("onParticipantHandLowered", (event: RaisedHand) => { setRaised((prev) => prev.filter((p) => p.uid !== event.uid)); }); }, []); function unmuteParticipant(uid: string) { // Send a custom message asking participant to unmute themselves // (CometChat doesn't support force-unmute — privacy) CometChat.sendCustomMessage(/* type: 'unmute_request', target: uid */); // Optimistically lower their hand CometChatCalls.lowerParticipantHand(uid); } return ( <ul> {raised.map((p) => ( <li key={p.uid}>