A webinar for a few dozen viewers is a buildable app: a registration page, reminder emails, a room where one or two speakers broadcast, chat and questions, a recording and a replay link, with LiveKit supplying the video. The weekend goes into what real audiences punish: viewers behind corporate firewalls, a recording that always finishes, emails that arrive, and speakers on unknown connections. Past a few hundred attendees it stops being a weekend project, and Livestorm lists 3,000 live attendees per event.
Before you buildLivestorm Free gives 30 attendee credits a year and 30-minute pre-recorded events. That is enough for a trial run, not for real webinars.
Build me a small webinar platform for one host to replace Livestorm. Requirements: - Node.js 22 + TypeScript: Fastify with Eta pages, plus a room page built with Vite and `@livekit/components-react`. `npm start` serves http://localhost:4900: registration at /w/<slug>, the live room at /room/<slug>, host admin at /admin. - Video: LiveKit through `livekit-server-sdk`, with LIVEKIT_URL, LIVEKIT_API_KEY and LIVEKIT_API_SECRET in .env (LiveKit Cloud or a self-hosted server). Speakers get publish tokens, viewers get subscribe-only tokens; the admin can promote a viewer to speaker with the server SDK's updateParticipant call. - Storage: better-sqlite3 in ./data/webinars.db: webinars (slug, title, starts_at, time zone, max viewers), registrants (name, email, unique token), attendance (joined_at, left_at) and questions (text, upvotes, answered). - Registration: a form that emails a confirmation with an .ics file (`ics`) and a personal join link; reminders 24 hours and 15 minutes before through nodemailer SMTP from .env, scheduled with node-cron. A join link only works with a registered token. - Room: speaker grid, viewer chat over the LiveKit data channel, a questions panel viewers upvote and the host marks answered, and one poll at a time with live results. A viewer counts as attended after 2 minutes in the room. - Recording: LiveKit Egress (room composite) to a file or an S3 bucket from .env; when it finishes, publish /replay/<slug> for registrants only and email them the link. - Export: CSV of registrants with attended yes or no, minutes watched and questions asked. - Single host, one admin password in .env. No accounts, no telemetry, local-first apart from LiveKit and SMTP. - Out of scope: more than 200 viewers, live captions or translation, restreaming, phone dial-in, CRM integrations, payments. - README: running LiveKit (Cloud, or self-hosted with UDP ports open), a warning that corporate firewalls block UDP so the TURN or TCP fallback must be on, and a plain line that this is built for tens of viewers, not thousands.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Livestorm.
Extend the webinar platform in this folder. Requirements:
- Two email templates per webinar in the admin (Markdown with {{name}}, {{title}},
{{replay_url}}): one for registrants who attended 2 minutes or more, one for the rest.
- When the replay is published, queue the right template per registrant, send through the
existing SMTP settings at most 30 per minute, and record sent_at in SQLite.
- A "send test to me" button, a preview with sample data, and a footer line with a
one-click unsubscribe link that adds the address to a suppression table.
- Never email anyone on the suppression list, and show counts of sent, skipped and failed.
- Update the README.Add an embeddable registration form to the webinar platform in this folder. Requirements: - A script tag at /embed.js that renders the form for a given webinar slug inside a shadow root, so site CSS can't break it, with name, email and a consent checkbox from settings. - A POST /api/register endpoint with CORS limited to an ALLOWED_ORIGINS list in .env, a honeypot field and a rate limit of 5 requests per minute per IP. - On success show the join date in the visitor's time zone and send the confirmation email. - An admin page that shows the copy-paste snippet for each webinar. - Update the README.
Add a rehearsal room and a tech check to the webinar platform in this folder. Requirements: - A private room at /rehearse/<slug> that only speaker tokens can open, with its own LiveKit room name, never recorded, and never visible to registrants. - A pre-join check page for everyone: camera and microphone permission, a 10-second loopback test, and a report of whether UDP works or only the TCP fallback connects. - Show the host a table of speakers who passed or failed the check, with the reason. - Update the README with a pre-event checklist.
Add outgoing webhooks to the webinar platform in this folder. Requirements: - Admin settings for one webhook URL and a secret; events: registered, joined, left, question_asked and replay_viewed, each a small JSON body with an event id and timestamp. - Sign every request with an HMAC-SHA256 header over the raw body, and retry failures with exponential backoff up to 6 times, stored in an outbox table in SQLite. - A log page with the last 200 deliveries, their status codes and a replay button. - Update the README with a sample receiver in Node.
A webinar fails in public: if the room stutters or the replay never arrives, you lose the audience you spent weeks gathering. Livestorm sells joining from a browser, registration, reminders, replays and CRM sync as one thing that works, for marketing teams who can't debug video at nine on launch day. Paying per attendee also means no-shows cost nothing.
Estimate · LiveKit Cloud's free tier covers small events and its next plan starts at $50 a month; a self-hosted server on a VPS is the cheaper route. SMTP and recording storage fit free tiers at this scale. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 30 attendee credits a year, events up to 30 minutes, 10 events, 20 sessions per event, 10 automated actions per event, pre-recorded events only. |
| Pro | — | $100 | $3.00 per attendee credit, bought as a yearly pack (the entry pack shown is 400 credits, $1,200 a year). Up to 3,000 live attendees per event and 4 hours per session, unlimited events, recordings and team members, 25 simultaneous speakers, HubSpot and Zapier connections. |
| Enterprise | custom | — | Custom credit packs, sessions up to 12 hours, Salesforce, Marketo, Pardot, Dynamics and Brevo connections, custom analytics, dedicated Customer Success, VIP support with an SLA. |
Free gives 30 attendee credits a year, events up to 30 minutes and pre-recorded sessions only.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Rooms that hold up for thousands of viewers on any network, Speaker polish: 25 simultaneous speakers, noise cancelation, virtual backgrounds, picture-in-picture.
About $100 a month on the Pro (400-credit pack) plan, $1,200 a year (checked 2026-10-19).
Rooms that hold up for thousands of viewers on any network; Speaker polish: 25 simultaneous speakers, noise cancelation, virtual backgrounds, picture-in-picture; Native HubSpot and Zapier syncs of registrants and attendance; Live captions, live translation, restreaming to LinkedIn or YouTube and phone dial-in; Someone on call when an event goes wrong, plus ISO 27001 and GDPR paperwork. If any of those matter to you, keep paying.
Yes: Jitsi Meet (open source), BigBlueButton (open source), LiveKit (open source).