1
2
3
Broadcast
Requirements, User Experience, and Architecture Specification
Dr. Ralf S. Engelschall
Version:0.9.0
Created:2026-06-18
Modified:2026-10-04

Broadcast is a Web application which complements a broadcasted video stream with several features to achieve an enterprise-grade “townhall” event experience. It embeds the video stream with an external video player and surrounds it with additional user interface controls for chat and stream control. This allows the attendees to select between several stream variants, mainly meant to carry different language translations of the audio content.

Broadcast offers a chat as a backchannel from the audience to the presenters. It allows an attendee to send messages and see messages sent by other attendees or a moderator. Sent messages may be reviewed by an artificial or human operator before they are allowed to spread to the audience. Attendees may like specific messages to signal their support. Additionally, a moderator can select questions coming from the audience which are then forwarded to the video production studio to be answered by the presenters with a small time delay. Broadcast can also optionally embed an external application, for instance to provide live voting. Here the attendee’s choice is transferred back to the video production studio, aggregated there and presented to moderators and presenters as the audience’s opinion.

Broadcast optionally enforces a closed group policy by only allowing a certain list of people (identified by their e-mail addresses) to join. It seamlessly switches to an alternative video stream provider if requested by the people overseeing the event production. This helps to overcome video quality or scaling issues without interrupting the broadcasting of the program. It supports an audience of up to 10,000 attendees, specifically employing a fast join process and swift delivery of chat messages.

Broadcast provides several statistics to assess the technical reception of the event program by the audience (number of viewers, used client setup, event-wide counts). None of this data can be linked to specific persons. Broadcast complies with data protection rules by reliably deleting personal data after the event. Chat content including likes may be saved for later review (e.g. for assessing information needs, detecting unanswered questions), but here, too, no link to specific persons is ever provided.

REQS: Solution Vision (SV) ⚓︎

PURPOSEBroadcast exists to let organizations stream live video events to thousands of attendees while keeping the audience engaged through moderated chat, questions, and likes, all under full control of who may watch and interact.
TARGET-AUDIENCEThe solution serves event organizers (managers), live-event moderators and presenters, and large invited audiences of attendees, ranging from small internal lectures of 75 people up to digital town halls of 10,000 simultaneous attendees.
SOLUTIONBroadcast is a live-event platform that joins an embedded video player of an external streaming provider with an email-verified access control and a moderated interaction channel in a single web application.
VALUE-PROPOSITIONOrganizers keep full control over who watches and who may interact, and receive all attendee input in a form they can moderate, forward to the presenter, and export afterwards. Attendees reach the event through a single personal link in any recent browser, without installation or accounts, and see their questions reach the presenters within seconds.
DIFFERENTIATORSCompared to public streaming portals, Broadcast admits only invited (and optionally authenticated) attendees and enforces per-attendee access limits. It stays independent of any single streaming provider and switches providers live during a running event without user interaction. Compared to the status quo of renting a third-party event platform per event, it runs on self-operated infrastructure, keeps all personal data under the organization’s own GDPR responsibility, and anonymizes it on event finish.
SCOPEBroadcast covers anonymous and authenticated event access, video playback, moderated interaction, and event statistics. It deliberately neither produces nor encodes nor hosts the video streams itself — ingest and delivery stay with the external streaming providers — and it is neither a conferencing tool with attendee audio and video, nor a video-on-demand archive.
SUCCESS-CRITERIABroadcast is achieved once an organization can run its large-scale events on it end-to-end: events of up to 10,000 simultaneous attendees are carried without a stream interruption visible to the audience.
FUTURE-STATEOnce adopted, live events are no longer bought per event from external platforms but can be held on an organization’s own channel: the attendee data never leaves its control, the streaming provider becomes an exchangeable supplier instead of the platform, and organizers reuse one familiar event setup instead of a different tool for every occasion.

REQS: Solution Premises (SP) ⚓︎

PREMISEProperties & Description
Registered Audience Known in Advance ⚓︎
Properties
TYPEAssumption
FAILURE-LIKELIHOODLow
FAILURE-IMPACTHigh
CONSEQUENCEWithout an attendee list ahead of the event, no individual access URLs can be generated and returned, so the event has to fall back onto an access email pattern or onto anonymous access.
MITIGATIONAccess email patterns and anonymous access remain available as fallback access modes of an event.
Description

The audience of an event is registered in the Event Registration System before the event takes place, so that its attendee list is available for import while the event is planned — BECAUSE the organization invites its events through the registration system and never on the day of the event itself.

Attendees Read Their Email While Logging In ⚓︎
Properties
TYPEAssumption
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTMedium
CONSEQUENCEAn attendee without access to their mailbox at login time cannot consume the authorization token within its validity of 5 minutes and is locked out of the event.
MITIGATIONPersonalized and automatic access URLs let a pre-verified attendee skip the token step, and the token validity is configurable per event.
Description

An attendee has their mailbox at hand on the device (or next to it) while logging in, so that the one-time authorization token reaches them within its validity — BECAUSE the invitation itself arrives by email and attendees join from the same workplace or home context.

Ten Thousand Attendees Is the Upper Bound ⚓︎
Properties
TYPEAssumption
FAILURE-LIKELIHOODLow
FAILURE-IMPACTHigh
CONSEQUENCEAn event exceeding 10,000 simultaneous attendees exhausts the dimensioned relay and proxy capacity, degrading or refusing the connections of the excess audience.
MITIGATIONThe horizontal scaling of proxy, relay, and server instances leaves headroom, which is confirmed by a load test before each larger event.
Description

No single event gathers more than 10,000 simultaneous attendees, the size of the largest digital town hall of the organization — BECAUSE the invited audience is bounded by the workforce of the organization and its registration figures.

Attendee Networks Pass WebSocket Traffic ⚓︎
Properties
TYPEAssumption
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTHigh
CONSEQUENCEAn attendee behind a proxy or firewall which blocks long-lived WebSocket connections sees the video but receives neither the live interaction nor the configuration updates.
MITIGATIONAll connections use the standard HTTPS port with a WebSocket upgrade, and the client reports a failed real-time connection to the attendee.
Description

The corporate and home networks of the attendees permit long-lived WebSocket connections over HTTPS — BECAUSE the live interaction and the configuration propagation are carried over MQTT-over-WebSocket rather than over plain HTTP requests.

German and English Cover All Events ⚓︎
Properties
TYPEAssumption
FAILURE-LIKELIHOODLow
FAILURE-IMPACTLow
CONSEQUENCEAn event held in a third language needs a further translation target and user interface locale, which the solution does not offer.
Description

Every event is held in German or English and its audience reads at least one of the two — BECAUSE these are the working languages of the organization.

Streaming Providers Deliver the Video ⚓︎
Properties
TYPEDependency
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTHigh
CONSEQUENCEWithout a working provider resource there is no video, and the event degrades to an interaction channel without a stream.
MITIGATIONEvery event is configured with at least one fallback provider resource, and the operators switch providers live without user interaction.
Description

The external streaming providers (such as msg Filmstudio, YouTube, Cloudflare, or 3Q) ingest, encode, and deliver the video and expose an embeddable playback URL in the required 1080p30 quality — BECAUSE the solution deliberately neither produces nor hosts the video streams itself.

Registration System Exchanges Attendee Data ⚓︎
Properties
TYPEDependency
FAILURE-LIKELIHOODLow
FAILURE-IMPACTMedium
CONSEQUENCEA changed export format of the registration system breaks the attendee import, and the invitation emails cannot carry the individual access URLs.
MITIGATIONThe exchange uses plain Excel sheets in an agreed column layout, which the manager can adjust by hand in the worst case.
Description

The Event Registration System exports the attendee registrations of an event as an Excel sheet, accepts the generated access URLs in return, and sends the invitation emails itself — BECAUSE the organization provisions its events from its existing registration system and the solution does not send invitations.

Email Gateway Delivers Tokens Within Minutes ⚓︎
Properties
TYPEDependency
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTHigh
CONSEQUENCEA delayed or undelivered token email locks the attendee out, as the token expires after 5 minutes, and at the event start thousands of attendees are affected at once.
MITIGATIONThe token validity is configurable per event, and automatic access URLs let pre-verified attendees enter without a token email.
Description

The external email gateway accepts the one-time authorization token emails at the burst rate of an event start and delivers them to the attendees within a minute — BECAUSE the email token is the first-factor authentication of the solution.

Translation Service Available During Events ⚓︎
Properties
TYPEDependency
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTLow
CONSEQUENCEWithout the service, messages remain in their source language only, so the attendees of the other language read untranslated chat and questions.
MITIGATIONMessages are stored and shown in their source language regardless, and the translation is added asynchronously once the service responds.
Description

The external AI/LLM service translates message texts between German and English on the fly within a few seconds — BECAUSE the two-language audience expects to read chat and questions in their own language.

EU Hosting on Self-Operated Infrastructure ⚓︎
Properties
TYPEDependency
FAILURE-LIKELIHOODLow
FAILURE-IMPACTHigh
CONSEQUENCEHosting outside the EU or on a public cloud without an EU data-processing agreement violates the GDPR obligations of the operator and voids the cost advantage of the solution.
MITIGATIONThe hosting contract fixes the data center location, and the containerized deployment is portable to any other EU hoster.
Description

The Hetzner data center in Nürnberg, Germany, provides the virtual machines the solution runs on, within the EU and at a price below the equivalent public cloud offerings — BECAUSE self-hosting within the EU is both the legal and the economic foundation of the solution.

Connection Surge at Event Start ⚓︎
Properties
TYPERisk
FAILURE-LIKELIHOODHigh
FAILURE-IMPACTHigh
CONSEQUENCEThousands of attendees logging in within the same minute overload the token issuing, the email gateway, and the relays, so that the first minutes of the event are lost for a part of the audience.
MITIGATIONProxy, relay, and server instances are scaled out before the event, and personalized and automatic access URLs let most attendees bypass the token step.
Description

The audience of a large event connects within a very short window around the announced start rather than spread over time — BECAUSE attendees open their invitation link only when the event begins.

Access URLs Forwarded Beyond the Audience ⚓︎
Properties
TYPERisk
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTMedium
CONSEQUENCEUninvited persons watch a confidential event and take part in its interaction under the identity of an invited attendee.
MITIGATIONAccess is granted to listed or pattern-matching email addresses only, each attendee holds a single active session, and unguessable URLs with time-limited tokens shorten the window of a leaked link.
Description

An invited attendee forwards their individual access URL to colleagues or posts it publicly — BECAUSE personal links are easily shared and attendees do not perceive them as secrets.

Message Texts Contain Personal Data ⚓︎
Properties
TYPERisk
FAILURE-LIKELIHOODHigh
FAILURE-IMPACTMedium
CONSEQUENCEPersonal data written into chat and questions is exported to the organizers and sent to the external translation service, so that a retention or transfer beyond the given consent violates the GDPR.
MITIGATIONAttendees give explicit consent before interacting, the finish procedure anonymizes all attendee data, and the translation service is contracted under an EU data-processing agreement.
Description

Attendees write personal data of themselves or of others into chat messages and questions — BECAUSE free-text interaction cannot be constrained to non-personal content.

Abusive Interaction from the Audience ⚓︎
Properties
TYPERisk
FAILURE-LIKELIHOODMedium
FAILURE-IMPACTMedium
CONSEQUENCESpam, floods, or offensive messages drown the legitimate questions and put the moderators under pressure during the live event.
MITIGATIONMessages are moderated before becoming visible, submissions are throttled per attendee, and the sentiment analysis flags offensive content automatically.
Description

A part of the audience misuses the chat and question channels with spam, floods, or offensive content — BECAUSE large invited audiences are never free of disruptive participants.

REQS: Domain Glossary (DG) ⚓︎

TERMProperties & Description
Event ⚓︎
Diagram
Properties
TYPEEntity
PREMISESPREMISE: Ten Thousand Attendees Is the Upper Bound ⚭, PREMISE: German and English Cover All Events ⚭, PREMISE: Connection Surge at Event Start ⚭
Description

The central, organizer-defined live broadcast occasion to which an audience is invited; it carries all configuration, Channels, the Access List, and Messages, and progresses from planning through running to finished

Attendee ⚓︎
Diagram
Properties
TYPEActor
SYNONYMSParticipant, Viewer
BROADERTERM: Role ⚭
PREMISESPREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Ten Thousand Attendees Is the Upper Bound ⚭, PREMISE: Attendee Networks Pass WebSocket Traffic ⚭, PREMISE: Connection Surge at Event Start ⚭, PREMISE: Access URLs Forwarded Beyond the Audience ⚭
Description

A User invited to and logged into a specific Event who watches the stream and may use the interaction channels; an Attendee exists only for the duration of the Event

User ⚓︎
Diagram
Properties
TYPEEntity
Description

A person identified by their email address within a specific Event, holding the Roles granted to them and existing only while granted a Role, present on the Access List, or joining via the access email pattern of the Event, except the holder of the Administrator Role, who exists permanently and outside any Event; any other User is never a permanent account, and an Attendee is a User logged into the Event

Manager ⚓︎
Diagram
Properties
TYPEActor
BROADERTERM: Role ⚭
DISTINCT-FROMTERM: Administrator ⚭
Description

An event-level Role that can edit, start, stop, and delete an Event and export its anonymized data; the Manager role is retained after the Event finishes until the Event is deleted

Moderator ⚓︎
Diagram
Properties
TYPEActor
BROADERTERM: Role ⚭
DISTINCT-FROMTERM: Presenter ⚭
PREMISESPREMISE: Abusive Interaction from the Audience ⚭
Description

An event-specific Role that moderates chat and question Messages by rejecting, approving, and forwarding them, and that supports the Presenter with hints and curated input

Presenter ⚓︎
Diagram
Properties
TYPEActor
BROADERTERM: Role ⚭
DISTINCT-FROMTERM: Moderator ⚭
Description

An event-specific Role held by the person on stage in a recorded video Event, receiving the Messages forwarded by the Moderator and marking them answered or suspended after processing them live; unlike the Moderator, the Presenter curates nothing and sees only the forwarded subset

Administrator ⚓︎
Diagram
Properties
TYPEActor
SYNONYMSSoftware Administrator, Hardware Administrator
BROADERTERM: Role ⚭
DISTINCT-FROMTERM: Manager ⚭
Description

A permanent Role independent of any Event and bootstrapped from the software configuration, whose holder needs no Access List entry and may perform every operation on every entity of every Event; the Hardware Administrator manages the physical server while the Software Administrator manages the software configuration and creates Events

Role ⚓︎
Diagram
Properties
TYPEEntity
SYNONYMSEvent Role
Description

A grant of rights held by a User (usually within a specific Event), of type Attendee, Manager, Moderator, Presenter or Administrator. A role is a permanent entity

Channel ⚓︎
Diagram
Properties
TYPEEntity
DISTINCT-FROMTERM: Resource ⚭
Description

A logical content stream of an Event grouping language- and resolution-specific Resources; exactly one Channel of an Event is active at a time

Resource ⚓︎
Diagram
Properties
TYPEEntity
DISTINCT-FROMTERM: Channel ⚭
PREMISESPREMISE: Streaming Providers Deliver the Video ⚭
Description

A physical content delivery endpoint backing a Channel, such as a provider video stream or a static website; exactly one Resource of a Channel is active at a time

Streaming Provider ⚓︎
Diagram
Properties
TYPEActor
SYNONYMSProvider, CDN Provider
PREMISESPREMISE: Streaming Providers Deliver the Video ⚭
Description

An external service such as msg Filmstudio, YouTube, Cloudflare, Twitch, or 3Q that ingests and delivers the video stream addressed by a Resource through configured provider parameters

Message ⚓︎
Diagram
Properties
TYPEEntity
PREMISESPREMISE: German and English Cover All Events ⚭, PREMISE: Translation Service Available During Events ⚭, PREMISE: Message Texts Contain Personal Data ⚭, PREMISE: Abusive Interaction from the Audience ⚭
Description

A single unit of Event interaction of type Chat, Question, or Support, carrying language-specific texts and moving through a moderation and presentation lifecycle

Question ⚓︎
Diagram
Properties
TYPEEntity
SYNONYMSQuestion Message
BROADERTERM: Message ⚭
Description

A Message submitted by an Attendee as structured audience input for the Q&A rounds; it passes through the full moderation and presentation lifecycle, may carry tags, and may receive Likes

Chat ⚓︎
Diagram
Properties
TYPEEntity
SYNONYMSChat Message
BROADERTERM: Message ⚭
Description

A Message sent by an Attendee as direct live commentary on the Event, visible to the audience once accepted; it may receive Likes and, where enabled, replies

Support ⚓︎
Diagram
Properties
TYPEEntity
SYNONYMSSupport Message
BROADERTERM: Message ⚭
Description

A Message exchanged privately between an Attendee and the Moderators for clarification and help; it is never visible to the audience and needs no moderation

Like ⚓︎
Diagram
Properties
TYPEEntity
Description

The marking of a Question or Chat as relevant by an Attendee, tracked per User and revocable until the Event finishes, thereafter conserved as a bare count by the Anonymization

Authorization Token ⚓︎
Diagram
Properties
TYPEEntity
SYNONYMSAccess Token
DISTINCT-FROMTERM: Session Token ⚭
PREMISESPREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Email Gateway Delivers Tokens Within Minutes ⚭
Description

A one-time, time-limited “NNN-NNN” six-digit second factor proving an Attendee controls their email address; it may be pre-generated for automatic access

Session Token ⚓︎
Diagram
Properties
TYPEEntity
DISTINCT-FROMTERM: Authorization Token ⚭
PREMISESPREMISE: Access URLs Forwarded Beyond the Audience ⚭
Description

The result of a successful login granting an Attendee an active connection to an Event; only one Session Token per User per Event may be active at a time

Access List ⚓︎
Diagram
Properties
TYPEEntity
PREMISESPREMISE: Registered Audience Known in Advance ⚭, PREMISE: Registration System Exchanges Attendee Data ⚭, PREMISE: Access URLs Forwarded Beyond the Audience ⚭
Description

The set of Users, identified by email, invited to a specific Event; together with the access email pattern it determines who may be granted Event access

Event Registration System ⚓︎
Diagram
Properties
TYPEActor
PREMISESPREMISE: Registered Audience Known in Advance ⚭, PREMISE: Registration System Exchanges Attendee Data ⚭
Description

The external registration platform from which Attendee data is imported via Excel and to which generated access URLs are returned

Anonymization ⚓︎
Diagram
Properties
TYPEActivity
SYNONYMSPrivacy by Design Finish
PREMISESPREMISE: Message Texts Contain Personal Data ⚭
Description

The automated procedure on Event finish that reduces Messages to like counts, anonymizes sender names, drops personal relations, deletes tokens and Users, unlinks the viewer statistics from their Users, and removes Moderator roles

Sentiment Analysis ⚓︎
Diagram
Properties
TYPEActivity
SYNONYMSProfanity Check
PREMISESPREMISE: Abusive Interaction from the Audience ⚭
Description

The optional client-side or server-side evaluation of Message text yielding a sentiment score used to prevent, auto-accept, or auto-reject improper input

REQS: User Personas (UP) ⚓︎

ROLEProperties & Description
Attendee ⚓︎
Diagram
TYPETERMDescription
PersonTERM: Attendee ⚭

The attendee watches the stream of the event they were invited to and takes part in its interaction with messages and likes of their own — BECAUSE the audience has to participate without ever gaining a view on the moderation or on the personal data of other attendees.

Moderator ⚓︎
Diagram
TYPETERMDescription
PersonTERM: Moderator ⚭

The moderator gatekeeps the interaction of a running event by deciding, answering, forwarding, and seeding messages and by steering the presenter, where the Q&A moderator and the chat moderator hold the very same role and split the work by message type by convention only — BECAUSE the audience has to see only what the organizers approve while the presenter receives a curated selection.

Presenter ⚓︎
Diagram
TYPETERMDescription
PersonTERM: Presenter ⚭

The presenter receives the curated questions on stage and records their processing, seeing nothing else of the interaction — BECAUSE the person on air has to be shielded from the raw audience input.

Manager ⚓︎
Diagram
TYPETERMDescription
PersonTERM: Manager ⚭

The manager owns an event from its configuration through its live run to its archived export, without taking part in the moderation — BECAUSE one accountable role has to control the visibility, the audience, and the lifecycle of the event.

Administrator ⚓︎
Diagram
TYPETERMDescription
PersonTERM: Administrator ⚭

The administrator provisions the events and the streaming providers through the configuration of the software and, as the permanent bootstrap identity, enters every event without an access list entry and edits everything in it — BECAUSE the operation of the platform has to be reproducible from configuration and recoverable by one role that depends on no event-specific grant.

PERSONAProperties & Description
Anna ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Attendee ⚭TERM: Attendee ⚭Watch the live event effortlessly and get her questions answered.Streaming tools that demand accounts, apps, or plugins before she can even watch.
Description

“I just want to watch the town hall and ask my question without jumping through hoops.”

Markus ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Moderator ⚭TERM: Moderator ⚭, TERM: Chat ⚭Keep the chat conversation civil and on-topic with minimal effort.Chat tools without moderation support, letting spam and off-topic noise drown the conversation.
Description

“I keep the Chat conversation clean.”

Peter ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Moderator ⚭TERM: Moderator ⚭, TERM: Question ⚭Filter the incoming questions and forward only the relevant ones to the presenter.Unfiltered question streams where duplicates and noise bury the questions that truly matter.
Description

“I keep the Q&A funnel clean and feed the presenter only questions which truly matter.”

Petra ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Presenter ⚭TERM: Presenter ⚭Deliver her talk while receiving the curated questions at the right moment.Being distracted on stage by raw chat noise instead of a few curated questions.
Description

“On stage I need the right questions in front of me at the right moment, and nothing else.”

Manfred ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Manager ⚭TERM: Manager ⚭, TERM: Event Registration System ⚭Set up events quickly and hand the access URLs back to the Event Registration System.Manual, error-prone event setup with access URLs that have to be copied around by hand.
Description

“Setting up an event and getting the access URLs back to the Event Registration System has to be quick and repeatable.”

Sven ⚓︎
ROLESTERMSGOALFRUSTRATION
ROLE: Administrator ⚭TERM: Administrator ⚭, TERM: Streaming Provider ⚭Provision events and streaming providers reproducibly via configuration, and fix anything in any event when the organizers are stuck.Platforms that require per-event manual clicks and lock him out of the events he provisioned.
Description

“I provision events and streaming providers via config, and when something is stuck I step into any event and fix it.”

REQS: User Journey (UJ) ⚓︎

JOURNEY: Attend a Broadcast event ⚓︎

ACTORSPERSONA: Anna ⚭
STEPProperties
Receive personal event invitation URL ⚓︎
STAGEGOALTOUCHPOINT
AwarenessLearn that an event is happening and that access is grantedInvitation email containing the individual event URL
ACTIONEMOTIONPAIN-POINT
The attendee reads the invitation and clicks the personalized event link.Curious (+1)
OPPORTUNITY
Open event page and review login info ⚓︎
STAGEGOALTOUCHPOINT
ConsiderationUnderstand what the event is and how to joinEvent landing screen in the web browser
ACTIONEMOTIONPAIN-POINT
The attendee reads the optional login message and any links before deciding to log in.Interested (+1)Uncertainty whether the link is genuine and what data will be collected.
OPPORTUNITY
The event landing screen states organizer, purpose, and data handling upfront, so the attendee can trust the link.
Authenticate via email token ⚓︎
STAGEGOALTOUCHPOINT
DecisionGain access to the live video streamLogin dialog with email and token challenge
ACTIONEMOTIONPAIN-POINT
The attendee enters the email, receives a 6-digit token by mail, and submits it.Slightly impatient (-1)Waiting for the token email and re-checking the inbox adds friction before the event.
OPPORTUNITY
The token email arrives within seconds and the token field accepts a pasted value, so the wait before the event stays minimal.
Watch stream and interact ⚓︎
STAGEGOALTOUCHPOINT
UsageFollow the event and contribute questions, chat, and likesMain attendee screen with video and interaction sidebar
ACTIONEMOTIONPAIN-POINT
The attendee watches the stream, posts questions or chat messages, and likes others’ messages.Engaged (+2)Messages may be delayed by moderation, so the attendee is unsure whether input arrived.
OPPORTUNITY
Submitted messages appear immediately in a pending state, so the attendee knows the input arrived.

JOURNEY: Operate a Broadcast Event ⚓︎

ACTORSPERSONA: Manfred ⚭
STEPProperties
Configure and run the event ⚓︎
STAGEGOALTOUCHPOINT
UsageSet up, start, and control an event end-to-endManager configuration screen and Event Registration System Excel import/export
ACTIONEMOTIONPAIN-POINT
The manager imports attendees, configures channels and options, and starts the event.Focused (0)Coordinating streaming providers, access lists, and tokens before going live is error-prone.
OPPORTUNITY
The configuration screen validates the imported attendee list and the streaming settings before the event goes live.
Export anonymized results after event ⚓︎
STAGEGOALTOUCHPOINT
UsageCapture and share the event’s interaction outcomesManager export function producing a downloadable file
ACTIONEMOTIONPAIN-POINT
The manager exports anonymized messages with timestamps, states, and like counts.Satisfied (+2)
OPPORTUNITY

JOURNEY: Moderate a Broadcast Event ⚓︎

ACTORSPERSONA: Markus ⚭, PERSONA: Peter ⚭
STEPProperties
Moderate and support the presenter ⚓︎
STAGEGOALTOUCHPOINT
UsageKeep interaction clean and forward the best questions to the presenterModerator Kanban board of chat and question messages
ACTIONEMOTIONPAIN-POINT
The moderator approves, rejects, and forwards messages and sends hints to the presenter.Pressured (-2)High message volume under time pressure makes it hard to keep an overview.
OPPORTUNITY
The Kanban board groups messages by state and highlights new arrivals, so the moderator keeps an overview under load.

REQS: Functional Requirements (FR) ⚓︎

User AuthenticationPRIORITY: MUST Limit Parallel AccessPRIORITY: MUST Ask QuestionsPRIORITY: MUST Chat MessagesPRIORITY: MUST Like MessagesPRIORITY: MUST Reply to Chat MessagesPRIORITY: SHOULD Configurable NameAppearancePRIORITY: MUST Personal DisplayFilteringPRIORITY: SHOULD Client-Side SentimentAnalysisPRIORITY: COULD Server-Side SentimentAnalysisPRIORITY: COULD Edit and Delete MessagesPRIORITY: SHOULD Tag Question MessagesPRIORITY: SHOULD Moderate Chat andQuestionsPRIORITY: MUST Forward Inputs toPresenterPRIORITY: MUST Answer Attendee InputsPRIORITY: SHOULD Moderator-AuthoredMessagesPRIORITY: SHOULD Export Attendee InputsPRIORITY: MUST Presenter Hints andAlertsPRIORITY: SHOULD Sort and Filter MessagesPRIORITY: SHOULD Manage EmbeddedApplicationPRIORITY: COULD Browser AccessPRIORITY: MUST Individual Event AccessURLPRIORITY: MUST Personalized Event AccessURLPRIORITY: SHOULD Automatic Event AccessURLPRIORITY: SHOULD Direct Resource AccessURLPRIORITY: SHOULD GDPR-Compliant EUProcessingPRIORITY: MUST Explicit User ConsentPRIORITY: MUST Login and InteractionMessagesPRIORITY: SHOULD Multiple StreamingProvidersPRIORITY: MUST Live Provider SwitchingPRIORITY: MUST Import RegisteredAttendeesPRIORITY: MUST Return Access URLs toRegistrationPRIORITY: MUST Import and Export EventPRIORITY: SHOULD General Event StatisticsPRIORITY: MUST Debugging StatisticsPRIORITY: SHOULD Channel StatisticsPRIORITY: SHOULD User StatisticsPRIORITY: SHOULD Periodic StatisticsSnapshotsPRIORITY: MUST Live ConfigurationPropagationPRIORITY: MUST Presenter DashboardPRIORITY: COULD Multiple-Choice FeedbackPRIORITY: COULD Mobile Device SupportPRIORITY: COULD In-Session LanguageSwitchingPRIORITY: SHOULD Light and Dark ThemePRIORITY: COULD Deleted MessagePlaceholderPRIORITY: SHOULD
REQUIREMENTProperties & Description
User Authentication ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Email Gateway Delivers Tokens Within Minutes ⚭, PREMISE: Connection Surge at Event Start ⚭

The system MUST authenticate participants via their email address before showing the video stream or, at minimum, before allowing participation in questions and chat, re-checking on every access that the event still lists the user even when the user is already authenticated — BECAUSE access must be restricted to invited participants to minimize foreign viewers

Limit Parallel Access ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Access URLs Forwarded Beyond the Audience ⚭

When participants must be authenticated to watch, the system MUST allow an event to be viewed only once per participant at a time, closing the prior connection on a new login — BECAUSE single concurrent sessions minimize unauthorized outside viewing

Ask Questions ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Attendee Networks Pass WebSocket Traffic ⚭

The system MUST let attendees submit questions as a dedicated feedback channel feeding the Q&A rounds — BECAUSE structured audience questions are a core interaction the event format depends on

Chat Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Attendee Networks Pass WebSocket Traffic ⚭

The system MUST let attendees send chat messages for direct comment on the event — BECAUSE live commentary keeps the audience engaged during the broadcast

Like Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

The system MUST let attendees like questions and chat messages and undo the like — BECAUSE liking surfaces the most relevant audience input for moderators and presenters

Reply to Chat Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

Where replies are enabled for an event, the system SHOULD let attendees reply to chat messages — BECAUSE threaded replies aid discussion but are not appropriate for every event format

Configurable Name Appearance ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

The system MUST display an attendee’s name on messages as full “Firstname Lastname”, first name only, or anonymous per event configuration, always exposing the email address (at least on hover) and optionally deriving the name from the email if none is given — BECAUSE events differ in how much attendee identity should be revealed

Personal Display Filtering ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let an attendee choose to see only their own messages and questions or also those of others — BECAUSE attendees want to track their own contributions without distraction

Client-Side Sentiment Analysis ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD perform configurable client-side sentiment analysis that checks attendee input before it is sent and may prevent improper submissions — BECAUSE filtering at the source reduces server moderation load and discourages misconduct

Server-Side Sentiment Analysis ⚓︎
Diagram
PRIORITYPREMISESDescription
COULDPREMISE: Abusive Interaction from the Audience ⚭

The system COULD perform configurable server-side sentiment analysis that checks attendee input before it is stored, auto-accepting positive and auto-rejecting negative input — BECAUSE automated triage assists moderators with high message volume

Edit and Delete Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let attendees edit and delete their own chat and question messages, mark edited messages for others, and re-run moderation on edits where required — BECAUSE attendees must correct mistakes without bypassing moderation

Tag Question Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let attendees tag question messages with predefined tags to give context such as the addressed person or agenda point — BECAUSE tags help moderators and presenters route and group questions

Moderate Chat and Questions ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Abusive Interaction from the Audience ⚭

The system MUST support optional moderation in which moderators reject, approve, or forward attendee input, with messages held pending until approved when moderation is enabled — BECAUSE organizers need control over what becomes publicly visible

Forward Inputs to Presenter ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

The system MUST let moderators forward approved inputs to a presenter so the presenter sees only a curated subset rather than all approved messages — BECAUSE the presenter on stage can only process a focused set of items

Answer Attendee Inputs ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let moderators reply to an attendee’s input, including non-visible direct messages — BECAUSE moderators need to clarify details or provide support privately

Moderator-Authored Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let moderators author chats and questions visible to others under a sender name defaulting to “Moderator” but overridable on send — BECAUSE prepared questions are needed to seed Q&A sessions

Export Attendee Inputs ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

After an event finishes, the system MUST let managers export all attendee inputs including at least timestamp, state, number of likes, and message text — BECAUSE organizers need a durable record of audience interaction

Presenter Hints and Alerts ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let moderators send textual hints to the presenter and raise an alert the presenter can confirm — BECAUSE the moderator must steer the live presenter with timing and routing guidance

Sort and Filter Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD let moderators filter messages and manually order forwarded questions — BECAUSE moderators need a clear overview and a defined order for the presenter to ask questions

Manage Embedded Application ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD let moderators administer an embedded third-party application when it exposes an administration view — BECAUSE some events integrate interactive apps that the moderator must control

Browser Access ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Attendee Networks Pass WebSocket Traffic ⚭

The system MUST be accessible from any reasonably recent web browser without installation — BECAUSE attendees use both managed and unmanaged devices with no common client software

Individual Event Access URL ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Registered Audience Known in Advance ⚭

The system MUST allow accessing an event via an individual, unguessable URL of the form #/event=<event> — BECAUSE an obscure entry point minimizes access by external viewers

Personalized Event Access URL ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD support an event URL that also carries the user email (&user=<email>), making the email read-only in the login dialog — BECAUSE pre-filling the identity streamlines the attendee login

Automatic Event Access URL ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD support an event URL carrying a pre-generated access token (&token=<token>) that auto-authenticates the user without a login dialog, with single or multiple use governed by event settings — BECAUSE automated access enables frictionless joining for trusted distributions

Direct Resource Access URL ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD support a &resource=<resource> URL parameter that selects a specific event resource on access — BECAUSE attendees reloading the page must return to the same stream or static resource

GDPR-Compliant EU Processing ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: EU Hosting on Self-Operated Infrastructure ⚭

The system MUST provide all services in compliance with GDPR within the EU — BECAUSE the audience and operator are subject to European data-protection law

Login and Interaction Messages ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD optionally display configurable text with one or two links at login and at interaction time — BECAUSE organizers communicate event information and conduct rules at these moments

Multiple Streaming Providers ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Streaming Providers Deliver the Video ⚭

The system MUST allow multiple streaming providers to be configured per event — BECAUSE a configured fallback is required to recover from provider problems even during a running event

Live Provider Switching ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Streaming Providers Deliver the Video ⚭

The system MUST allow switching the active streaming provider during an event, with attendee clients following the switch without user interaction — BECAUSE provider outages must be mitigated without disrupting the audience

Import Registered Attendees ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Registered Audience Known in Advance ⚭, PREMISE: Registration System Exchanges Attendee Data ⚭

The system MUST import an Excel sheet of the Event Registration System to populate an event’s access list and generate authorization tokens, avoiding duplicate invitations on repeated imports — BECAUSE events are provisioned from the Event Registration System

Return Access URLs to Registration ⚓︎
Diagram
PRIORITYPREMISESDescription
MUSTPREMISE: Registered Audience Known in Advance ⚭, PREMISE: Registration System Exchanges Attendee Data ⚭

The system MUST generate each attendee’s personal access URL containing event, user, and a “NNN-NNN” six-digit token and return it in an Excel sheet to the Event Registration System — BECAUSE the Event Registration System distributes the join URLs to attendees

Import and Export Event ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD export an event with its related entities to a serialized format such as YAML and re-import it — BECAUSE this eases development, demonstration, and creation of recurring production events

General Event Statistics ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

The system MUST provide an attendee statistics curve of logged-in users over time — BECAUSE organizers need to observe audience size and trend during the event

Debugging Statistics ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD record login-challenge statistics including issued, sent, and used authorization tokens — BECAUSE operators need visibility into the authentication flow for diagnosis

Channel Statistics ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD show the number of viewers per channel of an event — BECAUSE organizers want to know the relative popularity of language and resolution variants

User Statistics ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

The system SHOULD record viewer statistics including country, browser, device, and viewport, using country to select the default application language on first use — BECAUSE audience composition informs both reporting and localization

Periodic Statistics Snapshots ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

While an event is running, the system MUST capture a cumulative snapshot of its event and channel statistics every five minutes, independent of any user activity — BECAUSE a trend curve needs regularly sampled counts and not just the counts at the moments someone looks

Live Configuration Propagation ⚓︎
Diagram
PRIORITYPREMISESDescription
MUST

The system MUST propagate event configuration changes directly to all connected participants — BECAUSE toggles such as enabling chat must take effect for the live audience without a reload

Presenter Dashboard ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD provide a dedicated presenter dashboard showing forwarded inputs for processing on stage — BECAUSE the presenter needs a focused working view, though its design is not yet finalized

Multiple-Choice Feedback ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD provide real-time multiple-choice questions answered by attendees — BECAUSE polls add interaction during the event

Mobile Device Support ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD let participants take part on mobile phones, at least for video with possible interaction restrictions — BECAUSE many attendees join from mobile devices

In-Session Language Switching ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULDPREMISE: German and English Cover All Events ⚭, PREMISE: Translation Service Available During Events ⚭

The system SHOULD let an attendee switch the display and content language between German and English at any time from the header, applying the change immediately — BECAUSE attendees expect to read the interface and translated messages in their preferred one of the two supported languages

Light and Dark Theme ⚓︎
Diagram
PRIORITYPREMISESDescription
COULD

The system COULD let an attendee toggle a light or dark theme from the header, applying it immediately across the interface — BECAUSE attendees view events under varied lighting and prefer a comfortable appearance

Deleted Message Placeholder ⚓︎
Diagram
PRIORITYPREMISESDescription
SHOULD

When an attendee deletes a message, the system SHOULD retain its position in the stream and show a “This message was deleted” placeholder instead of removing it — BECAUSE preserving the gap keeps the surrounding conversation coherent for readers

REQS: Non-Functional Requirements (NR) ⚓︎

REQUIREMENTProperties & Description
Concurrent Attendee Scale ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTPerformance
PREMISESMETRICDescription
PREMISE: Ten Thousand Attendees Is the Upper Bound ⚭, PREMISE: Connection Surge at Event Start ⚭2500 to 10000 concurrently connected attendees per event

The system MUST support between 2500 and 10000 attendees connected to a single event at the same time — BECAUSE msg Filmstudio video productions must reach an audience of this size simultaneously

Horizontal Scalability ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTPerformance
PREMISESMETRICDescription
PREMISE: Ten Thousand Attendees Is the Upper Bound ⚭, PREMISE: Connection Surge at Event Start ⚭10000 concurrent WebSocket connections per event

The system MUST scale horizontally by running multiple proxy, relay, and server instances per runtime environment so that 10000 concurrent WebSocket connections are served per event — BECAUSE a single instance cannot handle the required connection volume and response times

Streaming Quality ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTPerformance
PREMISESMETRICDescription
PREMISE: German and English Cover All Events ⚭, PREMISE: Streaming Providers Deliver the Video ⚭1920x1080 pixels at 30 fps in 2 languages

The system MUST process and distribute video at 1080p30 (1920x1080 at 30 fps) in both German and English — BECAUSE productions are delivered in this defined quality and the two required languages

Provider Failover Continuity ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTReliabilityREQUIREMENT: Live Provider Switching ⚭
PREMISESMETRICDescription
PREMISE: Streaming Providers Deliver the Video ⚭all attendee clients on the fallback provider within 10 seconds

The system MUST switch to a fallback streaming provider during a running event with attendee clients following the switch automatically within seconds and without user interaction — BECAUSE provider outages must not interrupt the live audience

Cross-Browser Compatibility ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTCompatibilityREQUIREMENT: Browser Access ⚭
PREMISESMETRICDescription
PREMISE: Attendee Networks Pass WebSocket Traffic ⚭the last 2 major versions of Chrome, Edge, Firefox, and Safari

The system MUST run in any reasonably recent version of the major web browsers (Chrome, Edge, Firefox, Safari) without plugins — BECAUSE attendees use heterogeneous managed and unmanaged devices

GDPR Compliance ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTComplianceREQUIREMENT: GDPR-Compliant EU Processing ⚭
PREMISESMETRICDescription
PREMISE: EU Hosting on Self-Operated Infrastructure ⚭, PREMISE: Message Texts Contain Personal Data ⚭100 % of personal data processed and hosted within the EU

The system MUST process all personal data in compliance with GDPR and host it exclusively within the EU (data center in Nürnberg, Germany) — BECAUSE the operator is legally bound to European data-protection requirements

Privacy by Design ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTSecurity
PREMISESMETRICDescription
PREMISE: Message Texts Contain Personal Data ⚭0 attendee personal-data records retained after the event finish procedure

The system MUST retain attendee personal data only while an event runs, anonymizing or deleting all of it within the automated finish procedure when the event finishes — BECAUSE minimizing personal-data retention is the core privacy guarantee of the product

Unguessable Access Tokens ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTSecurityREQUIREMENT: Individual Event Access URL ⚭, REQUIREMENT: Automatic Event Access URL ⚭
PREMISESMETRICDescription
PREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Email Gateway Delivers Tokens Within Minutes ⚭, PREMISE: Access URLs Forwarded Beyond the Audience ⚭token expiry <= 5 minutes by default

The system MUST use unguessable event URLs and time-limited authorization tokens that by default expire within 5 minutes — BECAUSE weak access secrets would let unauthorized viewers join the event

Isolated Persistence Node ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTSecurityREQUIREMENT: GDPR-Compliant EU Processing ⚭
PREMISESMETRICDescription
PREMISE: Message Texts Contain Personal Data ⚭0 routes to the database port from outside the business services

The system MUST keep the persistence node reachable from the business services alone, with no route from the Internet or from the connection-handling tiers — BECAUSE the persisted personal data is protected best by a node an attacker of the public entry point cannot even address

Event Setup Recovery ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTReliability
PREMISESMETRICDescription
PREMISE: EU Hosting on Self-Operated Infrastructure ⚭RPO <= 24 hours (<= 1 hour right before an event) and RTO <= 2 hours

The system MUST allow the event setups and their messages to be restored after a database loss within 2 hours from a backup at most 24 hours old, and at most 1 hour old right before an event — BECAUSE a prepared event must not have to be re-entered under time pressure on the day of the broadcast

Event-Safe Maintenance ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
MUSTReliability
PREMISESMETRICDescription
0 rollouts or reconfigurations while an event runs

The system MUST be upgraded and reconfigured only while no event runs — BECAUSE a live audience cannot be asked to wait for a restart

Live Configuration Latency ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDPerformanceREQUIREMENT: Live Configuration Propagation ⚭
PREMISESMETRICDescription
propagation to all connected clients <= 2 seconds

The system SHOULD propagate an event configuration change to all connected clients within 2 seconds — BECAUSE operators expect toggles such as enabling chat to take effect near-instantly for the live audience

Per-Event Cost Efficiency ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDConstraint
PREMISESMETRICDescription
PREMISE: EU Hosting on Self-Operated Infrastructure ⚭recurring cost per event below the equivalent Azure or AWS hosting cost

The system SHOULD minimize the recurring cost per event by self-hosting on Hetzner infrastructure rather than Azure or AWS, excluding one-off development cost — BECAUSE low operating cost per event is a primary economic justification for building the solution

Interaction Abuse Throttling ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDSecurityREQUIREMENT: Chat Messages ⚭, REQUIREMENT: Ask Questions ⚭
PREMISESMETRICDescription
PREMISE: Abusive Interaction from the Audience ⚭<= 10 submissions per user per minute by default, configurable per event

The system SHOULD throttle chat and question submissions to a configurable maximum per user per minute — BECAUSE rate limiting prevents denial-of-service abuse of the interaction channels

Start-Surge Asset Delivery ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDPerformanceREQUIREMENT: Browser Access ⚭
PREMISESMETRICDescription
PREMISE: Connection Surge at Event Start ⚭client bundle delivered within 3 seconds at 10000 simultaneous joins

The system SHOULD deliver the static client bundle to each of 10000 attendees joining within the same minute in at most 3 seconds — BECAUSE the audience arrives in a surge right at the start of the event and must not be held back by the download

Compile-Time Contract Safety ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDMaintainability
PREMISESMETRICDescription
100 % of the client/server message contracts type-checked at build time

The system SHOULD catch every mismatch between the message contracts of client and server at build time instead of at runtime — BECAUSE a contract slip surfacing only during a live event is the costliest defect the solution can have

Live Diagnosability ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
SHOULDMaintainabilityREQUIREMENT: General Event Statistics ⚭, REQUIREMENT: Debugging Statistics ⚭
PREMISESMETRICDescription
event counters at most 5 minutes old, every login failure traceable from token states and log

The system SHOULD let the administrator see the attendee, channel, and authentication-flow counters of a running event with at most 5 minutes delay and trace every login failure from the recorded token states and the log — BECAUSE capacity and access problems must be diagnosed while the audience is still online

Mobile Usability ⚓︎
Diagram
PRIORITYCATEGORYQUALIFIES
COULDUsabilityREQUIREMENT: Mobile Device Support ⚭
PREMISESMETRICDescription
attendee screens fully usable at 360 px viewport width in portrait and landscape

The system COULD render the attendee experience responsively for mobile phones in landscape and portrait orientation — BECAUSE a substantial share of attendees join from mobile devices

REQS: Domain Rules (DR) ⚓︎

RULEProperties & Description
Single Active Session per Event ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: User ⚭, TERM: Session Token ⚭, TERM: Event ⚭REQUIREMENT: Limit Parallel Access ⚭
PREMISESDescription
PREMISE: Access URLs Forwarded Beyond the Audience ⚭

A User MUST have at most one active Session Token per Event at any time; a new login MUST delete any existing Session Token and close its connection — BECAUSE concurrent sessions would allow access sharing beyond the invited Attendee.

Access Requires List or Pattern Match ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: User ⚭, TERM: Event ⚭, TERM: Access List ⚭REQUIREMENT: User Authentication ⚭
PREMISESDescription
PREMISE: Access URLs Forwarded Beyond the Audience ⚭

A User not holding the Administrator Role (see Administrator Bypasses the Access List) MUST be granted access to an Event only according to the first matching case:

  1. The email of the User is on the Access List of the Event: access is granted.
  2. The email of the User matches the access email pattern of the Event: access is granted.
  3. The Event allows anonymous access: access is granted.

Otherwise the User MUST NOT be granted access

— BECAUSE access must be limited to the audience the organizer intends.

Single Active Channel ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintDomainTERM: Channel ⚭, TERM: Event ⚭REQUIREMENT: Live Provider Switching ⚭
PREMISESDescription

Exactly one Channel of an Event MUST be active at any time once the Event has at least one Channel, so the active Channel MUST NOT be deactivated directly and MUST NOT be deleted while another Channel of the Event exists — BECAUSE Attendees follow one logical content stream that defines the current Event feed.

Initial Channel Becomes Active ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
DerivationDomainTERM: Channel ⚭, TERM: Event ⚭REQUIREMENT: Live Provider Switching ⚭
PREMISESDescription

A Channel created for an Event without an active Channel MUST become the active Channel of the Event — BECAUSE Single Active Channel has to hold from the first Channel on, without a Manager having to activate it.

Single Active Resource per Channel ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintDomainTERM: Resource ⚭, TERM: Channel ⚭, TERM: Streaming Provider ⚭REQUIREMENT: Live Provider Switching ⚭, REQUIREMENT: Multiple Streaming Providers ⚭
PREMISESDescription

Exactly one Resource of a Channel MUST be active at any time once the Channel has at least one Resource, so the active Resource MUST NOT be deactivated directly and MUST NOT be deleted while another Resource of the Channel exists — BECAUSE switching the active Resource is the mechanism by which the live Streaming Provider is changed.

Initial Resource Becomes Active ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
DerivationDomainTERM: Resource ⚭, TERM: Channel ⚭REQUIREMENT: Live Provider Switching ⚭, REQUIREMENT: Multiple Streaming Providers ⚭
PREMISESDescription

A Resource created for a Channel without an active Resource MUST become the active Resource of the Channel — BECAUSE Single Active Resource per Channel has to hold from the first Resource on, without a Manager having to activate it.

Moderation Determines Initial Visibility ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ActionBusinessTERM: Message ⚭, TERM: Chat ⚭, TERM: Question ⚭, TERM: Attendee ⚭REQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Chat Messages ⚭, REQUIREMENT: Ask Questions ⚭
PREMISESDescription
PREMISE: Abusive Interaction from the Audience ⚭

When moderation is enabled for Chats or Questions, a Message of that type sent by an Attendee MUST stay in state pending and become visible only once accepted; when disabled, it MUST be accepted at once upon creation — BECAUSE organizers must control what the audience sees.

Moderator Messages Auto-Accepted ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ActionBusinessTERM: Message ⚭, TERM: Moderator ⚭REQUIREMENT: Moderator-Authored Messages ⚭
PREMISESDescription

A Message authored by a Moderator MUST be accepted at once upon creation and carry the sender name “Moderator” unless overridden — BECAUSE Moderator-authored content is trusted and needs no further approval.

Forwarded Messages Are Immutable ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: Message ⚭, TERM: Attendee ⚭, TERM: Presenter ⚭REQUIREMENT: Edit and Delete Messages ⚭, REQUIREMENT: Forward Inputs to Presenter ⚭
PREMISESDescription

Once a Message reaches state forwarded, the Attendee MUST NOT edit or delete it — BECAUSE the Presenter relies on the forwarded content remaining stable for live processing.

State Set Depends on Message Type ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintDomainTERM: Message ⚭, TERM: Question ⚭, TERM: Chat ⚭, TERM: Support ⚭REQUIREMENT: Moderate Chat and Questions ⚭
PREMISESDescription

A Message MUST use only the states its type permits:

  1. The Message is a Question: pending, accepted, rejected, forwarded, answered, and suspended.
  2. The Message is a Chat: pending, accepted, and rejected.
  3. The Message is a Support message: accepted.

No other combination of Message type and state is permitted

— BECAUSE each Message type has a different interaction lifecycle.

Sentiment Auto-Decision Threshold ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
DerivationBusinessTERM: Sentiment Analysis ⚭, TERM: Message ⚭REQUIREMENT: Server-Side Sentiment Analysis ⚭
PREMISESDescription

When server-side Sentiment Analysis is enabled, a sentiment score of a Message below -0.1 MUST be treated as improper and a score at or above it as proper for auto-accept and auto-reject decisions — BECAUSE a defined threshold makes automated moderation predictable.

Anonymization on Event Finish ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ActionLawTERM: Anonymization ⚭, TERM: Event ⚭, TERM: Message ⚭, TERM: Chat ⚭, TERM: Question ⚭, TERM: Like ⚭, TERM: Authorization Token ⚭, TERM: Session Token ⚭, TERM: Access List ⚭, TERM: User ⚭, TERM: Role ⚭, TERM: Moderator ⚭, TERM: Manager ⚭REQUIREMENT: Explicit User Consent ⚭, REQUIREMENT: GDPR-Compliant EU Processing ⚭, REQUIREMENT: User Statistics ⚭
PREMISESDescription
PREMISE: Message Texts Contain Personal Data ⚭

When an Event finishes, its Anonymization MUST reduce its Messages to a bare Like count with Chat and Question sender names set to “Anonymous” and liker and sender relations dropped, delete its Authorization Tokens and Session Tokens, clear its Access List and delete the referenced Users while retaining their viewer statistics unlinked from any User, and delete its Moderator Roles while retaining its Manager Roles — BECAUSE personal data must not be retained beyond the Event (GDPR Art. 5(1)(e), storage limitation).

Likes Conserved as Count on Finish ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ActionBusinessTERM: Like ⚭, TERM: Message ⚭, TERM: Event ⚭, TERM: Anonymization ⚭REQUIREMENT: Like Messages ⚭, REQUIREMENT: Export Attendee Inputs ⚭
PREMISESDescription

When an Event finishes, the number of Likes of each Message MUST be computed and stored as its bare Like count before the liker relations are removed — BECAUSE Like totals must survive the Anonymization for the exported record.

Token Format and Validity ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: Authorization Token ⚭, TERM: Event ⚭, TERM: Event Registration System ⚭REQUIREMENT: Return Access URLs to Registration ⚭, REQUIREMENT: Automatic Event Access URL ⚭
PREMISESDescription
PREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Email Gateway Delivers Tokens Within Minutes ⚭

An Authorization Token MUST be formatted as six digits “NNN-NNN”; a normal login token MUST expire within 5 minutes while a token pre-generated for the Event Registration System lasts until the Event ends, expiring on first use only if the Event so configures — BECAUSE token strength and lifetime balance security against convenient automated access.

No Permanent User Accounts ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintLawTERM: User ⚭, TERM: Role ⚭, TERM: Administrator ⚭, TERM: Event ⚭, TERM: Access List ⚭
PREMISESDescription

A User MUST NOT exist as a permanent account, except the holder of the Administrator Role bootstrapped from the configuration: any other User exists only while granted a Role, present on the Access List of an Event, or joining via a matching access email pattern — BECAUSE privacy by design (GDPR Art. 25) forbids persistent personal data beyond operational need.

Manager Retained for Export ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: Role ⚭, TERM: Manager ⚭, TERM: Event ⚭, TERM: Anonymization ⚭REQUIREMENT: Export Attendee Inputs ⚭
PREMISESDescription

A Manager Role MUST be retained after an Event finishes until the Event is deleted entirely — BECAUSE Managers must still export the Event data left by the Anonymization.

Administrator Bypasses the Access List ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: Administrator ⚭, TERM: User ⚭, TERM: Event ⚭, TERM: Access List ⚭REQUIREMENT: User Authentication ⚭
PREMISESDescription

A User holding the Administrator Role MUST be granted access to every Event through the ordinary login challenge of the configured email address, without an Access List entry, an access email pattern match, or anonymous access — BECAUSE the Administrator exists before any Event and hence cannot be enrolled on its Access List.

Administrator Bootstrapped by Configuration ⚓︎
Diagram
CATEGORYSOURCEGOVERNSCONSTRAINS
ConstraintBusinessTERM: Administrator ⚭, TERM: Role ⚭
PREMISESDescription

An Administrator Role MUST be granted and revoked through the software configuration only, never through the solution itself — BECAUSE the Administrator is the bootstrap identity from which every Event and Manager originates and hence cannot depend on a grant inside the solution.

REQS: Domain Workflows (DW) ⚓︎

WORKFLOW: Run Broadcast Event ⚓︎

ACTORSROLE: Manager ⚭, ROLE: Presenter ⚭, ROLE: Moderator ⚭, ROLE: Attendee ⚭
TRIGGERThe manager receives the attendee list of an upcoming event, exported by the Event Registration System.
OUTCOMEThe event took place, its personal data is anonymized, and its interaction results are exported.
JOURNEYSJOURNEY: Attend a Broadcast event ⚭, JOURNEY: Operate a Broadcast Event ⚭, JOURNEY: Moderate a Broadcast Event ⚭
TERMSTERM: Anonymization ⚭
RULESRULE: No Permanent User Accounts ⚭

The manager prepares and populates the event, the operators rehearse it, the audience attends it live while the moderators and the presenter handle the interaction, and the manager finishes and archives it afterwards — BECAUSE a broadcast event is a collaboration of several roles across days, of which each sitting with the solution covers only a part.

ACTIVITYACTORINITIALFINALDescription
Plan Event ⚓︎ROLE: Manager ⚭true

The manager configures the event and its channel and imports the attendee list of the Event Registration System, which yields the individual access URLs

Invite Attendees ⚓︎ROLE: Manager ⚭

The manager hands the individual access URLs back to the Event Registration System, which sends the invitation emails (outside the solution)

Rehearse Event ⚓︎ROLE: Presenter ⚭, ROLE: Moderator ⚭

The presenter and the moderators walk through the unpublished event together, checking the stream, the question flow, and the chat

Start Event ⚓︎ROLE: Manager ⚭

The manager publishes and starts the event when the stream goes on air and keeps the streaming resource healthy

Attend Event ⚓︎ROLE: Attendee ⚭

The attendees join via their individual URLs, watch the stream, and raise questions and chat messages

Moderate Interaction ⚓︎ROLE: Moderator ⚭

The moderators accept, reject, answer, and forward the incoming messages throughout the live event

Present and Answer ⚓︎ROLE: Presenter ⚭

The presenter delivers the talk and answers the forwarded questions on air

Finish Event ⚓︎ROLE: Manager ⚭

The manager finishes the event once the stream is off air, which closes the access and anonymizes the personal data

Archive Results ⚓︎ROLE: Manager ⚭true

The manager exports the anonymized messages and statistics and hands them over to the organizer

HANDOFFFROMTOCONDITIONRULESDescription
import ⚓︎ACTIVITY: Plan Event ⚭ACTIVITY: Invite Attendees ⚭

The generated individual access URLs are returned as a sheet the manager passes on to the Event Registration System

notify ⚓︎ACTIVITY: Invite Attendees ⚭ACTIVITY: Rehearse Event ⚭

The presenter and the moderators receive their access URLs and the rehearsal date by email

rework ⚓︎ACTIVITY: Rehearse Event ⚭ACTIVITY: Plan Event ⚭The rehearsal revealed a defect in the event configuration.

The presenter reports the defect to the manager, who corrects the configuration before a further rehearsal

approve ⚓︎ACTIVITY: Rehearse Event ⚭ACTIVITY: Start Event ⚭The rehearsal passed.

The presenter confirms the readiness of the event to the manager

admit ⚓︎ACTIVITY: Start Event ⚭ACTIVITY: Attend Event ⚭

The started event admits the invited attendees through their individual URLs

staff ⚓︎ACTIVITY: Start Event ⚭ACTIVITY: Moderate Interaction ⚭

The started event opens the moderation views to the moderators

cue ⚓︎ACTIVITY: Start Event ⚭ACTIVITY: Present and Answer ⚭

The manager cues the presenter once the stream is on air

forward ⚓︎ACTIVITY: Moderate Interaction ⚭ACTIVITY: Present and Answer ⚭RULE: Forwarded Messages Are Immutable ⚭

The moderator forwards an accepted question, which appears in the presenter’s view

disperse ⚓︎ACTIVITY: Attend Event ⚭ACTIVITY: Finish Event ⚭

The audience leaves when the stream ends, which the manager sees in the attendance statistics

wrap ⚓︎ACTIVITY: Moderate Interaction ⚭ACTIVITY: Finish Event ⚭

The moderators report the interaction as settled to the manager

sign-off ⚓︎ACTIVITY: Present and Answer ⚭ACTIVITY: Finish Event ⚭

The presenter signs off and the stream goes off air

hand-over ⚓︎ACTIVITY: Finish Event ⚭ACTIVITY: Archive Results ⚭RULE: Anonymization on Event Finish ⚭, RULE: Manager Retained for Export ⚭

The finished event keeps the anonymized data and the manager role for the export

REQS: Use Cases (UC) ⚓︎

USE-CASE: Join Event and Watch Stream ⚓︎

ACTORROLE: Attendee ⚭
JOURNEYSSTEP: Open event page and review login info ⚭, STEP: Watch stream and interact ⚭
ACTIVITIESACTIVITY: Attend Event ⚭
REQUIREMENTSREQUIREMENT: Individual Event Access URL ⚭, REQUIREMENT: User Authentication ⚭, REQUIREMENT: Browser Access ⚭, REQUIREMENT: Direct Resource Access URL ⚭, REQUIREMENT: Mobile Device Support ⚭, REQUIREMENT: In-Session Language Switching ⚭, REQUIREMENT: Light and Dark Theme ⚭
INCLUDESUSE-CASE: Authenticate via Email Token ⚭
PRE-CONDITIONThe attendee holds an event URL and their email is granted access.
TRIGGERThe attendee opens the individual event URL received by invitation.
POST-CONDITIONThe attendee holds an active session token and sees the stream.

The attendee opens the individual event URL in a web browser, on a desktop or a mobile phone, authenticates via their email, and is admitted to the live stream of the event, adjusting language and theme to their liking — BECAUSE watching the live stream is the very reason the attendee was invited.

SCENARIOProperties & Description
Join via Individual URL ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The attendee opens the individual event URL in any recent web browser, without installing software.
  2. The attendee authenticates (Authenticate via Email Token).
  3. The system grants the attendee access to the live video stream.
Return via Direct Resource URL ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The attendee sees the resource the URL names instead of the default stream of the event.
  1. The attendee opens an event URL carrying a resource parameter, typically by reloading the page.
  2. The attendee authenticates (Authenticate via Email Token), unless a session is still active.
  3. The system grants access and selects the named stream or static resource of the event.
Join on a Mobile Phone ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The attendee watches the stream on the phone, with the interaction possibly restricted.
  1. The attendee opens the individual event URL in the browser of a mobile phone.
  2. The attendee authenticates (Authenticate via Email Token).
  3. The system grants access to the live video stream in a layout fitting the phone screen in portrait or landscape orientation.
Switch the Language ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess3
OUTCOMEDescription
The attendee sees the interface and the translated messages in the chosen language.
  1. The system grants the attendee access to the live video stream in the default language.
  2. The attendee switches the language between German and English in the header.
  3. The system applies the language immediately to the interface and the translated messages.
Toggle the Theme ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess3
OUTCOMEDescription
The attendee sees the interface in the chosen light or dark theme.
  1. The system grants the attendee access to the live video stream in the default theme.
  2. The attendee toggles between the light and the dark theme in the header.
  3. The system applies the theme immediately across the whole interface.

USE-CASE: Authenticate via Email Token ⚓︎

ACTORROLE: Attendee ⚭
JOURNEYSSTEP: Authenticate via email token ⚭
ACTIVITIESACTIVITY: Attend Event ⚭
REQUIREMENTSREQUIREMENT: User Authentication ⚭, REQUIREMENT: Explicit User Consent ⚭, REQUIREMENT: Limit Parallel Access ⚭, REQUIREMENT: Personalized Event Access URL ⚭, REQUIREMENT: Automatic Event Access URL ⚭, REQUIREMENT: Login and Interaction Messages ⚭, REQUIREMENT: GDPR-Compliant EU Processing ⚭
RULESRULE: Access Requires List or Pattern Match ⚭, RULE: Single Active Session per Event ⚭, RULE: Token Format and Validity ⚭
PRE-CONDITIONThe attendee’s email is granted access to the event.
TRIGGERThe attendee requests access to an event without holding an active session.
POST-CONDITIONThe attendee holds an active session token and any prior session of the same user is closed.

The attendee proves control of their email via a one-time token, accepts any required consent, and receives a session while any prior session for the same user is closed; this flow is included by every use case requiring an authenticated attendee — BECAUSE only a proven identity entitles the attendee to the event they were invited to.

SCENARIOProperties & Description
Login with Emailed Token ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The system asks for the email address and presents the optional login message with its links.
  2. The attendee enters their email address.
  3. The system sends a six-digit authorization token to that email.
  4. The attendee enters the received token.
  5. The system validates the token and any consent the event requires for GDPR-compliant participation.
  6. The system issues a session token and closes any prior session of the user.
Email Pre-Filled from URL ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeResume2
OUTCOMEDescription
The email address is fixed by the personalized event URL, and the flow resumes at step 3.
  1. The system finds the email address embedded in the event URL and presents it read-only instead of asking for it.
Automatic Token in URL ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The attendee holds an active session token, obtained without entering email or token.
  1. The system finds the email and a pre-generated token embedded in the event URL.
  2. The system validates the embedded token against the event settings.
  3. The system issues a session token without asking for the email address.
Email Not Authorized ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalResume3
OUTCOMEDescription
No session exists and no token was sent, and the attendee may retry with another email address (resumes at step 1).
  1. The system finds the email neither on the access list nor matching the access pattern.
  2. The system denies access and informs the attendee that they are not authorized.

USE-CASE: Ask a Question ⚓︎

ACTORROLE: Attendee ⚭
JOURNEYSSTEP: Watch stream and interact ⚭
ACTIVITIESACTIVITY: Attend Event ⚭
REQUIREMENTSREQUIREMENT: Ask Questions ⚭, REQUIREMENT: Tag Question Messages ⚭, REQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Server-Side Sentiment Analysis ⚭, REQUIREMENT: Client-Side Sentiment Analysis ⚭
RULESRULE: Moderation Determines Initial Visibility ⚭, RULE: State Set Depends on Message Type ⚭, RULE: Sentiment Auto-Decision Threshold ⚭
PRE-CONDITIONThe attendee has an active session and questions are enabled.
TRIGGERThe attendee decides to raise a question during the running event.
POST-CONDITIONThe question is stored in state pending and awaits moderation.

The attendee writes a question, optionally tags it, and submits it; the system stores it and routes it through moderation if the event requires approval before it becomes visible — BECAUSE getting their own question answered turns the attendee from a passive viewer into a participant.

SCENARIOProperties & Description
Submit Moderated Question ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The attendee starts a new question.
  2. The attendee writes the question and optionally assigns predefined tags.
  3. The attendee submits the question.
  4. The system stores the question in state pending.
  5. The system shows the question to moderators for approval.
Auto-Accepted by Sentiment ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess4
OUTCOMEDescription
The question is stored in state accepted and visible to the audience without moderation.
  1. The system runs server-side sentiment analysis on the text.
  2. The system finds the sentiment proper and auto-accept is enabled.
  3. The system stores the question in state pending and accepts it at once, without a moderator decision.
Auto-Rejected by Sentiment ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalFailure4
OUTCOMEDescription
The question is stored in state rejected and hidden from the audience, without a moderator decision.
  1. The system runs server-side sentiment analysis on the text.
  2. The system finds the sentiment improper and auto-reject is enabled.
  3. The system stores the question in state pending and rejects it at once, informing the attendee.
Throttled Submission ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalFailure4
OUTCOMEDescription
The question is not stored, and the attendee may submit it again once the limit window has passed.
  1. The system detects that the attendee exceeded the per-minute submission limit.
  2. The system rejects the new submission and informs the attendee to wait.
Held Back by Client-Side Check ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalResume3
OUTCOMEDescription
The question was not sent, and the attendee may revise its wording (resumes at step 2).
  1. The system runs the client-side sentiment analysis on the text before sending it.
  2. The system finds the sentiment improper and prevents the submission, informing the attendee.

USE-CASE: Chat During the Event ⚓︎

USE-CASEChat During the Event ENTITYUser ENTITYMessage ENTITYMessageText TRANSITIONaccept TRANSITIONresubmit PERMISSIONSend Messages PERMISSIONRead Visible Messages PERMISSIONTrack Own Messages PERMISSIONCorrect Own Messages PERMISSIONLike Messages PRINCIPLEModeration-GatedVisibility PRINCIPLEPrivacy-Visible Identity PRINCIPLENever Leave the Stream PRINCIPLECorrect over Confirm PRINCIPLEFamiliar Conventions PRINCIPLEOne-Tap Contribution STORYBOARDAttendee Reads and PostsChat ENTITYAttendee ENTITYTranslation LLM TEST-CASEUnmoderated Chat StartsAccepted TEST-CASEForwarded Message IsLocked TEST-CASEChat Message ShowsConfigured Name TEST-CASELike Toggles the Count TEST-CASEDeleted Message LeavesPlaceholder ROLEAttendee STEPWatch stream and interact ACTIVITYAttend Event REQUIREMENTChat Messages REQUIREMENTLike Messages REQUIREMENTReply to Chat Messages REQUIREMENTConfigurable NameAppearance REQUIREMENTPersonal DisplayFiltering REQUIREMENTEdit and Delete Messages REQUIREMENTMultiple-Choice Feedback REQUIREMENTDeleted MessagePlaceholder RULEModeration DeterminesInitial Visibility RULEForwarded Messages AreImmutable RULEState Set Depends onMessage Typeactorjourneysactivitiesrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrulesrulesrulesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesscenariouse-casesuse-casesverifiesverifiesverifiesverifiesverifies
ACTORROLE: Attendee ⚭
JOURNEYSSTEP: Watch stream and interact ⚭
ACTIVITIESACTIVITY: Attend Event ⚭
REQUIREMENTSREQUIREMENT: Chat Messages ⚭, REQUIREMENT: Like Messages ⚭, REQUIREMENT: Reply to Chat Messages ⚭, REQUIREMENT: Edit and Delete Messages ⚭, REQUIREMENT: Deleted Message Placeholder ⚭, REQUIREMENT: Personal Display Filtering ⚭, REQUIREMENT: Configurable Name Appearance ⚭, REQUIREMENT: Multiple-Choice Feedback ⚭
RULESRULE: Moderation Determines Initial Visibility ⚭, RULE: State Set Depends on Message Type ⚭, RULE: Forwarded Messages Are Immutable ⚭
PRE-CONDITIONThe attendee has an active session and chat is enabled for the event.
TRIGGERThe attendee wants to comment on the running event.
POST-CONDITIONThe chat message is stored in the state the moderation setting determines and shown under the attendee’s configured name appearance.

The attendee comments on the running event through chat messages, likes, replies, and poll answers, and corrects or removes their own contributions afterwards — BECAUSE live commentary turns the audience from silent viewers into an engaged community.

SCENARIOProperties & Description
Post a Chat Message ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The attendee writes a chat message.
  2. The attendee sends the message.
  3. The system stores the message in state pending and accepts it at once, unless the event moderates chat messages and hence holds it for the moderator decision.
  4. The system shows the message in the stream under the sender name in the form the event configures (full name, first name, or anonymous), exposing the email address on hover.
Pending Message Stays Private ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess4
OUTCOMEDescription
The message is visible to its sender only until a moderator accepts it.
  1. The system shows the pending message to its sender only, marked as awaiting the moderation decision.
  2. The system shows the message to the other attendees once a moderator has accepted it.
Like a Message ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The like count of the message reflects the current choice of the attendee.
  1. The attendee likes a visible chat message or question of another attendee.
  2. The system records the like and raises the like count of the message.
  3. The attendee optionally undoes the like, and the system lowers the count again.
Reply to a Chat Message ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The reply is stored like a chat message and shown threaded below the message it answers.
  1. The attendee selects a visible chat message to reply to, replies being enabled for the event.
  2. The attendee writes and sends the reply.
  3. The system stores the reply like a chat message and shows it threaded below the message it answers.
Edit an Own Message ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The corrected message is visible and marked as edited, moderated again where the event requires it.
  1. The attendee opens one of their own chat messages or questions for editing.
  2. The attendee changes the text and saves it.
  3. The system marks the message as edited for the other readers.
  4. The system resubmits the edited message to the moderation where the event requires it, hiding it from the audience until it is accepted anew.
Delete an Own Message ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The message text is gone while its position in the stream is kept by a placeholder.
  1. The attendee deletes one of their own chat messages or questions.
  2. The system retains the position of the message in the stream and shows a “This message was deleted” placeholder instead of its text.
Forwarded Question Locked ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalFailure1
OUTCOMEDescription
The forwarded question remains unchanged and the attendee is informed why.
  1. The attendee tries to edit or delete one of their own questions which a moderator has already forwarded to the presenter.
  2. The system refuses the change and informs the attendee that a forwarded question is immutable.
Show Own Contributions Only ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess4
OUTCOMEDescription
The attendee sees only their own messages and questions until they choose to see those of the others again.
  1. The attendee chooses to see only their own messages and questions.
  2. The system hides the messages and questions of the other attendees from the view of the attendee.
Answer a Multiple-Choice Poll ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The answer of the attendee is counted in the live result of the poll.
  1. The system presents a multiple-choice question raised during the event.
  2. The attendee picks one of the offered choices.
  3. The system records the answer and updates the live result of the poll.

USE-CASE: Moderate and Forward Messages ⚓︎

ACTORROLE: Moderator ⚭
PERSONASPERSONA: Peter ⚭
JOURNEYSSTEP: Moderate and support the presenter ⚭
ACTIVITIESACTIVITY: Rehearse Event ⚭, ACTIVITY: Moderate Interaction ⚭
REQUIREMENTSREQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Forward Inputs to Presenter ⚭, REQUIREMENT: Sort and Filter Messages ⚭, REQUIREMENT: Presenter Hints and Alerts ⚭
RULESRULE: State Set Depends on Message Type ⚭, RULE: Forwarded Messages Are Immutable ⚭, RULE: Anonymization on Event Finish ⚭
PRE-CONDITIONThe event is running and the moderator has the Moderator role.
TRIGGERAn attendee message arrives in state pending for moderation.
POST-CONDITIONMessages are accepted, rejected, forwarded with optional hints, or settled on behalf of the presenter.

The moderator reviews the pending messages by state, approves or rejects them, forwards selected approved questions to the presenter in a chosen order, and may attach hints or raise a presenter alert — BECAUSE the presenter can only handle a curated, ordered selection of the audience input while on stage.

SCENARIOProperties & Description
Approve and Forward Question ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The moderator narrows the messages down to the pending questions.
  2. The moderator approves a relevant question, setting it accepted.
  3. The moderator forwards the accepted question to the presenter.
  4. The moderator optionally attaches a hint for the presenter.
  5. The system places the forwarded question in the presenter’s work basket and locks it from editing.
Reject Improper Message ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The message is in state rejected and hidden from the audience, without reaching the presenter.
  1. The moderator rejects an improper message.
  2. The system sets the message to rejected and hides it from the audience.
Settle a Question for the Presenter ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess4
OUTCOMEDescription
The forwarded question is marked answered or suspended without the presenter touching it.
  1. The moderator marks the forwarded question as answered or suspended on behalf of the presenter, e.g. once the presenter addressed it on stage without marking it.
  2. The system records the decision and removes the question from the presenter’s work basket.
Access Lost After Finish ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalFailure1
OUTCOMEDescription
The moderator cannot enter the finished event, and no message is moderated anymore.
  1. The moderator opens the event after the manager has finished it.
  2. The system refuses the access, as the anonymization has deleted the Moderator role of the event.

USE-CASE: Moderate the Chat Conversation ⚓︎

ACTORROLE: Moderator ⚭
PERSONASPERSONA: Markus ⚭
JOURNEYSSTEP: Moderate and support the presenter ⚭
ACTIVITIESACTIVITY: Rehearse Event ⚭, ACTIVITY: Moderate Interaction ⚭
REQUIREMENTSREQUIREMENT: Answer Attendee Inputs ⚭, REQUIREMENT: Moderator-Authored Messages ⚭, REQUIREMENT: Manage Embedded Application ⚭
RULESRULE: Moderator Messages Auto-Accepted ⚭, RULE: Moderation Determines Initial Visibility ⚭
PRE-CONDITIONThe event runs with chat enabled and the moderator has the Moderator role.
TRIGGERAttendee chat messages arrive which need an answer, a steer, or a seed from the moderator.
POST-CONDITIONAttendees are answered, moderator-authored messages are visible, and the conversation stays on-topic.

The moderator keeps the chat conversation civil and on-topic by answering attendees publicly or privately, seeding the conversation with messages of their own, and controlling an embedded application — BECAUSE an unattended chat drowns in spam and off-topic noise.

SCENARIOProperties & Description
Answer an Attendee Directly ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The moderator reviews the incoming chat messages.
  2. The moderator selects a chat message which needs a clarification or support.
  3. The moderator writes a reply to the attendee.
  4. The moderator chooses whether the reply is visible to all or a direct message to the attendee only.
  5. The system stores the reply in state pending, accepts it at once as a moderator-authored message, and delivers it accordingly.
Seed the Conversation as Moderator ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The moderator-authored message is visible to the audience under the chosen sender name.
  1. The moderator authors a chat message or a question for the audience, e.g. to seed a Q&A round.
  2. The moderator keeps the sender name “Moderator” or overrides it for this message.
  3. The system stores the message in state pending, accepts it at once as a moderator-authored message, and shows it to the audience.
Administer the Embedded Application ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The embedded application is controlled by the moderator while the event continues.
  1. The moderator opens the administration view an embedded third-party application exposes.
  2. The moderator controls the application from this view.
  3. The system passes the control on to the application without interrupting the stream.

USE-CASE: Steer the Presenter ⚓︎

ACTORROLE: Moderator ⚭
PERSONASPERSONA: Peter ⚭
JOURNEYSSTEP: Moderate and support the presenter ⚭
ACTIVITIESACTIVITY: Moderate Interaction ⚭
REQUIREMENTSREQUIREMENT: Presenter Hints and Alerts ⚭, REQUIREMENT: Live Configuration Propagation ⚭
PRE-CONDITIONThe event is running and the moderator has the Moderator role.
TRIGGERThe presenter needs timing or routing guidance during the live event.
POST-CONDITIONThe presenter alert is raised or the active agenda point is advanced, and the presenter sees it.

The moderator raises a textual alert on the stage view of the presenter and advances the active agenda point of the event — BECAUSE the presenter on stage cannot watch the clock and the audience input at the same time.

SCENARIOProperties & Description
Raise a Presenter Alert ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The moderator writes an alert for the presenter, e.g. a timing hint.
  2. The moderator raises the alert.
  3. The system shows the alert on the stage view of the presenter until the presenter confirms it.
Advance the Agenda ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess1
OUTCOMEDescription
The next agenda point is the active one of the event.
  1. The moderator marks the next agenda point as the active one.
  2. The system propagates the active agenda point to the presenter and the attendees.

USE-CASE: Configure the Event ⚓︎

ACTORROLE: Manager ⚭
JOURNEYSSTEP: Configure and run the event ⚭
ACTIVITIESACTIVITY: Plan Event ⚭
REQUIREMENTSREQUIREMENT: Multiple Streaming Providers ⚭, REQUIREMENT: Configurable Name Appearance ⚭, REQUIREMENT: Tag Question Messages ⚭, REQUIREMENT: Login and Interaction Messages ⚭, REQUIREMENT: Live Configuration Propagation ⚭, REQUIREMENT: Import and Export Event ⚭
RULESRULE: Single Active Channel ⚭, RULE: Single Active Resource per Channel ⚭, RULE: No Permanent User Accounts ⚭, RULE: Manager Retained for Export ⚭
PRE-CONDITIONThe event is provisioned by the administrator and the manager holds its Manager role.
TRIGGERThe manager receives the Manager role of an upcoming event.
POST-CONDITIONThe event carries its channels, agenda, tags, roles, access list, and interaction settings, ready for the rehearsal.

The manager lays out the channels and their fallback resources, curates the agenda and the question tags, grants the Moderator and Presenter roles, maintains the access list, and sets the interaction options of the event — BECAUSE a broadcast event needs its stage, its staff, and its audience set up before anyone can rehearse it.

SCENARIOProperties & Description
Lay Out the Channels ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The manager opens the configuration of the event.
  2. The manager defines the channels of the event and marks one of them as active.
  3. The manager selects the active resource of each channel among its provisioned streaming resources.
  4. The manager sets the interaction options, the name appearance, and the login and interaction messages of the event.
  5. The system validates the settings and propagates them to the connected clients.
Curate the Agenda ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The event carries an ordered agenda the moderator advances during the live event.
  1. The manager defines the ordered agenda points of the event and the tags corresponding to them.
  2. The system stores the agenda for the presenter and the moderators.
Curate the Tags ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The event carries a tag vocabulary for the questions, partly reserved for the moderators.
  1. The manager defines the tag vocabulary of the questions, reserving some tags for the moderators.
  2. The system offers the public tags to the attendees and every tag to the moderators.
Grant the Event Roles ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The moderators and the presenter can enter the unpublished event for the rehearsal.
  1. The manager grants the Attendee, Moderator, and Presenter roles to the users of the event by email address, or revokes them again.
  2. The system creates the users of the roles without permanent accounts and admits them to the unpublished event.
Maintain the Access List ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The access list names exactly the invited attendees.
  1. The manager adds attendees to the access list by email address, or removes them again.
  2. The system deletes a removed user without any role entirely.
Delete the Event ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The event no longer exists.
  1. The manager deletes the event entirely.
  2. The system deletes the event with its messages, statistics, and remaining Manager roles.

USE-CASE: Switch Streaming Provider ⚓︎

ACTORROLE: Manager ⚭
JOURNEYSSTEP: Configure and run the event ⚭
ACTIVITIESACTIVITY: Start Event ⚭
REQUIREMENTSREQUIREMENT: Multiple Streaming Providers ⚭, REQUIREMENT: Live Provider Switching ⚭, REQUIREMENT: Live Configuration Propagation ⚭
RULESRULE: Single Active Channel ⚭, RULE: Single Active Resource per Channel ⚭
PRE-CONDITIONThe event runs and the channel has multiple configured resources.
TRIGGERThe active streaming resource shows problems during a running event.
POST-CONDITIONA new resource is active and all clients follow it automatically.

When a provider has problems, the manager activates a fallback resource on the channel and the system propagates the change so attendee clients switch streams without any user interaction — BECAUSE a live event cannot be paused while a streaming provider recovers.

SCENARIOTYPEDescription
Live Failover ⚓︎Main
  1. The manager observes streaming problems with the active resource.
  2. The manager activates a different configured resource on the channel.
  3. The system marks the new resource active and the old one inactive.
  4. The system propagates the change to all connected clients.
  5. The attendee clients switch to the new stream without user interaction.

USE-CASE: Create Event from Registration Import ⚓︎

ACTORROLE: Manager ⚭
JOURNEYSSTEP: Configure and run the event ⚭
ACTIVITIESACTIVITY: Plan Event ⚭
REQUIREMENTSREQUIREMENT: Import Registered Attendees ⚭, REQUIREMENT: Return Access URLs to Registration ⚭, REQUIREMENT: Import and Export Event ⚭
RULESRULE: Token Format and Validity ⚭, RULE: No Permanent User Accounts ⚭
PRE-CONDITIONThe manager has an Excel sheet of the Event Registration System and an event to populate.
TRIGGERThe manager receives the Excel sheet of the attendees of an upcoming event, exported by the Event Registration System.
POST-CONDITIONThe access list and tokens are created and the URL sheet is ready for the manager to hand back to the Event Registration System.

The manager imports the Excel sheet of the Event Registration System to fill the event access list and generate authorization tokens, then exports an Excel sheet of personal access URLs back to the Event Registration System, avoiding duplicate invitations on repeated imports — BECAUSE provisioning hundreds of attendees by hand is error-prone and does not scale.

SCENARIOTYPEDescription
Import and Return URLs ⚓︎Main
  1. The manager uploads the Excel sheet of the Event Registration System to the event.
  2. The system creates access-list users for new emails and skips existing ones.
  3. The system generates a “NNN-NNN” authorization token per user in state issued.
  4. The system composes each user’s personal access URL with event, user, and token.
  5. The system returns an Excel sheet with the URL column filled, which the manager hands back to the Event Registration System.

USE-CASE: Publish, Start, and Finish Event ⚓︎

ACTORROLE: Manager ⚭
JOURNEYSSTEP: Configure and run the event ⚭
ACTIVITIESACTIVITY: Start Event ⚭, ACTIVITY: Finish Event ⚭
RULESRULE: Anonymization on Event Finish ⚭
PRE-CONDITIONThe event is configured and its access list is populated.
TRIGGERThe scheduled date of the event approaches.
POST-CONDITIONThe event is finished, access is closed, and the personal data is anonymized.

The manager publishes the configured event to make it visible to the invited attendees, starts it when the live stream goes on air, and finishes it afterwards — BECAUSE the visibility, the live interaction, and the anonymization of an event are deliberate decisions of the manager, not side effects of the clock.

SCENARIOProperties & Description
Publish, Start, and Finish ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The manager publishes the configured event.
  2. The system makes the event visible to the invited attendees.
  3. The manager starts the event when the live stream goes on air.
  4. The system opens the stream and the interaction channels for the attendees.
  5. The manager finishes the event after the live stream has ended.
  6. The system closes the access and anonymizes the personal data of the event.
Start Without Publishing ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeResume1
OUTCOMEDescription
The event is running without having been visible to the attendees beforehand, and the flow resumes at step 5.
  1. The manager starts the still unpublished event directly.
  2. The system opens the stream and the interaction channels for the attendees.

USE-CASE: Export Anonymized Event Data ⚓︎

ACTORROLE: Manager ⚭
JOURNEYSSTEP: Export anonymized results after event ⚭
ACTIVITIESACTIVITY: Archive Results ⚭
REQUIREMENTSREQUIREMENT: Export Attendee Inputs ⚭, REQUIREMENT: General Event Statistics ⚭, REQUIREMENT: Channel Statistics ⚭, REQUIREMENT: User Statistics ⚭, REQUIREMENT: Debugging Statistics ⚭, REQUIREMENT: Periodic Statistics Snapshots ⚭
RULESRULE: Anonymization on Event Finish ⚭, RULE: Likes Conserved as Count on Finish ⚭, RULE: Manager Retained for Export ⚭
PRE-CONDITIONThe event has finished and the manager retains the Manager role.
TRIGGERThe manager is asked to hand over the recorded interaction of a finished event.
POST-CONDITIONAn export file of anonymized messages and statistics is produced.

After the event finishes and personal data is anonymized, the manager exports all attendee inputs with timestamps, states, like counts, and texts, together with the event statistics — BECAUSE the organizer evaluates the event and answers open questions afterwards from this record.

SCENARIOProperties & Description
Export After Finish ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The manager selects the finished event.
  2. The manager triggers the export of attendee inputs.
  3. The system produces a file containing timestamp, state, likes, and text per message.
  4. The manager downloads the export file.
Inspect the Event Statistics ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The manager has evaluated the audience size, composition, channel popularity, and authentication flow without producing an export file.
  1. The manager opens the statistics of the event instead of triggering the export.
  2. The system shows the curve of logged-in attendees over time and the number of viewers per channel.
  3. The system shows the recorded viewer statistics by country, browser, device, and viewport.
  4. The system shows the login-challenge statistics of issued, sent, and used authorization tokens.

USE-CASE: Present Forwarded Questions ⚓︎

ACTORROLE: Presenter ⚭
ACTIVITIESACTIVITY: Rehearse Event ⚭, ACTIVITY: Present and Answer ⚭
REQUIREMENTSREQUIREMENT: Forward Inputs to Presenter ⚭, REQUIREMENT: Presenter Dashboard ⚭, REQUIREMENT: Presenter Hints and Alerts ⚭
RULESRULE: Forwarded Messages Are Immutable ⚭
PRE-CONDITIONThe event is running and questions have been forwarded.
TRIGGERThe moderator forwards a question to the presenter.
POST-CONDITIONProcessed questions are marked answered or suspended.

The presenter views the forwarded questions in their intended order with any moderator hints, addresses them on stage, and marks each as answered or suspended — BECAUSE the presenter needs to keep track of what was already addressed while staying focused on the audience.

SCENARIOProperties & Description
Answer Forwarded Question ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The presenter views the ordered list of forwarded questions and hints.
  2. The presenter addresses a question live on stage.
  3. The presenter marks the question as answered.
  4. The system records the answered timestamp and removes it from the active basket.
Suspend a Forwarded Question ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeSuccess2
OUTCOMEDescription
The question is marked suspended and leaves the active basket without having been addressed on stage.
  1. The presenter decides not to address a forwarded question on stage.
  2. The presenter marks the question as suspended.
  3. The system removes the question from the active basket.
Forwarded Questions Only ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeResume1
OUTCOMEDescription
The presenter works on the curated forwarded questions alone, and the flow resumes at step 2.
  1. The presenter views the forwarded questions only, while the pending, accepted, and rejected messages of the event stay invisible to them.
Confirm a Raised Alert ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeResume1
OUTCOMEDescription
The alert is taken off the stage view, and the flow resumes at step 1.
  1. The presenter sees an alert a moderator has raised on the stage view.
  2. The presenter confirms the alert, which takes it off the stage view.

USE-CASE: Administer Any Event ⚓︎

ACTORROLE: Administrator ⚭
PERSONASPERSONA: Sven ⚭
RULESRULE: Administrator Bypasses the Access List ⚭, RULE: Administrator Bootstrapped by Configuration ⚭, RULE: No Permanent User Accounts ⚭
PRE-CONDITIONThe Administrator role is granted to the email address of the administrator through the configuration.
TRIGGERThe administrator opens the URL of an event they are not enrolled in.
POST-CONDITIONThe event carries the changes of the administrator.

The administrator enters any event without an access list entry and edits every setting, message, and user of it — BECAUSE the organizers need a last resort which depends on no event-specific grant when they are locked out or stuck.

SCENARIOProperties & Description
Enter and Edit Any Event ⚓︎
TYPERESULTAT-MAIN-STEP
Main
OUTCOMEDescription
  1. The administrator opens the event URL and requests the login challenge for the configured administrator email address.
  2. The system issues and sends the one-time token without consulting the access list of the event.
  3. The administrator returns the token.
  4. The system admits the administrator to the event in every state with every operation.
  5. The administrator edits a setting, a message, or a user of the event.
  6. The system applies the change and propagates it like the change of the respective event role.
Reach an Event via the Overview ⚓︎
TYPERESULTAT-MAIN-STEP
AlternativeResume1
OUTCOMEDescription
The administrator has reached the event through the overview instead of its URL, and the flow resumes at step 1.
  1. The administrator opens the overview of all events instead of the URL of a particular event.
  2. The system lists every event in every state.
  3. The administrator selects an event, which opens its URL.
Administrator Role Stays Configured ⚓︎
TYPERESULTAT-MAIN-STEP
ExceptionalFailure5
OUTCOMEDescription
The set of administrators stays as configured.
  1. The administrator attempts to grant or revoke an Administrator role in the user interface.
  2. The system refuses the change, as the Administrator role is granted through the configuration only.

DATA: Data Model (DM) ⚓︎

Events Channels Users Messages Tokens Statistics Event AgendaPoint QuestionTag Channel Resource ResourceProviderParam Role User Message MessageText AuthorizationToken SessionToken EventStatistic ChannelStatistic UserStatisticavailableQuestionTagsactiveAgendaPointagendaPointscorrespondingTagsagendaPointsresourcesparamsrolesreplyTopredecessormessageTextchannelsaccessListmessagesstatisticsuserStatisticsstatisticslikessentMessagesstatisticssenderlikereventquestionTagsmessagesusereventusereventevent0..n0..10..n0..n0..n1..n0..n0..n0..10..11..n0..n0..n0..n0..n0..n0..n0..n0..n0..n0..10..n10..n0..n11111
GROUPDescription
Events ⚓︎

An event together with its agenda points and its question tags — BECAUSE both are the event-specific configuration of its phases and questions.

Users ⚓︎

The user as the sole identity entity together with the roles granted to it — BECAUSE the user is the one entity nearly every other one refers to and the roles are the rights it holds.

Channels ⚓︎

A channel together with its provider resources and their provider parameters — BECAUSE the resources and parameters are the owned parts delivering the channel.

Messages ⚓︎

A message together with its language-specific texts — BECAUSE the texts are owned parts of the message and never exist without it.

Tokens ⚓︎

The authorization and session tokens of the login — BECAUSE both prove the access of a user to an event, before and after the login.

Statistics ⚓︎

The periodic snapshot entities of the event, its channels, and its users — BECAUSE all of them are recorded over time and exported together for trend visualization.

ENTITY: Event ⌘ ⚓︎

ENTITYEvent ENTITYMessage ENTITYAuthorizationToken ENTITYSessionToken ENTITYUserStatistic LIFECYCLEEvent COMPONENTService CONCERNDatabase Backup TACTICDump-Based Recovery ENTITYAgendaPoint ENTITYChannel ENTITYUser ENTITYMessage ENTITYQuestionTag ENTITYEventStatistic ENTITYUserStatistic REQUIREMENTUser Authentication REQUIREMENTAsk Questions REQUIREMENTChat Messages REQUIREMENTReply to Chat Messages REQUIREMENTConfigurable NameAppearance REQUIREMENTClient-Side SentimentAnalysis REQUIREMENTServer-Side SentimentAnalysis REQUIREMENTModerate Chat andQuestions REQUIREMENTPresenter Hints andAlerts REQUIREMENTManage EmbeddedApplication REQUIREMENTIndividual Event AccessURL REQUIREMENTAutomatic Event AccessURL REQUIREMENTExplicit User Consent REQUIREMENTLogin and InteractionMessages REQUIREMENTImport and Export Event REQUIREMENTLive ConfigurationPropagation USE-CASEJoin Event and WatchStream USE-CASEModerate and ForwardMessages USE-CASESwitch Streaming Provider USE-CASECreate Event fromRegistration Import USE-CASEPublish, Start, andFinish Event USE-CASEExport Anonymized EventDatarequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsrequirementsuse-casesuse-casesuse-casesuse-casesuse-casesuse-casesentityownselementsaffectschannelsaccessListmessagesstatisticsuserStatisticsavailableQuestionTagsactiveAgendaPointagendaPointseventeventeventevent0..n0..n0..n0..n0..n0..n0..10..n1111
REQUIREMENTSREQUIREMENT: Individual Event Access URL ⚭, REQUIREMENT: User Authentication ⚭, REQUIREMENT: Automatic Event Access URL ⚭, REQUIREMENT: Explicit User Consent ⚭, REQUIREMENT: Login and Interaction Messages ⚭, REQUIREMENT: Configurable Name Appearance ⚭, REQUIREMENT: Chat Messages ⚭, REQUIREMENT: Reply to Chat Messages ⚭, REQUIREMENT: Ask Questions ⚭, REQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Client-Side Sentiment Analysis ⚭, REQUIREMENT: Server-Side Sentiment Analysis ⚭, REQUIREMENT: Presenter Hints and Alerts ⚭, REQUIREMENT: Manage Embedded Application ⚭, REQUIREMENT: Live Configuration Propagation ⚭, REQUIREMENT: Import and Export Event ⚭
USE-CASESUSE-CASE: Create Event from Registration Import ⚭, USE-CASE: Publish, Start, and Finish Event ⚭, USE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Switch Streaming Provider ⚭, USE-CASE: Moderate and Forward Messages ⚭, USE-CASE: Export Anonymized Event Data ⚭
TERMSTERM: Event ⚭
GROUPGROUP: Events ⚭

The master entity describing a single live broadcast event and all of its configuration — BECAUSE the entire data model is event-centric and every other entity hangs off an event.

ATTRIBUTETYPEDEFAULTCLASSIFICATIONDescription
eventId ⚓︎key uuiduuid()

Unique identifier of the event used in the access URL — BECAUSE attendees reach a specific event by an unguessable link

title ⌘ ⚓︎string?Public

Display title of the event such as “Townhall 1/23” — BECAUSE attendees and managers need a human-readable label

description ⌘ ⚓︎string?

Free-text description of the event — BECAUSE organizers describe the purpose and content of the event

begin ⌘ ⚓︎datetime?

Planned start date and time of the event — BECAUSE attendees and operators must know when the event starts

end ⌘ ⚓︎datetime?

Planned end date and time of the event — BECAUSE scheduling and the finish procedure depend on the planned end

language ⚓︎stringen

Targeted mother language of the event — BECAUSE it sets the default language despite on-the-fly translation of interaction

state ⚓︎enum(planning,published,running,finished)planning

Lifecycle state controlling attendee visibility and access — BECAUSE an event progresses from private setup to live to archived

loginInfo ⚓︎string""

HTML markup shown to attendees at login — BECAUSE managers convey event information and links at entry

loginInfoToBeAccepted ⚓︎booleanfalse

Whether the login information must be explicitly accepted — BECAUSE some events require acknowledged consent before joining

interactionInfo ⚓︎string""

HTML markup shown when interaction is enabled — BECAUSE conduct rules must be presented before chat or questions

interactionInfoToBeAccepted ⚓︎booleanfalse

Whether the interaction information must be explicitly accepted — BECAUSE some events require acknowledged conduct rules before interacting

allowAccessAnonymous ⚓︎booleanfalse

Whether anonymous attendees may access the event without authorization — BECAUSE public events accept unauthenticated viewers

accessEmailPattern ⚓︎string""

Pattern that grants access to any matching email beyond the access list — BECAUSE events can admit whole email domains without enumerating users

chatEnabled ⚓︎booleanfalse

Whether attendees may send chat messages — BECAUSE chat is an optional interaction channel per event

chatAllowAnonymous ⚓︎booleanfalse

Whether chat messages may be sent as “Anonymous” — BECAUSE events differ in how much chat identity is revealed

chatName ⚓︎enum(full,firstname,anonymous)full

How the attendee name appears on chat messages — BECAUSE the event controls the displayed chat identity

chatReply ⚓︎booleanfalse

Whether chat messages may be replied to — BECAUSE threaded replies are appropriate only for some events

chatThrottling ⚓︎integer1

Maximum chat messages per user per minute — BECAUSE rate limiting prevents denial-of-service abuse

chatModerator ⚓︎booleanfalse

Whether chat messages are moderated before becoming visible — BECAUSE organizers may require approval of chat content

supportEnabled ⚓︎booleanfalse

Whether attendees may chat with support for technical problems — BECAUSE events may offer a dedicated support channel

appEnabled ⚓︎booleanfalse

Whether a third-party application is integrated — BECAUSE events may embed an interactive app

appTitle ⚓︎string""

Display title of the embedded third-party application — BECAUSE the embedded app needs a label for attendees

appURL ⚓︎string""

URL of the embedded third-party application — BECAUSE the client must load the app from a defined location

appAdminURL ⚓︎string""

Administration URL of the embedded third-party application — BECAUSE moderators control the app through a separate admin view

presenterAlert ⚓︎string""

Alert text a moderator can raise for the presenter — BECAUSE the moderator must signal urgent information to the presenter

presenterAlertState ⚓︎enum(raised,unraised)unraised

Whether the presenter alert is currently visible to the presenter — BECAUSE the alert is toggled on by the moderator and confirmed off

questionsEnabled ⚓︎booleanfalse

Whether attendees may ask questions — BECAUSE questions are an optional interaction channel per event

questionsAllowAnonymous ⚓︎booleanfalse

Whether questions may be sent as “Anonymous” — BECAUSE events differ in how much question identity is revealed

questionsName ⚓︎enum(full,firstname,anonymous)full

How the attendee name appears on questions — BECAUSE the event controls the displayed question identity

questionsThrottling ⚓︎integer1

Maximum questions per user per time window — BECAUSE rate limiting prevents abuse of the question channel

questionsPrivate ⚓︎booleanfalse

Whether questions are hidden from other attendees and seen only by moderators — BECAUSE some events keep questions private to the moderation team

questionsModerator ⚓︎booleanfalse

Whether questions are moderated before becoming visible — BECAUSE organizers may require approval of questions

expireAuthTokenOnFirstUse ⚓︎booleantrue

Whether pre-generated authorization tokens expire after first use — BECAUSE events choose between one-time and reusable pre-generated tokens

sentimentSenderAnalysis ⚓︎booleanfalse

Whether lightweight client-side sentiment analysis is enabled — BECAUSE the event can check input at the source before sending

sentimentSenderAutoPrevent ⚓︎booleanfalse

Whether improper input is prevented from submission on the client — BECAUSE the event can block misconduct before it reaches the server

sentimentModeratorAnalysis ⚓︎booleanfalse

Whether full server-side sentiment analysis is enabled — BECAUSE the event can check input before it is stored

sentimentModeratorAutoAccept ⚓︎booleanfalse

Whether proper input is auto-accepted on the server — BECAUSE moderators can be relieved of approving positive input

sentimentModeratorAutoReject ⚓︎booleanfalse

Whether improper input is auto-rejected on the server — BECAUSE moderators can be relieved of rejecting negative input

RELATIONTARGETKINDARITYDescription
channels ⚓︎ENTITY: Channel ⚭Composition0..n

Language-specific content distributors of the event — BECAUSE an event delivers content through one or more logical channels

accessList ⚓︎ENTITY: User ⚭Composition0..n

Invited attendees identified by email — BECAUSE access is granted to an explicit list of users

messages ⚓︎ENTITY: Message ⚭Composition0..n

Messages written during the event — BECAUSE all chat, question, and support input belongs to the event

statistics ⚓︎ENTITY: EventStatistic ⚭Composition0..n

Periodic cumulative statistics snapshots — BECAUSE trend visualization requires periodic counts

userStatistics ⚓︎ENTITY: UserStatistic ⚭Composition0..n

Viewer statistics recorded for the users of the event — BECAUSE the statistics stay attributable to the event after their users are deleted and are dropped with it

availableQuestionTags ⚓︎ENTITY: QuestionTag ⚭Composition0..n

Tags available for use on questions — BECAUSE the event defines the vocabulary for tagging questions

activeAgendaPoint ⚓︎ENTITY: AgendaPoint ⚭Association0..1

The currently active agenda point — BECAUSE attendees see which phase of the event is current

agendaPoints ⚓︎ENTITY: AgendaPoint ⚭Composition0..n

All agenda points of the event — BECAUSE the event has an ordered agenda of phases

ENTITY: AgendaPoint ⚓︎

REQUIREMENTSREQUIREMENT: Tag Question Messages ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Moderate and Forward Messages ⚭
GROUPGROUP: Events ⚭

The textual description of a phase in an event — BECAUSE attendees and moderators track which part of the event is currently active.

ATTRIBUTETYPEDEFAULTDescription
agendaPointId ⚓︎key uuiduuid()

Unique identifier of the agenda point — BECAUSE it is referenced as a foreign key

text ⌘ ⚓︎string?

Description of the current phase of the event — BECAUSE the phase must be presented in human-readable form

orderPosition ⌘ ⚓︎integer?

Ordering position of the phase — BECAUSE agenda points have a defined sequence

RELATIONTARGETKINDARITYDescription
correspondingTags ⚓︎ENTITY: QuestionTag ⚭Association0..n

Question tags corresponding to this agenda point — BECAUSE questions can be associated with the agenda phase they relate to

ENTITY: Channel ⚓︎

REQUIREMENTSREQUIREMENT: Multiple Streaming Providers ⚭, REQUIREMENT: Live Provider Switching ⚭, REQUIREMENT: Channel Statistics ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Switch Streaming Provider ⚭
TERMSTERM: Channel ⚭
GROUPGROUP: Channels ⚭

A logical content delivery stream linking video streams to an event — BECAUSE an event groups its streams by language and resolution into channels.

ATTRIBUTETYPEDEFAULTDescription
channelId ⚓︎key uuiduuid()

Unique identifier of the channel — BECAUSE it is referenced as a foreign key

name ⌘ ⚓︎string?

Display name of the channel such as “Digital Townhall” — BECAUSE attendees choose between named channels

active ⚓︎booleanfalse

Whether the channel is the currently active one, derived to true for the first channel of an event (Initial Channel Becomes Active) — BECAUSE only one channel of an event is active at once (Single Active Channel)

default ⚓︎booleanfalse

Whether this channel is activated by default on entering an event — BECAUSE attendees need a defined initial channel

RELATIONTARGETKINDARITYDescription
resources ⚓︎ENTITY: Resource ⚭Composition1..n

Physical resources backing the channel — BECAUSE a channel is delivered by one or more provider resources

statistics ⚓︎ENTITY: ChannelStatistic ⚭Composition0..n

Periodic viewer statistics of the channel — BECAUSE organizers track viewers per channel over time

ENTITY: Resource ⚓︎

REQUIREMENTSREQUIREMENT: Multiple Streaming Providers ⚭, REQUIREMENT: Live Provider Switching ⚭, REQUIREMENT: Direct Resource Access URL ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Switch Streaming Provider ⚭
TERMSTERM: Resource ⚭, TERM: Streaming Provider ⚭
GROUPGROUP: Channels ⚭

A physical content delivery resource such as a provider stream or static website linked to a channel — BECAUSE a channel must map to concrete provider endpoints to be playable.

ATTRIBUTETYPEDEFAULTDescription
resourceId ⚓︎key uuiduuid()

Unique identifier of the resource — BECAUSE it is referenced as a foreign key and in the access URL

providerId ⌘ ⚓︎string?

Provider identifier from the event configuration file — BECAUSE a resource binds to a specific configured streaming provider

active ⚓︎booleanfalse

Whether this resource is the active resource of the channel, derived to true for the first resource of a channel (Initial Resource Becomes Active) — BECAUSE only one resource of a channel is active at once for provider switching (Single Active Resource per Channel)

RELATIONTARGETKINDARITYDescription
params ⚓︎ENTITY: ResourceProviderParam ⚭Composition0..n

Provider key-value parameters assigned to this resource — BECAUSE each provider needs configured parameters to address its stream

ENTITY: ResourceProviderParam ⚓︎

REQUIREMENTSREQUIREMENT: Multiple Streaming Providers ⚭
USE-CASESUSE-CASE: Switch Streaming Provider ⚭
TERMSTERM: Streaming Provider ⚭
GROUPGROUP: Channels ⚭

A key-value parameter belonging to exactly one resource and provider, defined in the event configuration file — BECAUSE provider endpoints are parameterized by values an administrator supplies.

ATTRIBUTETYPEDEFAULTDescription
resourceId ⚓︎key uuiduuid()

Identifier of the owning resource — BECAUSE the parameter belongs to exactly one resource

providerId ⌘ ⚓︎key string

Provider identifier from the configuration file — BECAUSE the parameter is scoped to one provider

key ⌘ ⚓︎key string

Parameter key defined in the configuration file — BECAUSE each provider parameter is identified by its key

value ⌘ ⚓︎string?

Value the administrator entered for the key — BECAUSE the concrete endpoint requires the supplied value

ENTITY: Role ⚓︎

REQUIREMENTSREQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Forward Inputs to Presenter ⚭, REQUIREMENT: Export Attendee Inputs ⚭
USE-CASESUSE-CASE: Authenticate via Email Token ⚭, USE-CASE: Publish, Start, and Finish Event ⚭, USE-CASE: Export Anonymized Event Data ⚭, USE-CASE: Administer Any Event ⚭
TERMSTERM: Role ⚭, TERM: Attendee ⚭, TERM: Manager ⚭, TERM: Moderator ⚭, TERM: Presenter ⚭, TERM: Administrator ⚭
GROUPGROUP: Users ⚭

A grant of rights to a user, who exists within a specific event or, as the holder of the Administrator role, permanently and outside any event — BECAUSE the application is role-based and rights are granted through roles.

ATTRIBUTETYPEDEFAULTDescription
roleId ⚓︎key uuiduuid()

Unique identifier of the role — BECAUSE it is referenced as a foreign key

type ⚓︎enum(Manager,Moderator,Presenter,Attendee,Administrator)Attendee

The role granted to the user, where Attendee is the plain audience membership and Administrator the permanent, event-independent role granted through the configuration only — BECAUSE each role carries a distinct set of rights

ENTITY: User ⚓︎

REQUIREMENTSREQUIREMENT: User Authentication ⚭, REQUIREMENT: Configurable Name Appearance ⚭, REQUIREMENT: Like Messages ⚭, REQUIREMENT: Personalized Event Access URL ⚭, REQUIREMENT: Import Registered Attendees ⚭
USE-CASESUSE-CASE: Authenticate via Email Token ⚭, USE-CASE: Create Event from Registration Import ⚭, USE-CASE: Chat During the Event ⚭, USE-CASE: Publish, Start, and Finish Event ⚭, USE-CASE: Administer Any Event ⚭
TERMSTERM: User ⚭, TERM: Access List ⚭
GROUPGROUP: Users ⚭

A helper entity identifying a person within an event for event-based logins and for the roles granted to them, or permanently and outside any event as the holder of the Administrator role — BECAUSE the system holds no permanent accounts except the administrator yet must identify attendees and role holders per event.

ATTRIBUTETYPEDEFAULTCLASSIFICATIONRETENTIONDescription
userId ⚓︎key uuiduuid()

Unique identifier of the user — BECAUSE it is referenced as a foreign key

email ⌘ ⚓︎string?Personaluntil event finish, until event deletion for a holder of the Manager role, permanently for the holder of the Administrator role

Concrete email address of the user — BECAUSE authorization tokens are sent to this address at login and roles are granted to it

firstname ⚓︎string""Personaluntil event finish

Optional first name of the user — BECAUSE it is displayed on the user’s chat and question messages

lastname ⚓︎string""Personaluntil event finish

Optional last name of the user — BECAUSE it is displayed on the user’s chat and question messages

RELATIONTARGETKINDARITYDescription
roles ⚓︎ENTITY: Role ⚭Composition0..n

Roles granted to the user within its event — BECAUSE rights are held by the identified user rather than by a bare email address

likes ⚓︎ENTITY: Message ⚭Association0..n

Messages the user marked as liked — BECAUSE likes are tracked per user until anonymization

sentMessages ⚓︎ENTITY: Message ⚭Association0..n

Messages the user has sent — BECAUSE authorship links a message to its sending user

statistics ⚓︎ENTITY: UserStatistic ⚭Aggregation0..n

Periodic statistics about the user — BECAUSE viewer information is captured per user over time

ENTITY: Message ⚓︎

REQUIREMENTSREQUIREMENT: Chat Messages ⚭, REQUIREMENT: Ask Questions ⚭, REQUIREMENT: Like Messages ⚭, REQUIREMENT: Reply to Chat Messages ⚭, REQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Forward Inputs to Presenter ⚭, REQUIREMENT: Answer Attendee Inputs ⚭, REQUIREMENT: Moderator-Authored Messages ⚭, REQUIREMENT: Edit and Delete Messages ⚭, REQUIREMENT: Deleted Message Placeholder ⚭, REQUIREMENT: Server-Side Sentiment Analysis ⚭, REQUIREMENT: Sort and Filter Messages ⚭, REQUIREMENT: Tag Question Messages ⚭, REQUIREMENT: Export Attendee Inputs ⚭
USE-CASESUSE-CASE: Ask a Question ⚭, USE-CASE: Chat During the Event ⚭, USE-CASE: Moderate and Forward Messages ⚭, USE-CASE: Moderate the Chat Conversation ⚭, USE-CASE: Present Forwarded Questions ⚭, USE-CASE: Export Anonymized Event Data ⚭
TERMSTERM: Message ⚭, TERM: Chat ⚭, TERM: Question ⚭, TERM: Support ⚭, TERM: Like ⚭, TERM: Sentiment Analysis ⚭
GROUPGROUP: Messages ⚭

A single chat, support, or question item tracked for attendees and moderators — BECAUSE all event interaction is represented uniformly as messages with language-specific texts.

ATTRIBUTETYPEDEFAULTCLASSIFICATIONRETENTIONDescription
messageId ⚓︎key uuiduuid()

Unique identifier of the message — BECAUSE it is the foreign key for the translated message texts

type ⚓︎enum(Chat,Support,Question)Chat

The kind of message — BECAUSE each type has a distinct lifecycle and visibility

timestamp ⚓︎datetimeDate.now()

Time the sender created the message — BECAUSE ordering and export require the creation time

timestampAnswered ⚓︎datetimeDate.now()

Time the message was answered — BECAUSE the presenter records when a question was answered

state ⚓︎enum(pending,accepted,rejected,forwarded,answered,suspended)pending

Moderation and processing state of the message — BECAUSE the message moves through a defined moderation and presentation lifecycle

originalLanguage ⚓︎string?

Language the sender originally wrote the message in — BECAUSE the difference between human-written and AI-translated text must always be visible

senderName ⚓︎string?Personaluntil event finish, then replaced by “Anonymous”

Display name shown to others for the sender — BECAUSE the visible name depends on event naming and anonymity options

presenterAnnotation ⚓︎string?

Hint a moderator attaches for the presenter on forwarding — BECAUSE the presenter benefits from routing guidance on a forwarded message

likes ⚓︎integer0

Computed number of likes conserved on event finish — BECAUSE the like total must survive removal of liker relations for GDPR

sentimentScore ⚓︎float?

Server-side sentiment score between -1 and 1 — BECAUSE the analysis result is stored for display and auto-moderation

edited ⚓︎enum(none,insignificant,significant,deleted)?

Whether and how the message was changed or deleted — BECAUSE edits must be marked for others and edits stop once forwarded

RELATIONTARGETKINDARITYDescription
sender ⚓︎ENTITY: User ⚭Association0..1

The authoring attendee of the message — BECAUSE a message has an author until the sender is removed on finish

liker ⚓︎ENTITY: User ⚭Association0..n

Attendees who liked the message — BECAUSE likes are tracked per liking user before anonymization

event ⚓︎ENTITY: Event ⚭Association1

The event the message belongs to — BECAUSE the event link must persist even after senders are deleted

replyTo ⚓︎ENTITY: Message ⚭Association0..1

The message this message replies to — BECAUSE chat replies and moderator answers chain messages together

predecessor ⚓︎ENTITY: Message ⚭Association0..1

The preceding message in a manual ordering — BECAUSE moderators sort forwarded messages for the presenter

questionTags ⚓︎ENTITY: QuestionTag ⚭Association0..n

Tags attached to a question message — BECAUSE questions can be tagged with zero or more tags for context

messageText ⚓︎ENTITY: MessageText ⚭Composition1..n

The message texts of this message — BECAUSE each message text can be translated to multiple languages

ENTITY: MessageText ⚓︎

REQUIREMENTSREQUIREMENT: In-Session Language Switching ⚭, REQUIREMENT: Export Attendee Inputs ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Chat During the Event ⚭, USE-CASE: Export Anonymized Event Data ⚭
TERMSTERM: Message ⚭
GROUPGROUP: Messages ⚭

A language-specific text of a message — BECAUSE a message is translated into multiple languages while retaining one original.

ATTRIBUTETYPEDEFAULTDescription
messageTextId ⚓︎key uuiduuid()

Unique identifier of the message text — BECAUSE it is referenced as a foreign key

language ⚓︎string?

Language the text is written in — BECAUSE each text variant is identified by its language

text ⚓︎string?

The message text in the stated language — BECAUSE the displayed content depends on the chosen language

ENTITY: QuestionTag ⚓︎

REQUIREMENTSREQUIREMENT: Tag Question Messages ⚭
USE-CASESUSE-CASE: Ask a Question ⚭, USE-CASE: Moderate and Forward Messages ⚭
GROUPGROUP: Events ⚭

A named tag attachable to question messages — BECAUSE questions are categorized by topic or addressed person for routing and grouping.

ATTRIBUTETYPEDEFAULTDescription
questionTagId ⚓︎key uuiduuid()

Unique identifier of the question tag — BECAUSE it is referenced as a foreign key

text ⚓︎unique string

Unique tag name — BECAUSE tags are identified and displayed by their name

moderatorOnly ⚓︎boolean?

Whether only a Moderator or Manager may use the tag — BECAUSE some tags are reserved for the moderation team

group ⚓︎string?

Logical group the tag belongs to such as a topic or person — BECAUSE tags are organized into meaningful groups

RELATIONTARGETKINDARITYDescription
messages ⚓︎ENTITY: Message ⚭Association0..n

The question messages the tag is attached to — BECAUSE a tag categorizes many questions and its removal has to detach it from all of them

agendaPoints ⚓︎ENTITY: AgendaPoint ⚭Association0..n

The agenda points the tag corresponds to — BECAUSE a tag can relate to several phases of the event

ENTITY: AuthorizationToken ⚓︎

REQUIREMENTSREQUIREMENT: User Authentication ⚭, REQUIREMENT: Automatic Event Access URL ⚭, REQUIREMENT: Import Registered Attendees ⚭, REQUIREMENT: Return Access URLs to Registration ⚭, REQUIREMENT: Debugging Statistics ⚭
USE-CASESUSE-CASE: Authenticate via Email Token ⚭, USE-CASE: Create Event from Registration Import ⚭, USE-CASE: Export Anonymized Event Data ⚭
TERMSTERM: Authorization Token ⚭
GROUPGROUP: Tokens ⚭

A one-time second factor proving an attendee controls the email address used as the first factor — BECAUSE email-verified access is the core mechanism limiting the audience.

ATTRIBUTEProperties & Description
token ⌘ ⚓︎
TYPEDEFAULTCONSTRAINTCLASSIFICATIONRETENTION
string?six digits as NNN-NNNConfidentialuntil validity expiry, at the latest until event finish
Description

The generated one-time token for the next login attempt — BECAUSE the attendee proves control of the email by returning this token

validUntil ⚓︎
TYPEDEFAULTCONSTRAINTCLASSIFICATIONRETENTION
datetimeDate.now() + 1d
Description

Expiry time of the token, unset for pre-generated tokens — BECAUSE ordinary tokens expire within minutes while pre-generated ones last until event end

state ⚓︎
TYPEDEFAULTCONSTRAINTCLASSIFICATIONRETENTION
enum(issued,sent,used)issued
Description

Lifecycle state of the token — BECAUSE debugging statistics and anonymized sums need the token state

RELATIONTARGETKINDARITYDescription
user ⚓︎ENTITY: User ⚭Association1

The user the token was issued for — BECAUSE a token authorizes exactly one user

event ⚓︎ENTITY: Event ⚭Association1

The event the token was issued for — BECAUSE a token grants access to exactly one event

ENTITY: SessionToken ⚓︎

REQUIREMENTSREQUIREMENT: User Authentication ⚭, REQUIREMENT: Limit Parallel Access ⚭, REQUIREMENT: General Event Statistics ⚭
USE-CASESUSE-CASE: Authenticate via Email Token ⚭, USE-CASE: Join Event and Watch Stream ⚭
TERMSTERM: Session Token ⚭
GROUPGROUP: Tokens ⚭

The result of a successful login of a user to an event — BECAUSE an active session must be tracked to enforce single concurrent access.

ATTRIBUTETYPEDEFAULTCLASSIFICATIONRETENTIONDescription
sessionId ⚓︎key uuiduuid()Confidentialuntil event finish

Unique identifier of the session — BECAUSE the active session of a user for an event must be addressable

issuedAt ⚓︎datetimeDate.now()

Time the user successfully entered the event — BECAUSE the session start time is recorded for tracking

RELATIONTARGETKINDARITYDescription
user ⚓︎ENTITY: User ⚭Association1

The user the session was issued for — BECAUSE a session belongs to exactly one user

event ⚓︎ENTITY: Event ⚭Association1

The event the session was issued for — BECAUSE a session grants access to exactly one event

ENTITY: EventStatistic ⚓︎

REQUIREMENTSREQUIREMENT: General Event Statistics ⚭, REQUIREMENT: Debugging Statistics ⚭, REQUIREMENT: Periodic Statistics Snapshots ⚭
USE-CASESUSE-CASE: Export Anonymized Event Data ⚭
GROUPGROUP: Statistics ⚭

A periodic cumulative snapshot of event-wide counts — BECAUSE trend visualization of audience size and authentication flow requires regular snapshots.

ATTRIBUTETYPEDEFAULTDescription
eventStatisticId ⚓︎key uuiduuid()

Unique identifier of the event statistic — BECAUSE it is referenced as a foreign key

timestamp ⚓︎datetimeDate.now()

Time the snapshot was created — BECAUSE statistics are plotted over time

numberOfIssuedAuthTokens ⌘ ⚓︎integer?

Count of issued authorization tokens at the timestamp — BECAUSE debugging statistics track issued tokens

numberOfSentAuthTokens ⌘ ⚓︎integer?

Count of sent authorization tokens at the timestamp — BECAUSE debugging statistics track sent tokens

numberOfUsedAuthTokens ⌘ ⚓︎integer?

Count of used authorization tokens at the timestamp — BECAUSE debugging statistics track used tokens

numberOfSessionTokens ⌘ ⚓︎integer?

Count of session tokens at the timestamp — BECAUSE logged-in users are derived from session tokens

numberOfConnections ⌘ ⚓︎integer?

Count of active MQTT connections at the timestamp — BECAUSE active viewers differ from sessions once an attendee leaves

ENTITY: ChannelStatistic ⚓︎

REQUIREMENTSREQUIREMENT: Channel Statistics ⚭, REQUIREMENT: Periodic Statistics Snapshots ⚭
USE-CASESUSE-CASE: Export Anonymized Event Data ⚭
GROUPGROUP: Statistics ⚭

A periodic count of viewers for a channel — BECAUSE organizers need per-channel popularity over time.

ATTRIBUTETYPEDEFAULTDescription
channelStatisticId ⚓︎key uuiduuid()

Unique identifier of the channel statistic — BECAUSE it is referenced as a foreign key

timestamp ⚓︎datetimeDate.now()

Time the snapshot was created — BECAUSE channel statistics are plotted over time

numberOfViewers ⌘ ⚓︎integer?

Count of viewers of the channel at the timestamp — BECAUSE the per-channel viewer count is the tracked metric

ENTITY: UserStatistic ⚓︎

REQUIREMENTSREQUIREMENT: User Statistics ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Export Anonymized Event Data ⚭
GROUPGROUP: Statistics ⚭

Tracked viewer information about a user — BECAUSE audience composition informs reporting and default localization.

ATTRIBUTETYPEDEFAULTCLASSIFICATIONRETENTIONDescription
userStatisticId ⚓︎key uuiduuid()

Unique identifier of the user statistic — BECAUSE it is referenced as a foreign key

timestamp ⚓︎datetimeDate.now()

Time the snapshot was created — BECAUSE user statistics are recorded over time

country ⌘ ⚓︎string?Personallinked to the user until event finish, retained unlinked afterwards

ISO country code from GeoIP tracking — BECAUSE country selects the default application language on first use

browserType ⌘ ⚓︎string?Personallinked to the user until event finish, retained unlinked afterwards

Type of browser used — BECAUSE browser distribution informs compatibility decisions

deviceType ⌘ ⚓︎string?Personallinked to the user until event finish, retained unlinked afterwards

Type of device used — BECAUSE device distribution informs responsive design priorities

viewportWidth ⌘ ⚓︎integer?

Width in pixels of the browser viewport — BECAUSE viewport sizing informs layout decisions

viewportHeight ⌘ ⚓︎integer?

Height in pixels of the browser viewport — BECAUSE viewport sizing informs layout decisions

RELATIONTARGETKINDARITYDescription
event ⚓︎ENTITY: Event ⚭Association1

The event the statistic was recorded in — BECAUSE the statistic must stay selectable per event once its user reference is dropped

DATA: State Model (SM) ⚓︎

LIFECYCLE: Event ⚓︎

ENTITYENTITY: Event ⚭
STATEINITIALFINALDescription
Planning ⚓︎true

The event is created and configured but not visible to attendees

Published ⚓︎

The event is visible to attendees but not yet started

Running ⚓︎

The event is live and attendees can attend and interact

Finished ⚓︎true

The event has ended, access is closed, and data is anonymized

TRANSITIONProperties & Description
publish ⚓︎
FROMTOACTOR
STATE: Planning ⚭STATE: Published ⚭ROLE: Manager ⚭
GUARDRULESUSE-CASES
The event is fully configured.SCENARIO: Publish, Start, and Finish ⚭
Description

The event becomes visible to invited attendees

start ⚓︎
FROMTOACTOR
STATE: Published ⚭STATE: Running ⚭ROLE: Manager ⚭
GUARDRULESUSE-CASES
SCENARIO: Publish, Start, and Finish ⚭
Description

The live stream and interaction channels open for attendees

start ⚓︎
FROMTOACTOR
STATE: Planning ⚭STATE: Running ⚭ROLE: Manager ⚭
GUARDRULESUSE-CASES
SCENARIO: Start Without Publishing ⚭
Description

The event goes live directly from planning, without ever having been visible beforehand

finish ⚓︎
FROMTOACTOR
STATE: Running ⚭STATE: Finished ⚭ROLE: Manager ⚭
GUARDRULESUSE-CASES
RULE: Anonymization on Event Finish ⚭SCENARIO: Publish, Start, and Finish ⚭
Description

The anonymization procedure runs and access is closed

LIFECYCLE: Message ⚓︎

ENTITYENTITY: Message ⚭
STATEINITIALFINALDescription
Pending ⚓︎true

The attendee has submitted the message and it awaits moderation

Accepted ⚓︎true

The message is approved and visible to the audience if configured

Rejected ⚓︎true

The message is declined and will be deleted entirely on event finish

Forwarded ⚓︎

The accepted message is handed to the presenter as a work item

Answered ⚓︎true

The presenter has processed and answered the message in the live event

Suspended ⚓︎true

The presenter will not process the message in the live event

TRANSITIONProperties & Description
accept ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Accepted ⚭ROLE: Moderator ⚭
GUARDRULESUSE-CASES
RULE: Moderation Determines Initial Visibility ⚭SCENARIO: Approve and Forward Question ⚭
Description

The message becomes visible to the audience

accept ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Accepted ⚭System
GUARDRULESUSE-CASES
The server-side sentiment analysis scores the message at or above the threshold and auto-accept is enabled.RULE: Moderation Determines Initial Visibility ⚭, RULE: Sentiment Auto-Decision Threshold ⚭SCENARIO: Auto-Accepted by Sentiment ⚭
Description

The message becomes visible to the audience without a moderator decision

accept ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Accepted ⚭System
GUARDRULESUSE-CASES
The event does not moderate messages of this type.RULE: Moderation Determines Initial Visibility ⚭SCENARIO: Post a Chat Message ⚭, SCENARIO: Reply to a Chat Message ⚭
Description

The message becomes visible to the audience at once, right after its creation

accept ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Accepted ⚭System
GUARDRULESUSE-CASES
The message is authored by a moderator.RULE: Moderator Messages Auto-Accepted ⚭SCENARIO: Answer an Attendee Directly ⚭, SCENARIO: Seed the Conversation as Moderator ⚭
Description

The moderator-authored message becomes visible at once, right after its creation

reject ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Rejected ⚭ROLE: Moderator ⚭
GUARDRULESUSE-CASES
RULE: Moderation Determines Initial Visibility ⚭SCENARIO: Reject Improper Message ⚭
Description

The message is hidden and marked for deletion

reject ⚓︎
FROMTOACTOR
STATE: Pending ⚭STATE: Rejected ⚭System
GUARDRULESUSE-CASES
The server-side sentiment analysis scores the message below the threshold and auto-reject is enabled.RULE: Moderation Determines Initial Visibility ⚭, RULE: Sentiment Auto-Decision Threshold ⚭SCENARIO: Auto-Rejected by Sentiment ⚭
Description

The message is hidden and marked for deletion without a moderator decision

resubmit ⚓︎
FROMTOACTOR
STATE: Accepted ⚭STATE: Pending ⚭ROLE: Attendee ⚭
GUARDRULESUSE-CASES
The event moderates messages of this type.RULE: Moderation Determines Initial Visibility ⚭, RULE: Forwarded Messages Are Immutable ⚭SCENARIO: Edit an Own Message ⚭
Description

The edited message is hidden from the audience again until it passes the moderation anew

forward ⚓︎
FROMTOACTOR
STATE: Accepted ⚭STATE: Forwarded ⚭ROLE: Moderator ⚭
GUARDRULESUSE-CASES
The message is a question.RULE: State Set Depends on Message Type ⚭, RULE: Forwarded Messages Are Immutable ⚭SCENARIO: Approve and Forward Question ⚭
Description

The message enters the presenter’s work basket and becomes immutable

answer ⚓︎
FROMTOACTOR
STATE: Forwarded ⚭STATE: Answered ⚭ROLE: Presenter ⚭, ROLE: Moderator ⚭
GUARDRULESUSE-CASES
SCENARIO: Answer Forwarded Question ⚭, SCENARIO: Settle a Question for the Presenter ⚭
Description

The answered timestamp is recorded

suspend ⚓︎
FROMTOACTOR
STATE: Forwarded ⚭STATE: Suspended ⚭ROLE: Presenter ⚭, ROLE: Moderator ⚭
GUARDRULESUSE-CASES
SCENARIO: Suspend a Forwarded Question ⚭, SCENARIO: Settle a Question for the Presenter ⚭
Description

The message is set aside for the live event

LIFECYCLE: AuthorizationToken ⚓︎

ENTITYENTITY: AuthorizationToken ⚭
STATEINITIALFINALDescription
Issued ⚓︎true

The token has been generated, typically at event creation

Sent ⚓︎

The token has been delivered to the user by email

Used ⚓︎true

The token has been consumed in a login attempt

TRANSITIONProperties & Description
send ⚓︎
FROMTOACTOR
STATE: Issued ⚭STATE: Sent ⚭ROLE: Attendee ⚭
GUARDRULESUSE-CASES
The email of the attendee is on the access list or matches the access pattern.RULE: Access Requires List or Pattern Match ⚭SCENARIO: Login with Emailed Token ⚭
Description

The token is emailed to the attendee requesting a login challenge

consume ⚓︎
FROMTOACTOR
STATE: Sent ⚭STATE: Used ⚭ROLE: Attendee ⚭
GUARDRULESUSE-CASES
The token has not expired.RULE: Token Format and Validity ⚭, RULE: Single Active Session per Event ⚭SCENARIO: Login with Emailed Token ⚭
Description

The token is marked spent by a successful or unsuccessful login attempt

consume ⚓︎
FROMTOACTOR
STATE: Issued ⚭STATE: Used ⚭ROLE: Attendee ⚭
GUARDRULESUSE-CASES
The event allows automatic-access URLs.RULE: Token Format and Validity ⚭SCENARIO: Automatic Token in URL ⚭
Description

The pre-generated token is marked spent by the use of an automatic-access URL carrying it

LIFECYCLE: UserStatistic ⚓︎

ENTITYENTITY: UserStatistic ⚭
STATEINITIALFINALDescription
Linked ⚓︎true

The statistic is attributed to the user it was recorded for

Unlinked ⚓︎true

The statistic is retained without any reference to a user

TRANSITIONProperties & Description

DATA: Authorization Model (AM) ⚓︎

ROLEAttendee ROLEModerator ROLEPresenter ROLEManager ROLEAdministrator ENTITYEvent ENTITYAgendaPoint ENTITYChannel ENTITYResource ENTITYResourceProviderParam ENTITYRole ENTITYUser ENTITYMessage ENTITYMessageText ENTITYQuestionTag ENTITYAuthorizationToken ENTITYSessionToken ENTITYEventStatistic ENTITYChannelStatistic ENTITYUserStatisticEnter the EventProve the Email AddressWatch the Active ChannelPlay the Active ResourceFollow the AgendaSend MessagesRead Visible MessagesTrack Own MessagesCorrect Own MessagesLike MessagesUse Public TagsEnter the EventSteer the PresenterReview All MessagesDecide Pending MessagesForward QuestionsProcess Forwarded QuestionsAuthor MessagesUse All TagsEnter the EventConfirm the AlertRead Forwarded QuestionsProcess Forwarded QuestionsConfigure the EventRun the EventDelete the EventLay Out the ChannelsSwitch the ResourceGrant Event RolesMaintain the Access ListIssue Access TokensCurate the TagsCurate the AgendaExport the MessagesInspect the Event StatisticsInspect the Channel StatisticsInspect the Viewer StatisticsAdminister Every EventAdminister the AgendaAdminister the ChannelsAdminister the ResourcesAdminister the Provider ParametersAdminister the RolesAdminister the UsersAdminister the MessagesAdminister the Message TextsAdminister the TagsAdminister the Authorization TokensAdminister the SessionsAdminister the Event StatisticsAdminister the Channel StatisticsAdminister the Viewer Statistics
PERMISSIONProperties & Description
Enter the Event ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Event ⚭
OPERATIONSRead
STATESSTATE: Published ⚭, STATE: Running ⚭
CONDITIONThe email of the attendee is on the access list or matches the access email pattern of the event, or the event allows anonymous access.
RULESRULE: Access Requires List or Pattern Match ⚭, RULE: No Permanent User Accounts ⚭
USE-CASESSCENARIO: Join via Individual URL ⚭, SCENARIO: Email Not Authorized ⚭
Description

The attendee sees the event with its login and interaction information, but none of its configuration

Prove the Email Address ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: AuthorizationToken ⚭
OPERATIONSTRANSITION: send ⚭, TRANSITION: consume ⚭, TRANSITION: consume ⚭
CONDITIONThe token was issued for the email address of the attendee.
RULESRULE: Token Format and Validity ⚭, RULE: Single Active Session per Event ⚭
USE-CASESUSE-CASE: Authenticate via Email Token ⚭
Description

The attendee requests, receives, and returns the one-time token of their own login challenge

Watch the Active Channel ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Channel ⚭
OPERATIONSRead
CONDITIONThe channel belongs to the event the attendee entered.
RULESRULE: Single Active Channel ⚭
USE-CASESSCENARIO: Join via Individual URL ⚭, SCENARIO: Live Failover ⚭
Description

The attendee sees the channels of the event and follows the active one

Play the Active Resource ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Resource ⚭
OPERATIONSRead
CONDITIONThe resource backs a channel of the event the attendee entered.
RULESRULE: Single Active Resource per Channel ⚭
USE-CASESSCENARIO: Join via Individual URL ⚭, SCENARIO: Return via Direct Resource URL ⚭
Description

The attendee plays the active resource, or the resource named by the event URL, without seeing its provider parameters

Follow the Agenda ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: AgendaPoint ⚭
OPERATIONSRead
CONDITIONThe agenda point belongs to the event the attendee entered.
USE-CASESSCENARIO: Advance the Agenda ⚭
Description

The attendee sees the agenda of the event and which agenda point is currently active

Send Messages ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Message ⚭
OPERATIONSCreate
CONDITIONThe event is running, the type of the message is enabled for the event, and the throttling limit is not exceeded.
RULESRULE: Moderation Determines Initial Visibility ⚭, RULE: State Set Depends on Message Type ⚭
USE-CASESSCENARIO: Submit Moderated Question ⚭, SCENARIO: Throttled Submission ⚭, SCENARIO: Post a Chat Message ⚭, SCENARIO: Reply to a Chat Message ⚭
Description

The attendee sends chat, question, and support messages of their own, which await the moderation decision or are accepted at once, as the moderation setting of the event determines

Read Visible Messages ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Message ⚭
OPERATIONSRead
STATESSTATE: Accepted ⚭, STATE: Forwarded ⚭, STATE: Answered ⚭, STATE: Suspended ⚭
CONDITIONThe message is a chat, a question the event does not keep private, or a support message of the attendee’s own conversation.
RULESRULE: Moderation Determines Initial Visibility ⚭
USE-CASESSCENARIO: Post a Chat Message ⚭, SCENARIO: Show Own Contributions Only ⚭, SCENARIO: Pending Message Stays Private ⚭
Description

The attendee reads the messages which passed the moderation, with their texts and like counts, under the sender name the event configures

Track Own Messages ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Message ⚭
OPERATIONSRead
STATESSTATE: Pending ⚭
CONDITIONThe attendee is the sender of the message.
RULESRULE: Moderation Determines Initial Visibility ⚭
USE-CASESSCENARIO: Submit Moderated Question ⚭, SCENARIO: Pending Message Stays Private ⚭
Description

The attendee sees their own messages while they still await the moderation decision

Correct Own Messages ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Message ⚭
OPERATIONSUpdate, Delete, TRANSITION: resubmit ⚭
STATESSTATE: Pending ⚭, STATE: Accepted ⚭
CONDITIONThe attendee is the sender of the message.
RULESRULE: Forwarded Messages Are Immutable ⚭, RULE: Moderation Determines Initial Visibility ⚭
USE-CASESSCENARIO: Edit an Own Message ⚭, SCENARIO: Delete an Own Message ⚭, SCENARIO: Forwarded Question Locked ⚭
Description

The attendee edits or deletes their own chat messages and questions until a question is forwarded, where an edit is marked and resubmitted to the moderation as the event requires

Like Messages ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: Message ⚭
OPERATIONSUpdate
STATESSTATE: Accepted ⚭, STATE: Forwarded ⚭, STATE: Answered ⚭, STATE: Suspended ⚭
CONDITIONThe update is confined to adding or revoking the attendee’s own like on a chat or question of another attendee.
RULESRULE: Likes Conserved as Count on Finish ⚭
USE-CASESSCENARIO: Like a Message ⚭
Description

The attendee likes the visible messages of others and revokes the like again until the event finishes

Use Public Tags ⚓︎
Diagram
Properties
ROLEROLE: Attendee ⚭
ENTITYENTITY: QuestionTag ⚭
OPERATIONSRead
CONDITIONThe tag is not reserved for moderators.
USE-CASESSCENARIO: Submit Moderated Question ⚭
Description

The attendee sees the available tags of the event and attaches them to their own questions

Enter the Event ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Event ⚭
OPERATIONSRead
STATESSTATE: Planning ⚭, STATE: Published ⚭, STATE: Running ⚭
CONDITIONThe moderator holds the Moderator role of the event.
RULESRULE: Anonymization on Event Finish ⚭
USE-CASESUSE-CASE: Moderate and Forward Messages ⚭, USE-CASE: Moderate the Chat Conversation ⚭, USE-CASE: Steer the Presenter ⚭, SCENARIO: Access Lost After Finish ⚭
Description

The moderator sees the event with its interaction settings, also before it is published for the rehearsal, but loses the access when the event finishes, as the anonymization deletes the Moderator roles

Steer the Presenter ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Event ⚭
OPERATIONSUpdate
STATESSTATE: Running ⚭
CONDITIONThe update is confined to the presenter alert and the active agenda point of the event.
USE-CASESUSE-CASE: Steer the Presenter ⚭
Description

The moderator raises the presenter alert and advances the active agenda point, but changes no other setting of the event

Review All Messages ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSRead
CONDITIONThe message belongs to the event the moderator holds the Moderator role of.
USE-CASESSCENARIO: Approve and Forward Question ⚭, SCENARIO: Answer an Attendee Directly ⚭
Description

The moderator reads every message of the event in every state, with its sender, sentiment score, and like count

Decide Pending Messages ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSTRANSITION: accept ⚭, TRANSITION: reject ⚭
RULESRULE: Moderation Determines Initial Visibility ⚭, RULE: Sentiment Auto-Decision Threshold ⚭
USE-CASESSCENARIO: Approve and Forward Question ⚭, SCENARIO: Reject Improper Message ⚭
Description

The moderator accepts or rejects the pending chats and questions, where the server-side sentiment analysis decides in their place if the event so configures

Forward Questions ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSTRANSITION: forward ⚭, Update
STATESSTATE: Accepted ⚭, STATE: Forwarded ⚭
CONDITIONThe message is a question, and the update is confined to the presenter annotation, the ordering, and the tags of the message.
RULESRULE: State Set Depends on Message Type ⚭, RULE: Forwarded Messages Are Immutable ⚭
USE-CASESSCENARIO: Approve and Forward Question ⚭
Description

The moderator forwards accepted questions to the presenter in a chosen order, attaching hints and tags, while the text of the question stays untouched

Process Forwarded Questions ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSTRANSITION: answer ⚭, TRANSITION: suspend ⚭
USE-CASESSCENARIO: Settle a Question for the Presenter ⚭
Description

The moderator marks a forwarded question answered or suspended on behalf of the presenter

Author Messages ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSCreate
CONDITIONThe event is running.
RULESRULE: Moderator Messages Auto-Accepted ⚭
USE-CASESSCENARIO: Answer an Attendee Directly ⚭, SCENARIO: Seed the Conversation as Moderator ⚭
Description

The moderator answers attendees publicly or privately and seeds the conversation, where the messages are accepted at once upon creation under the sender name “Moderator” unless overridden

Use All Tags ⚓︎
Diagram
Properties
ROLEROLE: Moderator ⚭
ENTITYENTITY: QuestionTag ⚭
OPERATIONSRead
USE-CASESSCENARIO: Approve and Forward Question ⚭
Description

The moderator uses every tag of the event on questions, including the ones reserved for moderators

Enter the Event ⚓︎
Diagram
Properties
ROLEROLE: Presenter ⚭
ENTITYENTITY: Event ⚭
OPERATIONSRead
STATESSTATE: Planning ⚭, STATE: Published ⚭, STATE: Running ⚭
CONDITIONThe presenter holds the Presenter role of the event.
USE-CASESUSE-CASE: Present Forwarded Questions ⚭
Description

The presenter sees the event with its agenda and presenter alert, also before it is published for the rehearsal

Confirm the Alert ⚓︎
Diagram
Properties
ROLEROLE: Presenter ⚭
ENTITYENTITY: Event ⚭
OPERATIONSUpdate
STATESSTATE: Running ⚭
CONDITIONThe update is confined to unraising the presenter alert of the event.
USE-CASESSCENARIO: Confirm a Raised Alert ⚭
Description

The presenter confirms a raised alert, which takes it off the stage view again

Read Forwarded Questions ⚓︎
Diagram
Properties
ROLEROLE: Presenter ⚭
ENTITYENTITY: Message ⚭
OPERATIONSRead
STATESSTATE: Forwarded ⚭, STATE: Answered ⚭, STATE: Suspended ⚭
RULESRULE: Forwarded Messages Are Immutable ⚭
USE-CASESSCENARIO: Answer Forwarded Question ⚭, SCENARIO: Forwarded Questions Only ⚭
Description

The presenter sees the forwarded questions in their order with the moderator hints, and never the pending, accepted, or rejected messages

Process Forwarded Questions ⚓︎
Diagram
Properties
ROLEROLE: Presenter ⚭
ENTITYENTITY: Message ⚭
OPERATIONSTRANSITION: answer ⚭, TRANSITION: suspend ⚭
USE-CASESSCENARIO: Answer Forwarded Question ⚭, SCENARIO: Suspend a Forwarded Question ⚭
Description

The presenter marks a forwarded question answered once addressed on stage, or suspended when it will not be addressed

Configure the Event ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Event ⚭
OPERATIONSRead, Update
CONDITIONThe manager holds the Manager role of the event.
RULESRULE: Manager Retained for Export ⚭
USE-CASESUSE-CASE: Configure the Event ⚭, SCENARIO: Export After Finish ⚭
Description

The manager reads and edits every setting of the event in every state, keeping the access after the event finishes for the export

Run the Event ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Event ⚭
OPERATIONSTRANSITION: publish ⚭, TRANSITION: start ⚭, TRANSITION: start ⚭, TRANSITION: finish ⚭
RULESRULE: Anonymization on Event Finish ⚭
USE-CASESUSE-CASE: Publish, Start, and Finish Event ⚭
Description

The manager publishes, starts, and finishes the event, where finishing triggers the anonymization

Delete the Event ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Event ⚭
OPERATIONSDelete
CONDITIONThe manager holds the Manager role of the event.
RULESRULE: Manager Retained for Export ⚭, RULE: No Permanent User Accounts ⚭
USE-CASESSCENARIO: Delete the Event ⚭
Description

The manager deletes the event entirely, which deletes the remaining Manager roles with it

Lay Out the Channels ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Channel ⚭
OPERATIONSCreate, Read, Update, Delete
CONDITIONThe channel belongs to the event the manager holds the Manager role of.
RULESRULE: Single Active Channel ⚭
USE-CASESSCENARIO: Lay Out the Channels ⚭
Description

The manager defines the channels of the event and switches the active one

Switch the Resource ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Resource ⚭
OPERATIONSRead, Update
CONDITIONThe update is confined to activating a resource of a channel of the event.
RULESRULE: Single Active Resource per Channel ⚭
USE-CASESSCENARIO: Lay Out the Channels ⚭, SCENARIO: Live Failover ⚭
Description

The manager switches the active resource of a channel to a fallback streaming provider, without changing the provider parameters

Grant Event Roles ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Role ⚭
OPERATIONSCreate, Read, Delete
CONDITIONThe role is held by a user of the event the manager holds the Manager role of.
RULESRULE: No Permanent User Accounts ⚭, RULE: Anonymization on Event Finish ⚭
USE-CASESSCENARIO: Grant the Event Roles ⚭
Description

The manager grants and revokes the Attendee, Manager, Moderator, and Presenter roles of the users of the event, identified by email

Maintain the Access List ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: User ⚭
OPERATIONSCreate, Read, Update, Delete
CONDITIONThe user is on the access list of the event the manager holds the Manager role of.
RULESRULE: Access Requires List or Pattern Match ⚭, RULE: No Permanent User Accounts ⚭
USE-CASESSCENARIO: Maintain the Access List ⚭, SCENARIO: Import and Return URLs ⚭
Description

The manager invites attendees by email, individually or by importing the sheet of the Event Registration System, and removes them again, where a removed user without a role ceases to exist

Issue Access Tokens ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: AuthorizationToken ⚭
OPERATIONSCreate, Read
STATESSTATE: Issued ⚭
CONDITIONThe token belongs to the event the manager holds the Manager role of.
RULESRULE: Token Format and Validity ⚭
USE-CASESSCENARIO: Import and Return URLs ⚭
Description

The manager pre-generates the tokens of the imported attendees and exports their personal access URLs, seeing the tokens in state issued only

Curate the Tags ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: QuestionTag ⚭
OPERATIONSCreate, Read, Update, Delete
CONDITIONThe tag belongs to the event the manager holds the Manager role of.
USE-CASESSCENARIO: Curate the Tags ⚭
Description

The manager defines the tag vocabulary of the event, including the tags reserved for moderators

Curate the Agenda ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: AgendaPoint ⚭
OPERATIONSCreate, Read, Update, Delete
CONDITIONThe agenda point belongs to the event the manager holds the Manager role of.
USE-CASESSCENARIO: Curate the Agenda ⚭
Description

The manager defines the ordered agenda of the event and the tags corresponding to its points

Export the Messages ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: Message ⚭
OPERATIONSRead
CONDITIONThe message belongs to the event the manager holds the Manager role of.
RULESRULE: Likes Conserved as Count on Finish ⚭, RULE: Manager Retained for Export ⚭
USE-CASESSCENARIO: Export After Finish ⚭
Description

The manager reads every message of the event with its texts, timestamps, state, and like count, and exports them after the event has finished

Inspect the Event Statistics ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: EventStatistic ⚭
OPERATIONSRead
CONDITIONThe statistic belongs to the event the manager holds the Manager role of.
USE-CASESSCENARIO: Inspect the Event Statistics ⚭
Description

The manager inspects the curve of logged-in attendees and the login challenge counts over time

Inspect the Channel Statistics ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: ChannelStatistic ⚭
OPERATIONSRead
CONDITIONThe statistic belongs to a channel of the event the manager holds the Manager role of.
USE-CASESSCENARIO: Inspect the Event Statistics ⚭
Description

The manager inspects the number of viewers per channel over time

Inspect the Viewer Statistics ⚓︎
Diagram
Properties
ROLEROLE: Manager ⚭
ENTITYENTITY: UserStatistic ⚭
OPERATIONSRead
CONDITIONThe statistic belongs to a user of the event the manager holds the Manager role of.
USE-CASESSCENARIO: Inspect the Event Statistics ⚭
Description

The manager inspects the audience composition by country, browser, device, and viewport

Administer Every Event ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: Event ⚭
OPERATIONSCreate, Read, Update, Delete, TRANSITION: publish ⚭, TRANSITION: start ⚭, TRANSITION: start ⚭, TRANSITION: finish ⚭
RULESRULE: Administrator Bypasses the Access List ⚭, RULE: Anonymization on Event Finish ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭, SCENARIO: Reach an Event via the Overview ⚭
Description

The administrator provisions the events through the configuration and lists, enters, configures, runs, and deletes every event in every state through the user interface, without any access list entry

Administer the Agenda ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: AgendaPoint ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator curates the agenda of every event and advances its active agenda point

Administer the Channels ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: Channel ⚭
OPERATIONSCreate, Read, Update, Delete
RULESRULE: Single Active Channel ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator provisions the initial channels through the configuration and lays out the channels of every event, including the active one

Administer the Resources ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: Resource ⚭
OPERATIONSCreate, Read, Update, Delete
RULESRULE: Single Active Resource per Channel ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator binds the resources of every channel to the configured streaming providers and switches the active resource

Administer the Provider Parameters ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: ResourceProviderParam ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator supplies and changes the key-value parameters each streaming provider needs to address its stream

Administer the Roles ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: Role ⚭
OPERATIONSCreate, Read, Delete
CONDITIONThe role is not an Administrator role, which the configuration alone grants and revokes.
RULESRULE: Administrator Bootstrapped by Configuration ⚭, RULE: Manager Retained for Export ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator grants the initial Manager role of a provisioned event through the configuration and grants and revokes every Attendee, Manager, Moderator, and Presenter role of every event

Administer the Users ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: User ⚭
OPERATIONSCreate, Read, Update, Delete
RULESRULE: Access Requires List or Pattern Match ⚭, RULE: No Permanent User Accounts ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator maintains the access list and the users of every event, personal data included

Administer the Messages ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: Message ⚭
OPERATIONSCreate, Read, Update, Delete, TRANSITION: accept ⚭, TRANSITION: reject ⚭, TRANSITION: forward ⚭, TRANSITION: answer ⚭, TRANSITION: suspend ⚭, TRANSITION: resubmit ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator reads, moderates, forwards, settles, edits, and deletes every message of every event in every state

Administer the Message Texts ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: MessageText ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator reads and corrects the language-specific texts of every message

Administer the Tags ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: QuestionTag ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator curates the tag vocabulary of every event, including the tags reserved for moderators

Administer the Authorization Tokens ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: AuthorizationToken ⚭
OPERATIONSCreate, Read, Update, Delete, TRANSITION: send ⚭, TRANSITION: consume ⚭, TRANSITION: consume ⚭
RULESRULE: Administrator Bypasses the Access List ⚭, RULE: Token Format and Validity ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator passes the login challenge of the configured administrator email address without any access list check, and issues, inspects, and revokes the tokens of every event

Administer the Sessions ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: SessionToken ⚭
OPERATIONSCreate, Read, Update, Delete
RULESRULE: Single Active Session per Event ⚭
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator inspects and terminates the sessions of every event

Administer the Event Statistics ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: EventStatistic ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator inspects and prunes the event statistics of every event

Administer the Channel Statistics ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: ChannelStatistic ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator inspects and prunes the channel statistics of every event

Administer the Viewer Statistics ⚓︎
Diagram
Properties
ROLEROLE: Administrator ⚭
ENTITYENTITY: UserStatistic ⚭
OPERATIONSCreate, Read, Update, Delete
USE-CASESUSE-CASE: Administer Any Event ⚭
Description

The administrator inspects and prunes the viewer statistics of every event

APIS: Interface Model (IM) ⚓︎

INTERFACEProperties & Description
Server Command Line ⚓︎
Diagram
KINDLOCATIONCONSUMERS
CLIbroadcast-serverPERSONA: Sven ⚭
Description

The command-line program starting the server process of the service layer, which resolves its runtime parameters from the layered configuration of built-in defaults, an optional YAML configuration file, BROADCAST_* environment variables, and the command-line options (in increasing precedence) — BECAUSE the administrator and the deployment automation have to start the very same server with different parameters per environment without changing any file.

APIS: Interface Datatypes (ID) ⚓︎

TYPE: LogLevel ⚓︎

INTERFACESINTERFACE: Server Command Line ⚭
BASEenum(error,warning,info,debug)

The verbosity level of the server log, from errors only up to debugging details — BECAUSE the amount of log output has to be tuned per environment.

TYPE: Configuration ⚓︎

INTERFACESINTERFACE: Server Command Line ⚭

The structure of the YAML configuration file, whose keys are also the surface of the recognized BROADCAST_* environment variables (BROADCAST_ADMIN_USERNAME maps onto adminUsername) and of the corresponding command-line options, where an unrecognized key is a fatal startup error — BECAUSE one schema has to define all three configuration layers consistently.

FIELDTYPEDEFAULTCONSTRAINTDescription
adminUsername ⚓︎stringnon-empty

The user name of the administrator account — BECAUSE the administrator has to be able to log in without any event-specific token

adminPassword ⚓︎stringnon-empty

The password of the administrator account — BECAUSE the administrator account has to be protected

mqttUrl ⚓︎stringCONSTANT: DEFAULT_MQTT_URL ⚭

The URL of the MQTT broker the server connects to, including the credentials and the topic prefix — BECAUSE the server exchanges all live data through the broker

dbUrl ⚓︎stringCONSTANT: DEFAULT_DB_URL ⚭

The URL of the PostgreSQL database the server persists into — BECAUSE the authoritative state has to be stored in the database tier

directory ⚓︎stringCONSTANT: DEFAULT_DIRECTORY ⚭

The directory of the static client content the server delivers — BECAUSE the client bundle is distributed alongside the server

logLevel ⚓︎TYPE: LogLevel ⚭info

The verbosity level of the server log — BECAUSE the amount of log output has to be tuned per environment

workers ⚓︎integer11..n

The number of worker processes the primary process pre-forks — BECAUSE the load-balanced traffic of the broker has to be spread over several processes

CONSTANTTYPEVALUEDescription
ENV_PREFIX ⚓︎stringBROADCAST_

The prefix of all environment variables overriding configuration parameters, where a double underscore separates the nesting path segments and a single underscore the words of one camel-cased segment — BECAUSE the server has to ignore the unrelated variables of the ambient environment

DEFAULT_MQTT_URL ⚓︎stringwss://example:example@127.0.0.1:1883/pr/api/server/?topic=broadcast

The built-in default of the MQTT broker URL — BECAUSE the server has to start against a local broker without any configuration

DEFAULT_DB_URL ⚓︎stringpostgres://127.0.0.1:5432/broadcast

The built-in default of the PostgreSQL database URL — BECAUSE the server has to start against a local database without any configuration

DEFAULT_DIRECTORY ⚓︎stringclient/dst

The built-in default of the static content directory, resolved relative to the installation of the server — BECAUSE the client bundle is built next to the server by default

RESPAWN_DELAY ⚓︎duration1000 ms

The backoff delay before an unexpectedly dead worker process is respawned — BECAUSE a tight crash-loop would hammer the broker and the database

APIS: Interface Endpoints (IE) ⚓︎

ENDPOINT: broadcast-server ⚓︎

INTERFACEINTERFACE: Server Command Line ⚭
PERMISSIONSPERMISSION: Administer Every Event ⚭, PERMISSION: Administer the Channels ⚭, PERMISSION: Administer the Resources ⚭, PERMISSION: Administer the Provider Parameters ⚭, PERMISSION: Administer the Roles ⚭
OPERATIONcommand
LOCATORbroadcast-server [options]

The sole command of the program, which loads the layered configuration, brings the database schema up to date, pre-forks the configured number of worker processes, supervises them (respawning a dead one after the RESPAWN_DELAY), and runs until it receives a SIGINT or SIGTERM signal, which it forwards to all workers before terminating gracefully — BECAUSE the server is a long-running daemon whose process model has to stay uniform even for a single worker.

OPTIONTYPEALIASDEFAULTCONSTRAINTDescription
—version ⚓︎boolean-Vfalse

Prints the name and version of the program and exits — BECAUSE the deployed version has to be identifiable

—help ⚓︎boolean-hfalse

Prints the usage of the program and exits — BECAUSE the options have to be discoverable on the command line

—log-level ⚓︎TYPE: LogLevel ⚭-linfo

Overrides the logLevel configuration parameter — BECAUSE the verbosity has to be raised ad-hoc for troubleshooting

—config ⚓︎string-creadable YAML file

The configuration file of the structure Configuration, merged over the built-in defaults — BECAUSE a deployment has to keep its parameters in one versioned file

—env ⚓︎string-ereadable dotenv file

The environment file loaded in addition to, and overriding, the .env file of the current working directory — BECAUSE secrets have to be injected without appearing in the configuration file or the command line

—admin-username ⚓︎string-u

Overrides the adminUsername configuration parameter — BECAUSE the administrator account has to be settable per environment

—admin-password ⚓︎string-p

Overrides the adminPassword configuration parameter — BECAUSE the administrator account has to be settable per environment

—mqtt-url ⚓︎string-mCONSTANT: DEFAULT_MQTT_URL ⚭

Overrides the mqttUrl configuration parameter — BECAUSE the broker differs per environment

—db-url ⚓︎string-DCONSTANT: DEFAULT_DB_URL ⚭

Overrides the dbUrl configuration parameter — BECAUSE the database differs per environment

—directory ⚓︎string-dCONSTANT: DEFAULT_DIRECTORY ⚭existing directory

Overrides the directory configuration parameter — BECAUSE the client bundle may be deployed apart from the server

—workers ⚓︎integer-w11..n

Overrides the workers configuration parameter, rejecting a non-positive or non-integer value as a usage error — BECAUSE the process count has to match the CPU resources of the environment

RESULTTYPEARITYCONSTRAINTDescription
log ⚓︎text*

The log lines written to the standard output, each carrying the timestamp, the level, and the originating primary or worker process, with the credentials of all URL-valued parameters redacted — BECAUSE the operator has to trace the server without ever seeing a secret

exit-code ⚓︎integer0 or 1

The process exit code, 0 after a graceful termination, after --help, and after --version, and 1 after a usage error, an invalid configuration, a failed database migration, or a failed shutdown — BECAUSE the process supervisor has to tell a clean stop from a failure

UXUI: Interaction Concept (IC) ⚓︎

PRINCIPLEProperties & Description
Moderation-Gated Visibility ⚓︎
Diagram
Properties
CATEGORYExpectation-Conformity
ACTORSPERSONA: Anna ⚭, PERSONA: Markus ⚭, PERSONA: Peter ⚭
MOTIVATED-BYSTEP: Watch stream and interact ⚭
USE-CASESUSE-CASE: Ask a Question ⚭, SCENARIO: Pending Message Stays Private ⚭, SCENARIO: Edit an Own Message ⚭, USE-CASE: Moderate and Forward Messages ⚭
TRADE-OFFThe liveliness of an unmoderated stream in which every input is public the moment it is sent
Description

Attendee input is acknowledged immediately as submitted but becomes publicly visible only after moderation when enabled, with its state clearly indicated to the author — BECAUSE authors must trust their input arrived while organizers retain control

Privacy-Visible Identity ⚓︎
Diagram
Properties
CATEGORYSelf-Descriptiveness
MOTIVATED-BYSTEP: Open event page and review login info ⚭
USE-CASESSCENARIO: Post a Chat Message ⚭, SCENARIO: Switch the Language ⚭, SCENARIO: Seed the Conversation as Moderator ⚭
TRADE-OFFFull anonymity of all participants, which would spare the anonymity setting and the hover reveal
Description

Names are shown according to the event’s anonymity setting while the email remains discoverable on hover, and AI-translated text is always marked distinct from the human original — BECAUSE participants must always know who said what and in which language

Frictionless Joining ⚓︎
Diagram
Properties
CATEGORYTask-Suitability
ACTORSPERSONA: Anna ⚭
MOTIVATED-BYSTEP: Open event page and review login info ⚭, STEP: Authenticate via email token ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Authenticate via Email Token ⚭
TRADE-OFFAn explicit registration with a permanent account, which would give organizers richer attendee profiles
Description

The attendee is carried into the event with the least possible effort, with email and token pre-filled from the URL where available and automatic access when a valid token is embedded — BECAUSE large audiences must enter quickly without a support burden

Live Reactivity ⚓︎
Diagram
Properties
CATEGORYSelf-Descriptiveness
MOTIVATED-BYSTEP: Watch stream and interact ⚭, STEP: Moderate and support the presenter ⚭
USE-CASESSCENARIO: Lay Out the Channels ⚭, USE-CASE: Switch Streaming Provider ⚭, USE-CASE: Steer the Presenter ⚭, SCENARIO: Approve and Forward Question ⚭, USE-CASE: Present Forwarded Questions ⚭
TRADE-OFFLower server load and simpler clients through polling or a manual reload
Description

Every configuration change, provider switch, and moderation outcome is pushed to connected clients over WebSockets so the UI updates without a reload — BECAUSE a live event demands that all participants see a single, current state at all times

Validate Before Going Live ⚓︎
Diagram
Properties
CATEGORYError-Robustness
ACTORSPERSONA: Manfred ⚭
MOTIVATED-BYSTEP: Configure and run the event ⚭
USE-CASESSCENARIO: Lay Out the Channels ⚭, USE-CASE: Create Event from Registration Import ⚭
TRADE-OFFThe freedom to save any partial or inconsistent configuration unchecked
Description

Imported attendee lists and streaming settings are validated at entry and problems are reported in place before the event starts — BECAUSE a configuration mistake surfacing during the broadcast hits the whole audience at once

Never Leave the Stream ⚓︎
Diagram
Properties
CATEGORYControllability
ACTORSPERSONA: Anna ⚭
MOTIVATED-BYSTEP: Watch stream and interact ⚭
USE-CASESSCENARIO: Switch the Language ⚭, SCENARIO: Toggle the Theme ⚭, SCENARIO: Show Own Contributions Only ⚭
TRADE-OFFA dedicated settings page with room for more options than the header can hold
Description

Every adjustment available to the attendee, like language, theme, or the interaction tab, is made in place from the event screen, applies immediately, and can be reverted at any time — BECAUSE navigating away from a live stream means missing part of the event

Correct over Confirm ⚓︎
Diagram
Properties
CATEGORYError-Robustness
ACTORSPERSONA: Anna ⚭
MOTIVATED-BYSTEP: Watch stream and interact ⚭
USE-CASESSCENARIO: Post a Chat Message ⚭, SCENARIO: Like a Message ⚭, SCENARIO: Edit an Own Message ⚭, SCENARIO: Delete an Own Message ⚭
TRADE-OFFA confirmation step before every submission, which would reduce mistaken posts at the cost of interrupting the flow
Description

Input is sent without a confirmation step and corrected afterwards instead, as the attendee can edit and delete their own messages while a deleted message leaves a placeholder — BECAUSE a fast conversation tolerates a repaired mistake better than a delay before every message

Familiar Conventions ⚓︎
Diagram
Properties
CATEGORYLearnability
ACTORSPERSONA: Anna ⚭
USE-CASESUSE-CASE: Chat During the Event ⚭, SCENARIO: Login with Emailed Token ⚭
TRADE-OFFNovel interaction forms tailored to the event format, which would be more expressive but need explaining
Description

Chat, questions, and likes look and behave like the consumer messengers the attendee already knows, so that the login message is the only instruction an attendee ever reads — BECAUSE a one-time audience has neither the time nor the motivation to learn a new tool

One-Tap Contribution ⚓︎
Diagram
Properties
CATEGORYEngagement
ACTORSPERSONA: Anna ⚭
MOTIVATED-BYSTEP: Watch stream and interact ⚭
USE-CASESSCENARIO: Submit Moderated Question ⚭, SCENARIO: Post a Chat Message ⚭, SCENARIO: Like a Message ⚭, SCENARIO: Answer a Multiple-Choice Poll ⚭
TRADE-OFFRicher contributions like threads, attachments, or formatting, which would raise the bar for taking part
Description

A like is a single tap and a message is a single field plus send, with the emoji picker as the only enrichment — BECAUSE the more attendees contribute during the event, the livelier it feels for everyone watching

UXUI: Language Conventions (LC) ⚓︎

CONVENTIONProperties & Description
Plain Organizer Voice ⚓︎
Diagram
Properties
CATEGORYVoice
PRINCIPLESPRINCIPLE: Familiar Conventions ⚭
EXAMPLE“The event starts at 10:00.”, not “Get ready, the show is about to begin!”
Description

The solution speaks with the plain, factual voice of the event organizer, never with a playful or marketing persona of its own — BECAUSE attendees join for the event, not for the tool, and the tool must not compete with the presenter for attention

Neutral Operational Tone ⚓︎
Diagram
Properties
CATEGORYTone
ACTORSPERSONA: Anna ⚭
PRINCIPLESPRINCIPLE: Correct over Confirm ⚭, PRINCIPLE: Familiar Conventions ⚭
EXAMPLE“You are not authorized for this event.”, not “Access forbidden!”
Description

User-facing system messages use a calm, neutral, and concise tone that informs without alarming, especially around access denial and connection changes — BECAUSE a one-time audience has no way to recover from a message that sounds like an accusation

Second-Person Address ⚓︎
Properties
CATEGORYGrammar
EXAMPLE“Your message was sent.”, not “The user’s message has been sent.”
Description

The solution addresses the user as “you” and never refers to itself as “I” or “we” — BECAUSE direct address is the shortest wording and avoids the false impression of a person behind the interface

Product Name Spelling ⚓︎
Properties
CATEGORYCapitalization
EXAMPLE“Broadcast”, not “broadcast” or “BROADCAST”
Description

The product is always written “Broadcast” — BECAUSE a single spelling keeps the product recognizable and distinct from the generic verb

Anonymous Placeholder ⚓︎
Diagram
Properties
CATEGORYVocabulary
ACTORSPERSONA: Anna ⚭
PRINCIPLESPRINCIPLE: Privacy-Visible Identity ⚭
TERMSTERM: Anonymization ⚭, TERM: Moderator ⚭
EXAMPLE“Anonymous”, not “anonymous user” or “N/A”
Description

When identity is hidden, the displayed sender name is exactly “Anonymous”, and moderator-authored messages default to the sender name “Moderator” — BECAUSE a fixed placeholder reads as a deliberate choice while an ad-hoc wording reads as missing data

Token Display Format ⚓︎
Diagram
Properties
CATEGORYFormatting
TERMSTERM: Authorization Token ⚭
EXAMPLE“123-456”, not “123456”
Description

Authorization tokens are always presented in the grouped six-digit form “NNN-NNN” with a hyphen separator, in emails and on screen alike — BECAUSE the grouping makes a token easy to read aloud and to type from a second device

UXUI: Dialog Patterns (DP) ⚓︎

DIALOG-PATTERNProperties & Description
Two-Factor Login ⚓︎
Diagram
CATEGORYACTORSCONTEXT
FormPERSONA: Anna ⚭An attendee accessing an event that requires email-verified access.
PROBLEMPRINCIPLESUSES
The system must confirm the attendee controls an authorized email without permanent accounts.PRINCIPLE: Frictionless Joining ⚭
TRADE-OFFDescription
A second round-trip through the attendee’s mailbox before every access without an embedded token.

The dialog collects the email, sends a one-time token to it, and then collects that token in a second step, optionally pre-filling fields from the URL — BECAUSE a challenge-response over email proves address control with no stored credential.

Video-with-Sidebar ⚓︎
Diagram
CATEGORYACTORSCONTEXT
LayoutPERSONA: Anna ⚭The main attendee screen during a live event with interaction enabled.
PROBLEMPRINCIPLESUSES
The attendee must watch the stream and interact without either crowding the other.PRINCIPLE: Never Leave the Stream ⚭DIALOG-PATTERN: Live Message Stream ⚭, DIALOG-PATTERN: Inline Composer ⚭
TRADE-OFFDescription
A smaller video area on wide screens and a sidebar hidden behind a toggle on small screens.

The video occupies the primary area while a tabbed sidebar hosts the Q&A, Hudspad, Chat, and Support tabs, collapsing responsively on small screens — BECAUSE co-locating stream and interaction keeps attention on the event while interaction stays reachable.

Live Message Stream ⚓︎
Diagram
CATEGORYACTORSCONTEXT
ListPERSONA: Anna ⚭The chat and Q&A tabs where attendees read and post a continuous flow of messages.
PROBLEMPRINCIPLESUSES
Messages of mixed provenance and state arrive continuously and the attendee must follow them without losing their place.PRINCIPLE: Live Reactivity ⚭, PRINCIPLE: Privacy-Visible Identity ⚭, PRINCIPLE: Familiar Conventions ⚭
TRADE-OFFDescription
A dense visual vocabulary of alignments, tints, and indicators the attendee has to learn.

Messages render as a scrolling list of bubbles distinguished by provenance and state, with own messages right-aligned, others left-aligned, moderator messages tinted, quoted originals linking back to their source, deleted messages shown as a placeholder, per-message like counts and reply affordances, and floating “new messages” jump indicators above and below — BECAUSE clear per-message styling and unread cues let attendees follow a fast, mixed stream without confusion.

Inline Composer ⚓︎
Diagram
CATEGORYACTORSCONTEXT
FormPERSONA: Anna ⚭The bottom of the chat and Q&A tabs where the attendee writes input.
PROBLEMPRINCIPLESUSES
The attendee must compose, send, and see the moderation outcome of their own input within the same stream.PRINCIPLE: Moderation-Gated Visibility ⚭, PRINCIPLE: Correct over Confirm ⚭, PRINCIPLE: One-Tap Contribution ⚭
TRADE-OFFDescription
A permanently occupied strip of the sidebar, even while the attendee is only reading.

A persistent input field with an emoji picker and send control sits below the message list, and the attendee’s just-sent message appears in the stream marked “pending… / under review” until moderation resolves it — BECAUSE keeping the composer and the input’s own state in one place makes posting and its consequence immediately legible.

Kanban Moderation Board ⚓︎
Diagram
CATEGORYACTORSCONTEXT
ListPERSONA: Markus ⚭, PERSONA: Peter ⚭A moderator triaging a stream of incoming chat and question messages.
PROBLEMPRINCIPLESUSES
Many messages must be classified and routed quickly with a clear sense of their state.PRINCIPLE: Live Reactivity ⚭, PRINCIPLE: Moderation-Gated Visibility ⚭
TRADE-OFFDescription
A wide multi-lane board that needs a desktop-sized screen and drag-capable pointer input.

Messages appear as cards in state lanes (pending, accepted, forwarded, answered) that the moderator advances by action, with filters and manual reordering — BECAUSE spatial state and drag actions make high-throughput triage fast and unambiguous.

Master-Detail Configuration ⚓︎
Diagram
CATEGORYACTORSCONTEXT
LayoutPERSONA: Manfred ⚭A manager configuring an event’s channels, resources, and options.
PROBLEMPRINCIPLESUSES
A large nested configuration must be navigated and edited without losing orientation.PRINCIPLE: Validate Before Going Live ⚭
TRADE-OFFDescription
The horizontal space of two panes, cramped on small screens, and only one item editable at a time.

A master list of channels and resources on one side drives a detail editor on the other, so selecting an item reveals its parameters for editing — BECAUSE master-detail keeps a large hierarchical configuration navigable and focused.

Live Statistics Dashboard ⚓︎
Diagram
CATEGORYACTORSCONTEXT
DataPERSONA: Manfred ⚭, PERSONA: Petra ⚭A manager or studio screen observing event health during the broadcast.
PROBLEMPRINCIPLESUSES
Operators need an at-a-glance, continuously updating view of audience and channels.PRINCIPLE: Live Reactivity ⚭
TRADE-OFFDescription
A periodic snapshot cadence, so the charts lag the live state by up to one interval.

A dashboard composes a time-series attendee curve with per-channel pie charts that refresh from periodic statistics snapshots — BECAUSE combined trend and distribution views convey event health without manual querying.

UXUI: Dialog Storyboard (DS) ⚓︎

STORYBOARD: Attendee Joins and Watches ⚓︎

ACTORSPERSONA: Anna ⚭
SCENARIOSCENARIO: Join via Individual URL ⚭
FRAMESCENARIO-STEPPATTERNSDescription
Event Landing ⚓︎1DIALOG-PATTERN: Two-Factor Login ⚭

The attendee opens the event URL and sees the event title, login message, and an email field

Email Entry ⚓︎2DIALOG-PATTERN: Two-Factor Login ⚭

The attendee enters their email; the system confirms a token has been sent to that address

Token Challenge ⚓︎2DIALOG-PATTERN: Two-Factor Login ⚭

A token field appears with the email read-only; the attendee types the six-digit token

Main Screen ⚓︎3DIALOG-PATTERN: Video-with-Sidebar ⚭

The live video plays on the left with the interaction sidebar on the right

STORYBOARD: Attendee Asks a Tagged Question ⚓︎

ACTORSPERSONA: Anna ⚭
SCENARIOSCENARIO: Submit Moderated Question ⚭
FRAMESCENARIO-STEPPATTERNSDescription
Questions Tab ⚓︎1DIALOG-PATTERN: Video-with-Sidebar ⚭, DIALOG-PATTERN: Live Message Stream ⚭

The attendee selects the questions tab in the sidebar showing existing accepted questions

Compose Question ⚓︎2DIALOG-PATTERN: Inline Composer ⚭

The attendee types a question and the available question tags are offered for selection

Tag and Submit ⚓︎3DIALOG-PATTERN: Inline Composer ⚭

The attendee picks one or more tags and submits the question

Pending Acknowledgement ⚓︎4DIALOG-PATTERN: Live Message Stream ⚭

The question appears in the attendee’s own list marked as pending moderation, a rejected one tinted and visible to the author only

Becomes Visible ⚓︎5DIALOG-PATTERN: Live Message Stream ⚭

After approval the question becomes visible and likeable for all attendees

STORYBOARD: Attendee Reads and Posts Chat ⚓︎

ACTORSPERSONA: Anna ⚭
SCENARIOSCENARIO: Post a Chat Message ⚭
FRAMESCENARIO-STEPPATTERNSDescription
Chat Tab ⚓︎DIALOG-PATTERN: Video-with-Sidebar ⚭, DIALOG-PATTERN: Live Message Stream ⚭

The attendee opens the Chat tab and sees the scrolling stream with a “2 new messages” jump indicator

Read Mixed Stream ⚓︎DIALOG-PATTERN: Live Message Stream ⚭

Others’ messages show name, time, and like count, an amber moderator message stands out, and a quoted original links back to its source

Like and Reply ⚓︎DIALOG-PATTERN: Live Message Stream ⚭

The attendee likes a message, raising its count, and follows a quoted original link back to its source

Compose and Send ⚓︎2DIALOG-PATTERN: Inline Composer ⚭

The attendee types in the bottom composer, optionally adds an emoji, and sends the message

Under Review ⚓︎4DIALOG-PATTERN: Inline Composer ⚭, DIALOG-PATTERN: Live Message Stream ⚭

The attendee’s own message appears right-aligned marked “pending… / under review” until moderation resolves it

STORYBOARD: Attendee Gets Support from a Moderator ⚓︎

ACTORSPERSONA: Anna ⚭, PERSONA: Markus ⚭
SCENARIOSCENARIO: Answer an Attendee Directly ⚭
FRAMESCENARIO-STEPACTORPATTERNSDescription
Support Tab ⚓︎PERSONA: Anna ⚭DIALOG-PATTERN: Video-with-Sidebar ⚭, DIALOG-PATTERN: Inline Composer ⚭

The attendee opens the Support tab, which shows only their own requests, and writes a request for help into the composer

Chat Moderation Board ⚓︎1PERSONA: Markus ⚭DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator reviews the incoming chat messages in the rejected, pending, and accepted lanes beside the stream, the request among them

Direct Reply ⚓︎4PERSONA: Markus ⚭DIALOG-PATTERN: Inline Composer ⚭

The moderator writes a reply in the board’s composer and marks it as a direct message to the attendee instead of a public one

Reply Received ⚓︎5PERSONA: Anna ⚭DIALOG-PATTERN: Live Message Stream ⚭

The attendee sees the amber-tinted moderator reply below their own request in the Support tab, without any further approval step

STORYBOARD: Chat Moderator Triages Messages ⚓︎

ACTORSPERSONA: Markus ⚭
SCENARIOSCENARIO: Reject Improper Message ⚭
FRAMESCENARIO-STEPPATTERNSDescription
Board Overview ⚓︎DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator opens the chat moderation board with the stream preview beside the rejected, pending, and accepted lanes, each lane heading counting its messages

Narrow Lane ⚓︎DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator narrows a lane through the timestamp and tag label filter chips at its head, collapsing the messages outside the filter

Assess Pending ⚓︎DIALOG-PATTERN: Kanban Moderation Board ⚭

Each pending card shows the sentiment pre-assessment chip (safe, iffy, risk) beside sender and time, above the outlined reject and filled accept buttons

Reject Improper ⚓︎2DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator clicks reject on an improper message, which leaves the pending lane immediately

Hidden from Audience ⚓︎3DIALOG-PATTERN: Kanban Moderation Board ⚭

The card reappears at the top of the rejected lane marked rejected, while the accepted lane the audience sees stays unchanged

STORYBOARD: Moderator Forwards to Presenter ⚓︎

ACTORSPERSONA: Peter ⚭, PERSONA: Petra ⚭
SCENARIOSCENARIO: Approve and Forward Question ⚭
FRAMESCENARIO-STEPACTORPATTERNSDescription
Board Overview ⚓︎PERSONA: Peter ⚭DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator sees question cards in the rejected, pending, accepted, suspended, forwarded, and answered lanes

Filter Pending ⚓︎1PERSONA: Peter ⚭DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator filters to show only pending questions to focus the triage

Approve Card ⚓︎2PERSONA: Peter ⚭DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator approves a relevant question, moving it to the accepted lane

Forward with Hint ⚓︎3PERSONA: Peter ⚭DIALOG-PATTERN: Kanban Moderation Board ⚭

The moderator forwards the card to the presenter and attaches a routing hint in the presenter alert

Presenter Basket ⚓︎5PERSONA: Petra ⚭

The card appears in the presenter’s ordered work basket below the acknowledgeable hint and is locked from attendee edits

STORYBOARD: Manager Switches Provider Live ⚓︎

ACTORSPERSONA: Manfred ⚭, PERSONA: Anna ⚭
SCENARIOSCENARIO: Live Failover ⚭
FRAMESCENARIO-STEPACTORPATTERNSDescription
Channel Master ⚓︎1PERSONA: Manfred ⚭DIALOG-PATTERN: Master-Detail Configuration ⚭

The manager selects the affected channel from the master list of channels

Resource Detail ⚓︎1PERSONA: Manfred ⚭DIALOG-PATTERN: Master-Detail Configuration ⚭

The channel’s resources are shown with the currently active provider highlighted

Activate Fallback ⚓︎2PERSONA: Manfred ⚭DIALOG-PATTERN: Master-Detail Configuration ⚭

The manager activates a different resource as the new active one

Propagation Confirmed ⚓︎4PERSONA: Manfred ⚭

The system confirms the change has been pushed to all connected clients

Seamless Switch ⚓︎5PERSONA: Anna ⚭DIALOG-PATTERN: Video-with-Sidebar ⚭

Attendee players transition to the new stream with no user action required

STORYBOARD: Manager Imports Registration Sheet ⚓︎

ACTORSPERSONA: Manfred ⚭
SCENARIOSCENARIO: Import and Return URLs ⚭
FRAMESCENARIO-STEPPATTERNSDescription
Event Config ⚓︎DIALOG-PATTERN: Master-Detail Configuration ⚭

The manager opens the event configuration, with its basics and event type profile, and selects the attendee import action

Upload Sheet ⚓︎1

The manager uploads the Excel sheet of the Event Registration System with attendee columns

Import Summary ⚓︎3

The system reports new users created and existing users skipped, with tokens generated

URL Preview ⚓︎4

The system shows the composed personal access URLs per attendee

Return Download ⚓︎5

The manager downloads the returned Excel sheet with the URL column filled for the Event Registration System

UXUI: Visual Design (VD) ⚓︎

ELEMENTProperties & Description
Brand Color Palette ⚓︎
Diagram
Properties
CATEGORYColor
PRINCIPLESPRINCIPLE: Moderation-Gated Visibility ⚭, PRINCIPLE: Privacy-Visible Identity ⚭
SOURCETailwind theme configuration of the frontend (tailwind.config.ts), color section
TRADE-OFFA palette bound to the corporate identity, leaving no room for event-specific branding.
Description

The interface uses the msg corporate palette with a primary msg blue for actions, the active channel, and own outgoing messages, neutral surfaces for others’ messages, a warm amber tint for moderator-authored messages and the “under review” state, a red tint for rejected input, and muted italic styling for deleted messages — BECAUSE color-coded message provenance and state give attendees and moderators instant visual feedback.

Light and Dark Theme ⚓︎
Diagram
Properties
CATEGORYColor
PRINCIPLESPRINCIPLE: Familiar Conventions ⚭
SOURCETailwind theme configuration of the frontend (tailwind.config.ts), dark mode section
TRADE-OFFEvery semantic color role has to be defined and checked twice, once per theme.
Description

The application provides both a light and a dark theme, toggled from a sun/moon control in the header bar and applied consistently across video frame, sidebar, and message bubbles — BECAUSE attendees view events in varied lighting and expect to choose a comfortable appearance.

Broadcast Wordmark ⚓︎
Diagram
Properties
CATEGORYBrand
TRADE-OFFA reserved header strip on every screen, including the space-constrained mobile layouts.
Description

The product is represented by the “BROADCAST” wordmark with the circled “O” accent in msg blue, placed top-left in the header bar — BECAUSE a distinctive, consistently placed wordmark anchors the brand on every screen.

Self-Hosted Typography ⚓︎
Diagram
Properties
CATEGORYTypography
ACTORSPERSONA: Anna ⚭, PERSONA: Petra ⚭
SOURCETypoPRO font package of the frontend (@typopro/web-*), subsetted at build time
TRADE-OFFA larger initial download than a system font stack, as the font files ship with the application.
Description

Text is set in a self-hosted TypoPRO web font family with a clear type scale for headings, body, and captions, sized for legibility on the studio screen at 2-4 meters viewing distance — BECAUSE self-hosted fonts avoid third-party requests and the studio view must remain readable from afar.

Fontawesome Iconography ⚓︎
Diagram
Properties
CATEGORYIconography
PRINCIPLESPRINCIPLE: Familiar Conventions ⚭
SOURCEFontawesome Free package of the frontend (@fortawesome/fontawesome-free)
TRADE-OFFA vocabulary limited to the coverage of one icon set, so a missing metaphor is worked around with a text label.
Description

Actions and message states are reinforced with a consistent Fontawesome icon set, pairing icons with text labels for moderation controls — BECAUSE consistent icons speed recognition of repeated moderation actions.

Responsive Spacing Scale ⚓︎
Diagram
Properties
CATEGORYSpacing
PRINCIPLESPRINCIPLE: Never Leave the Stream ⚭
SOURCETailwind theme configuration of the frontend (tailwind.config.ts), spacing and screens sections
TRADE-OFFFixed breakpoints, so a layout jumps between its arrangements instead of scaling fluidly.
Description

Spacing follows the Tailwind 4px-based scale with a 16px base gutter, and the breakpoints sm (640px), md (768px), and lg (1024px) decide at which widths the video-with-sidebar arrangement collapses into the stacked single column — BECAUSE one shared scale keeps the density of video, sidebar, and boards consistent across the device classes attendees use.

Card and Bubble Shape ⚓︎
Diagram
Properties
CATEGORYShape
TRADE-OFFA soft look which relies on subtle tints and hairline borders, demanding a well-tuned contrast in both themes.
Description

Messages, questions, and form fields use rounded rectangles with a 6px corner radius and a hairline border, moderation cards get a subtle elevation shadow, and buttons are pill-shaped with the primary action filled and the secondary action outlined — BECAUSE a uniform shape language lets the color and iconography carry the meaning of an item.

Stream Imagery Treatment ⚓︎
Diagram
Properties
CATEGORYImagery
ACTORSPERSONA: Anna ⚭
PRINCIPLESPRINCIPLE: Never Leave the Stream ⚭
TRADE-OFFLetterbox bars on screens whose aspect ratio differs from 16:9, wasting some display area.
Description

The live video occupies a prominent 16:9 frame with a neutral letterbox and a subtle channel and language badge overlay — BECAUSE the stream is the focal content and attendees must see which channel they are watching.

Subtle State Transitions ⚓︎
Diagram
Properties
CATEGORYMotion
PRINCIPLESPRINCIPLE: Live Reactivity ⚭
TRADE-OFFTransitions short enough to be missed when the user is not looking at the changed region.
Description

State and configuration changes animate with short, subtle transitions under 200ms, including the seamless cross-fade on a stream provider switch — BECAUSE gentle motion signals live updates without distracting from the event.

MOCKUP: Attendee Chat View ⚓︎

ACTORSPERSONA: Anna ⚭
STORYBOARDSTORYBOARD: Attendee Reads and Posts Chat ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Light and Dark Theme ⚭, ELEMENT: Broadcast Wordmark ⚭, ELEMENT: Self-Hosted Typography ⚭, ELEMENT: Fontawesome Iconography ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭, ELEMENT: Stream Imagery Treatment ⚭
IMAGE

The main attendee screen with the Chat tab open, showing the blue own message, the amber moderator message, the “under review” divider, and the new-messages badge above the letterboxed stream.

MOCKUP: Attendee Q&A View ⚓︎

ACTORSPERSONA: Anna ⚭
STORYBOARDSTORYBOARD: Attendee Asks a Tagged Question ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Self-Hosted Typography ⚭, ELEMENT: Fontawesome Iconography ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭
IMAGE

The main attendee screen with the Q&A tab open, showing the filter pills, the tag chips below each question, the pending own question under review, and the red-tinted rejected question.

MOCKUP: Attendee Support View ⚓︎

ACTORSPERSONA: Anna ⚭
STORYBOARDSTORYBOARD: Attendee Gets Support from a Moderator ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭, ELEMENT: Stream Imagery Treatment ⚭
IMAGE

The main attendee screen with the Support tab open, showing the private exchange of a blue own message and an amber moderator reply above the composer.

MOCKUP: Administrator Event Creation ⚓︎

ACTORSPERSONA: Sven ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Broadcast Wordmark ⚭, ELEMENT: Self-Hosted Typography ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭
IMAGE

The event creation form of the administrator, showing the type scale of the headings, the outlined form fields, the event type selector with the filled selected profile, and the blue-tinted profile summary.

MOCKUP: Chat Moderation Board ⚓︎

ACTORSPERSONA: Markus ⚭
STORYBOARDSTORYBOARD: Chat Moderator Triages Messages ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Fontawesome Iconography ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭, ELEMENT: Stream Imagery Treatment ⚭
IMAGE

The chat moderation board with the stream preview beside the rejected, pending, and accepted columns, showing the elevated pending cards with their outlined reject and filled accept buttons and the AI assessment chips.

MOCKUP: Q&A Moderation Board ⚓︎

ACTORSPERSONA: Peter ⚭
STORYBOARDSTORYBOARD: Moderator Forwards to Presenter ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Fontawesome Iconography ⚭, ELEMENT: Responsive Spacing Scale ⚭, ELEMENT: Card and Bubble Shape ⚭
IMAGE

The all-in-one Q&A moderation board with the rejected, pending, accepted, suspended, forwarded, and answered columns, showing the amber moderator annotations and the presenter alert composer.

MOCKUP: Presenter View ⚓︎

ACTORSPERSONA: Petra ⚭
STORYBOARDSTORYBOARD: Moderator Forwards to Presenter ⚭
ELEMENTSELEMENT: Brand Color Palette ⚭, ELEMENT: Self-Hosted Typography ⚭, ELEMENT: Fontawesome Iconography ⚭, ELEMENT: Card and Bubble Shape ⚭
IMAGE

The presenter view for the studio screen with the enlarged type scale, the amber presenter alert banner, the forwarded questions with their filled answer buttons, and the private moderator chat.

ARCH: Context View (CV) ⚓︎

ENTITYProperties & Description
Attendee ⚓︎
Properties
KINDPerson
DIRECTIONBidirectional
TERMSTERM: Attendee ⚭
ACTORSROLE: Attendee ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Authenticate via Email Token ⚭, USE-CASE: Ask a Question ⚭, USE-CASE: Chat During the Event ⚭
PREMISESPREMISE: Attendee Networks Pass WebSocket Traffic ⚭
DATALogin credentials, video playback, chat, questions, likes
Description

The attendee is the person who authenticates, watches the stream, and interacts, through the browser-based web client of the solution — BECAUSE Broadcast is a browser-delivered solution serving thousands of concurrent attendees.

Event Operator ⚓︎
Properties
KINDPerson
DIRECTIONBidirectional
TERMSTERM: Manager ⚭, TERM: Moderator ⚭, TERM: Presenter ⚭
ACTORSROLE: Moderator ⚭, ROLE: Presenter ⚭, ROLE: Manager ⚭
USE-CASESUSE-CASE: Configure the Event ⚭, USE-CASE: Create Event from Registration Import ⚭, USE-CASE: Switch Streaming Provider ⚭, USE-CASE: Publish, Start, and Finish Event ⚭, USE-CASE: Export Anonymized Event Data ⚭, USE-CASE: Moderate and Forward Messages ⚭, USE-CASE: Moderate the Chat Conversation ⚭, USE-CASE: Steer the Presenter ⚭, USE-CASE: Present Forwarded Questions ⚭
DATAEvent configuration, moderation actions, statistics, exports
Description

The event operator is a manager, moderator, or presenter who configures events, moderates input, and presents forwarded questions, through the same browser-based web client as the attendees — BECAUSE all event operation happens through the same web application as attendance.

Streaming Provider ⚓︎
Properties
KINDSystem
DIRECTIONOutbound
TERMSTERM: Streaming Provider ⚭
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Configure the Event ⚭, USE-CASE: Switch Streaming Provider ⚭
PREMISESPREMISE: Streaming Providers Deliver the Video ⚭
DATALive video ingest and playback streams
Description

External streaming providers such as msg Filmstudio, msg Broadcast, YouTube, Cloudflare, Twitch, and 3Q ingest and deliver the video — BECAUSE the solution is streaming-provider independent and consumes provider endpoints rather than hosting video.

Content CDN ⚓︎
Properties
KINDService
DIRECTIONOutbound
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭
DATAStatic client assets and static resources
Description

A Cloudflare content delivery network fronts static content for fast, stable distribution — BECAUSE static assets must load quickly and reliably for a global, large-scale audience.

Event Registration System ⚓︎
Properties
KINDSystem
DIRECTIONBidirectional
VIAENTITY: Event Operator ⚭
TERMSTERM: Event Registration System ⚭
USE-CASESUSE-CASE: Create Event from Registration Import ⚭
PREMISESPREMISE: Registered Audience Known in Advance ⚭, PREMISE: Registration System Exchanges Attendee Data ⚭
DATAAttendee registration data and generated access URLs
Description

The Event Registration System supplies attendee registration data and receives generated access URLs without any direct technical interface: the manager carries both as Excel sheets, uploading the exported attendee list into the event and handing the returned URL sheet back — BECAUSE events are provisioned from the organization’s existing registration system, which distributes the invitations itself.

Email Gateway ⚓︎
Properties
KINDService
DIRECTIONOutbound
USE-CASESUSE-CASE: Authenticate via Email Token ⚭
PREMISESPREMISE: Email Gateway Delivers Tokens Within Minutes ⚭
DATAAuthorization token emails
Description

An external mail-sending service delivers one-time authorization tokens to attendees — BECAUSE email is the first-factor channel through which access is verified.

Translation LLM ⚓︎
Properties
KINDService
DIRECTIONOutbound
USE-CASESUSE-CASE: Join Event and Watch Stream ⚭, USE-CASE: Ask a Question ⚭, USE-CASE: Chat During the Event ⚭
PREMISESPREMISE: Translation Service Available During Events ⚭, PREMISE: Message Texts Contain Personal Data ⚭
DATASource and translated message texts
Description

An external AI/LLM service translates message texts between the supported languages — BECAUSE chat and questions are made available in German and English on the fly.

Embedded Third-Party App ⚓︎
Properties
KINDSystem
DIRECTIONBidirectional
USE-CASESUSE-CASE: Moderate the Chat Conversation ⚭
DATAInteractive app content and administration
Description

An optional third-party application is embedded into the event for additional interactivity, with a separate admin URL for moderators — BECAUSE some events integrate external interactive tooling.

ARCH: Functionality View (FV) ⚓︎

COMPONENTProperties & Description
Web Client ⚓︎
Diagram
Properties
KINDSubsystem
REALIZESREQUIREMENT: Configurable Name Appearance ⚭, REQUIREMENT: Browser Access ⚭, REQUIREMENT: Individual Event Access URL ⚭, REQUIREMENT: Explicit User Consent ⚭, REQUIREMENT: Live Provider Switching ⚭
DEPENDS-ONCOMPONENT: Relay ⚭
Description

The Vue.js single-page application renders the attendee and operator UI and drives all user interaction: it presents the panel, attendee, studio, moderator, and manager screens, plays the video stream, and exchanges live data over MQTT — BECAUSE msg.Broadcast delivers its entire experience in the browser.

Client NLP ⚓︎
Diagram
Properties
KINDModule
PART-OFCOMPONENT: Web Client ⚭
REALIZESREQUIREMENT: Client-Side Sentiment Analysis ⚭
Description

The client NLP module performs lightweight client-side sentiment analysis and language identification on attendee input before it is sent — BECAUSE filtering at the source reduces server load and can prevent improper submissions.

Router ⚓︎
Diagram
Properties
KINDConnector
Description

The router (HAProxy with NFTables) routes incoming HTTP and WebSocket traffic across the proxy instances of an environment using round-robin and separates the dev, QA, and production environments — BECAUSE traffic must be balanced and environments isolated at the edge.

Proxy ⚓︎
Diagram
Properties
KINDConnector
DEPENDS-ONCOMPONENT: Relay ⚭
Description

The proxy layer (HAProxy) forwards the HTTP and WebSocket requests of a specific environment to the relay layer and scales horizontally per environment — BECAUSE request handling must scale independently of the messaging layer.

Relay ⚓︎
Diagram
Properties
KINDConnector
DEPENDS-ONCOMPONENT: Service ⚭
Description

The relay layer maintains thousands of bidirectional WebSocket/MQTT connections, brokering MQTT messages between clients and the service layer and scaling horizontally — BECAUSE real-time fan-out to up to 10000 attendees is the central performance challenge.

Service ⚓︎
Diagram
Properties
KINDService
REALIZESREQUIREMENT: Ask Questions ⚭, REQUIREMENT: Chat Messages ⚭, REQUIREMENT: Moderate Chat and Questions ⚭, REQUIREMENT: Forward Inputs to Presenter ⚭, REQUIREMENT: Live Configuration Propagation ⚭
OWNSENTITY: Event ⚭, ENTITY: AgendaPoint ⚭, ENTITY: Channel ⚭, ENTITY: Resource ⚭, ENTITY: ResourceProviderParam ⚭, ENTITY: Role ⚭, ENTITY: Message ⚭, ENTITY: MessageText ⚭, ENTITY: QuestionTag ⚭
PROVIDESINTERFACE: Server Command Line ⚭
DEPENDS-ONCOMPONENT: Database ⚭
Description

The service layer executes all business logic for events, messages, authentication, and statistics: as the main server it holds the event, moderation, access, and configuration logic, reacts to MQTT messages, and persists state — BECAUSE the authoritative business rules must live in a single server tier.

Authentication Service ⚓︎
Diagram
Properties
KINDModule
PART-OFCOMPONENT: Service ⚭
REALIZESREQUIREMENT: User Authentication ⚭, REQUIREMENT: Limit Parallel Access ⚭, REQUIREMENT: Automatic Event Access URL ⚭
OWNSENTITY: User ⚭, ENTITY: AuthorizationToken ⚭, ENTITY: SessionToken ⚭
DEPENDS-ONCOMPONENT: Database ⚭
Description

The authentication module issues and validates the authorization and session tokens: it generates one-time tokens, sends them via the email gateway, validates logins, and enforces a single active session per user per event — BECAUSE email-verified, single-session access is the core security mechanism.

Translation Service ⚓︎
Diagram
Properties
KINDModule
PART-OFCOMPONENT: Service ⚭
REALIZESREQUIREMENT: In-Session Language Switching ⚭
Description

The translation module produces language-specific message texts via an external LLM, translating them into the supported languages on the fly while preserving the original — BECAUSE chat and questions must be available in both German and English.

Statistics Service ⚓︎
Diagram
Properties
KINDModule
PART-OFCOMPONENT: Service ⚭
REALIZESREQUIREMENT: General Event Statistics ⚭, REQUIREMENT: Debugging Statistics ⚭, REQUIREMENT: Channel Statistics ⚭, REQUIREMENT: User Statistics ⚭, REQUIREMENT: Periodic Statistics Snapshots ⚭
OWNSENTITY: EventStatistic ⚭, ENTITY: ChannelStatistic ⚭, ENTITY: UserStatistic ⚭
DEPENDS-ONCOMPONENT: Database ⚭
Description

The statistics module generates periodic event, channel, and user statistics snapshots, capturing cumulative counts of tokens, sessions, connections, and viewers during a running event — BECAUSE trend dashboards require regular snapshots over the event’s lifetime.

Junction Orchestrator ⚓︎
Diagram
Properties
KINDComponent
REALIZESREQUIREMENT: Browser Access ⚭
Description

The Junction component serves the static client bundle and orchestrates its delivery to the relay over MQTT+ — BECAUSE the client must be distributed alongside the same messaging infrastructure used for live data.

Database ⚓︎
Diagram
Properties
KINDComponent
Description

The PostgreSQL database with the filesystem persists all business objects and static assets, storing all events, messages, tokens, and statistics accessed through the Drizzle persistence layer — BECAUSE the authoritative, durable state of every event must be persisted in one tier.

ARCH: Technology Stack (TS) ⚓︎

TIER: Common ⚓︎

COMPONENTProperties & Description
Language ⚓︎
Diagram
Properties
PRODUCTTypeScript
LICENSEApache-2.0
PHASEBuild-Time
COVERAGEBuild Standardization
Description

All client-side and server-side code, including the shared common module, is authored in strongly typed TypeScript and compiled to JavaScript — BECAUSE a single strongly typed language catches contract mismatches against the shared common module at compile time.

Task Runner ⚓︎
Properties
PRODUCTSTX
LICENSEMIT
PHASEBuild-Time
COVERAGETooling
Description

The STX task runner drives the build, lint, and run tasks of every module from a per-module stx.conf — BECAUSE a single task runner gives every module a consistent developer entry point.

Linting ⚓︎
Diagram
Properties
PRODUCTESLint
LICENSEMIT
PHASEBuild-Time
COVERAGEStandardization
Description

ESLint enforces code quality and style for the client and server TypeScript, complemented by the faster OxLint, HTMLHint for HTML, and StyleLint for Stylus — BECAUSE multiple focused linters keep each language layer clean and consistent.

Messaging ⚓︎
Diagram
Properties
PRODUCTMQTT-Plus
LICENSEMIT
PHASERun-Time
COVERAGEClient Networking Dialog Communication Server Networking Component Communication
USED-BYCOMPONENT: Web Client ⚭, COMPONENT: Relay ⚭, COMPONENT: Service ⚭
Description

MQTT-Plus handles the MQTT-over-WebSocket communication of the client with the relay layer and the MQTT messaging of the service and relay layers on top of the base MQTT.js functionality — BECAUSE MQTT is the messaging protocol for the real-time relay layer and MQTT-Plus adds the needed request/response and event handling on all tiers alike.

HTTP Client ⚓︎
Diagram
Properties
PRODUCTOFetch
LICENSEMIT
PHASERun-Time
COVERAGEClient Networking
USED-BYCOMPONENT: Web Client ⚭, COMPONENT: Authentication Service ⚭
Description

OFetch provides the HTTP/REST request/response communication of the client and the call of the external GraphQL mail-sending API by the authentication service — BECAUSE REST calls complement the MQTT channel for request/response-style interactions on both tiers.

Logging ⚓︎
Diagram
Properties
PRODUCTPino
LICENSEMIT
PHASERun-Time
COVERAGEExecution Tracing
USED-BYCOMPONENT: Web Client ⚭, COMPONENT: Service ⚭
Description

Pino provides the leveled, structured logging facility, wrapping the browser console on the client and rendered human-readably by pino-pretty on the server during development — BECAUSE a single logging library shared by client and server keeps the tracing consistent.

Date Management ⚓︎
Diagram
Properties
PRODUCTLuxon
LICENSEMIT
PHASERun-Time
COVERAGEData Conversion
USED-BYCOMPONENT: Web Client ⚭, COMPONENT: Service ⚭
Description

Luxon handles date and time parsing, formatting, and localization across the client UI and the timestamps emitted by the server services — BECAUSE robust, locale-aware date handling is required for event schedules and timestamps in German and English on client and server alike.

Unique Identifier Generation ⚓︎
Diagram
Properties
PRODUCTnanoid
LICENSEMIT
PHASERun-Time
COVERAGEBusiness Model Peer Information
USED-BYCOMPONENT: Web Client ⚭, COMPONENT: Service ⚭
Description

nanoid generates the compact, collision-resistant unique identifiers for the messaging peers of client and server and for the entities the client creates — BECAUSE short URL-safe identifiers are needed on both tiers without the size and overhead of full UUIDs.

TIER: Client ⚓︎

COMPONENTProperties & Description
Build Tool ⚓︎
Diagram
Properties
PRODUCTVite
LICENSEMIT
PHASEBuild-Time
COVERAGEBuild
Description

Vite serves the client in development with fast HMR and bundles the runtime stack into the optimized static client artifact — BECAUSE it provides a fast development server and an optimized production bundle for the Vue stack.

Styling Framework ⚓︎
Diagram
Properties
PRODUCTTailwind CSS
LICENSEMIT
PHASEBuild-Time Run-Time
COVERAGEBuild Interface Theme Interface Layouting Interface Effects
USED-BYCOMPONENT: Web Client ⚭
Description

Tailwind CSS generates the utility-first styling for theme, layout, and effects at build time, with Stylus as the preferred preprocessor for authoring custom CSS — BECAUSE utility-first styling speeds consistent UI work while Stylus covers bespoke styling.

UI Framework ⚓︎
Diagram
Properties
PRODUCTVue.js
LICENSEMIT
PHASERun-Time
COVERAGEDialog Structure Dialog Life-Cycle Interface Mask Data Binding
USED-BYCOMPONENT: Web Client ⚭
Description

Vue.js provides the reactive, component-based UI framework rendering the panel, attendee, studio, moderator, and manager screens — BECAUSE a reactive component model is the natural fit for the browser-delivered, real-time experience.

Widget Framework ⚓︎
Diagram
Properties
PRODUCTReka UI
LICENSEMIT
PHASERun-Time
COVERAGEInterface Widgets Interface States Interface Interactions
USED-BYCOMPONENT: Web Client ⚭
Description

Reka UI supplies the headless, unstyled widget primitives composed into the application’s interface elements — BECAUSE headless widgets provide accessible interaction behavior while leaving the visual styling fully under design control.

Typography ⚓︎
Diagram
Properties
PRODUCTTypoPRO
LICENSEOFL-1.1, Apache-2.0, MIT, CC0-1.0 (per font)
PHASERun-Time
COVERAGEInterface Theme
USED-BYCOMPONENT: Web Client ⚭
Description

TypoPRO supplies the web typography and font assets for the client interface — BECAUSE consistent, self-hosted typography is needed across the branded UI.

Iconography ⚓︎
Diagram
Properties
PRODUCTFontawesome
LICENSECC-BY-4.0, OFL-1.1, MIT (per asset)
PHASERun-Time
COVERAGEInterface Widgets
USED-BYCOMPONENT: Web Client ⚭
Description

Fontawesome provides the icon set used throughout the client interface — BECAUSE a comprehensive icon library covers the UI’s iconography needs out of the box.

Tooltips ⚓︎
Diagram
Properties
PRODUCTvue-tippy + tippy.js
LICENSEMIT
PHASERun-Time
COVERAGEInterface Widgets Interface States
USED-BYCOMPONENT: Web Client ⚭
Description

vue-tippy integrates the tippy.js tooltip and popover engine as a Vue.js directive and component for the floating hints on the interface elements of the client — BECAUSE a proven positioning engine with a Vue.js integration provides consistent tooltips without hand-written placement logic.

Animations ⚓︎
Diagram
Properties
PRODUCTAnime.js
LICENSEMIT
PHASERun-Time
COVERAGEInterface Effects
USED-BYCOMPONENT: Web Client ⚭
Description

Anime.js drives the scripted transitions and keyframe animations of the client interface elements beyond the declarative CSS transitions of the styling framework — BECAUSE timeline-based animations with easing need a JavaScript animation engine which CSS alone does not provide.

Sentiment Analysis ⚓︎
Diagram
Properties
PRODUCTnatural + @nlpjs/core + multilang-sentiment
LICENSEMIT
PHASERun-Time
COVERAGEPresentation Model
USED-BYCOMPONENT: Client NLP ⚭
Description

The natural, @nlpjs/core, and multilang-sentiment libraries perform local sentiment analysis on attendee input in the browser — BECAUSE filtering sentiment at the source reduces server load and can prevent improper submissions.

Language Identification ⚓︎
Diagram
Properties
PRODUCTtinyld + franc + lande
PHASERun-Time
COVERAGEPresentation Model
USED-BYCOMPONENT: Client NLP ⚭
Description

The tinyld, franc, and lande libraries perform local language identification on attendee input in the browser — BECAUSE detecting the message language client-side enables on-the-fly handling without an initial server round-trip.

TIER: Middleware ⚓︎

COMPONENTProperties & Description
Reverse Proxy ⚓︎
Diagram
Properties
PRODUCTHAProxy
LICENSEGPL-2.0
PHASERun-Time
COVERAGERequest Routing Load Balancing Transport Security
USED-BYCOMPONENT: Router ⚭, COMPONENT: Proxy ⚭
Description

HAProxy terminates the inbound HTTP and WebSocket traffic at the edge router, firewalled by NFTables, and forwards it per environment from the proxy instances to the relay layer — BECAUSE a single mature proxy covers both the hardened entry point and the horizontally scaled per-environment forwarding.

Message Broker ⚓︎
Diagram
Properties
PRODUCTMosquitto
LICENSEEPL-2.0
PHASERun-Time
COVERAGEMessage Brokering
USED-BYCOMPONENT: Relay ⚭
Description

Mosquitto brokers the MQTT messages between the thousands of WebSocket connections of the clients and the service layer as a pool of instances per environment — BECAUSE a lightweight, proven MQTT broker sustains the connection count of a large event without business logic of its own.

TIER: Server ⚓︎

COMPONENTProperties & Description
Runtime ⚓︎
Diagram
Properties
PRODUCTNode.js
LICENSEMIT
PHASERun-Time
COVERAGEEnvironment Detection Process Management Server Networking
USED-BYCOMPONENT: Service ⚭, COMPONENT: Junction Orchestrator ⚭
Description

Node.js executes the business services and the Junction orchestrator as single-threaded event loops in the service containers — BECAUSE the message-driven service logic is I/O-bound and an event loop handles it with the least concurrency complexity.

Persistence Layer ⚓︎
Diagram
Properties
PRODUCTDrizzle
ALTERNATIVESPrisma, TypeORM
LICENSEApache-2.0
PHASERun-Time
COVERAGEDatabase Access Database Connectivity Database Schema
USED-BYCOMPONENT: Service ⚭
Description

Drizzle provides the type-safe SQL query builder and schema definition layer between the server’s TypeScript code and PostgreSQL, with its schema generated spec-first from the data model — BECAUSE a thin, zero-overhead typed layer preserves end-to-end TypeScript type-safety and full PostgreSQL feature access without the runtime cost of a heavy ORM.

Static Content Server ⚓︎
Diagram
Properties
PRODUCTJunction
PHASERun-Time
COVERAGEServer Networking Request Processing
USED-BYCOMPONENT: Junction Orchestrator ⚭
Description

Junction serves the static client content over MQTT+ from the backend — BECAUSE the client must be distributed alongside the same messaging infrastructure used for live data.

Argument Parsing ⚓︎
Diagram
Properties
PRODUCTCommander.js
LICENSEMIT
PHASERun-Time
COVERAGEArgument Parsing
USED-BYCOMPONENT: Service ⚭
Description

Commander.js parses the server’s command-line options and arguments to bootstrap application parameters — BECAUSE a mature CLI parser covers option handling at server startup without custom code.

Configuration Loading ⚓︎
Diagram
Properties
PRODUCTdotenvx + YAML
LICENSEBSD-3-Clause, ISC
PHASERun-Time Operate-Time
COVERAGEConfiguration Parsing Configuration
USED-BYCOMPONENT: Service ⚭
Description

dotenvx loads optional environment files into the process environment and the YAML library parses the optional configuration file, together feeding the layered configuration resolved from defaults, file, environment, and command-line — BECAUSE the server’s runtime parameters and secrets must be configurable from files and the BROADCAST_* environment without hardcoding them.

Configuration Validation ⚓︎
Diagram
Properties
PRODUCTValibot
LICENSEMIT
PHASERun-Time
COVERAGEConfiguration Parsing
USED-BYCOMPONENT: Service ⚭
Description

Valibot declares the canonical, strict configuration schema that validates and coerces the merged configuration at startup — BECAUSE a single schema as the source of truth gives fail-fast validation of secrets and a typed configuration surface that catches misconfiguration before the service runs.

AI/LLM Connectivity ⚓︎
Diagram
Properties
PRODUCT@ai-sdk
LICENSEApache-2.0
PHASERun-Time
COVERAGEClient Networking
USED-BYCOMPONENT: Translation Service ⚭
Description

The @ai-sdk library connects the translation service to an external AI/LLM service for on-the-fly translation of message texts — BECAUSE chat and questions must be made available in both German and English.

Container Orchestration ⚓︎
Diagram
Properties
PRODUCTDocker Compose
ALTERNATIVESKubernetes, Nomad
LICENSEApache-2.0
PHASEOperate-Time
COVERAGEInstallation Upgrade Capacity
Description

Docker Compose runs and recreates the service containers of an environment from a per-environment compose file, with the proxy and relay instances added by the same file — BECAUSE a single-host orchestration is sufficient for the per-environment container count and avoids operating a cluster.

TIER: Database ⚓︎

COMPONENTProperties & Description
Database ⚓︎
Diagram
Properties
PRODUCTPostgreSQL
LICENSEPostgreSQL License
PHASERun-Time
COVERAGEStorage Engine Transaction Management Query Language Indexing
USED-BYCOMPONENT: Database ⚭
Description

PostgreSQL stores the authoritative, durable state of every event together with its channels, messages, tokens, and statistics snapshots — BECAUSE the event-centric data model is inherently relational and demands transactional integrity, EU-resident self-hosting, and rich query support for moderation and reporting.

Database Backup ⚓︎
Diagram
Properties
PRODUCTpg_dump
ALTERNATIVESpgBackRest, Barman
LICENSEPostgreSQL License
PHASEOperate-Time
COVERAGEBackup Recovery
Description

The pg_dump utility of PostgreSQL produces the logical database dumps stored together with the filesystem assets on the backup storage and restored with pg_restore — BECAUSE a logical dump is portable across PostgreSQL versions and needs no additional backup server.

ARCH: Development Aspects (DA) ⚓︎

ASPECTProperties & Description
Client/Common/Server Split ⚓︎
Diagram
CATEGORYDescription
Structure

The codebase is organized into src/client, src/common, and src/server modules, with shared types and topic definitions living in the common module imported by both sides — BECAUSE client and server must agree on contracts without duplicating them.

TypeScript Everywhere ⚓︎
Diagram
CATEGORYDescription
Standardization

All client-side and server-side code is written in strongly typed TypeScript against shared type definitions — BECAUSE a single typed language across the stack catches contract mismatches at compile time.

STX Task Running ⚓︎
CATEGORYDescription
Tooling

Build, lint, and run tasks are driven uniformly by the STX task runner with per-module stx.conf files — BECAUSE a single task runner gives every module a consistent developer entry point.

Vite Client Build ⚓︎
Diagram
CATEGORYDescription
Build

The client is built and served in development by Vite, bundling the Vue, Pinia, Reka UI, Tailwind, and Stylus stack into the static client artifact — BECAUSE Vite provides fast HMR development and an optimized production bundle.

Layered Linting ⚓︎
Diagram
CATEGORYDescription
Standardization

Code quality is enforced with ESLint and the faster OxLint for TypeScript, HTMLHint for HTML, and StyleLint for Stylus — BECAUSE multiple focused linters keep each language layer clean and consistent.

Dependency Layering ⚓︎
Diagram
CATEGORYDescription
Dependency

The common module must depend on neither client nor server, while both client and server may depend on common — BECAUSE a one-directional dependency keeps the shared contract free of platform-specific concerns.

Git Codeline ⚓︎
Diagram
CATEGORYDescription
Codeline

The project is versioned in a single Git repository hosted on the self-administered Gitea, with the Software Administrator granting repository access — BECAUSE self-hosted version control keeps source under full organizational control.

Identifier Naming ⚓︎
Diagram
CATEGORYDescription
Standardization

Data-model entities are named in PascalCase and their attributes in camelCase, and both are referred to by exactly these identifiers, set in code font, wherever code or documents mention them (e.g. Event.accessList, Message.senderName) — BECAUSE a single identifier form lets a reader grep from a document straight into the code.

ARCH: Concurrency View (CO) ⚓︎

UNITProperties & Description
Router Process ⚓︎
Diagram
KINDPART-OFHOSTS
ProcessCOMPONENT: Router ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
1 per data center entry pointUNIT: Proxy Pool ⚭stateless round-robin distribution
Description

The router runs as a single front-door process per data center, distributing connections across environments and proxy instances — BECAUSE a stateless balancer can spread load without holding per-connection state.

Proxy Pool ⚓︎
Diagram
KINDPART-OFHOSTS
PoolCOMPONENT: Proxy ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
0..n instances per environmentUNIT: Relay Pool ⚭, UNIT: Service Event Loop ⚭shared-nothing behind the router
Description

The proxy layer runs as a pool of independent, stateless reverse-proxy instances per environment — BECAUSE request handling must scale out horizontally to absorb connection spikes.

Relay Pool ⚓︎
Diagram
KINDPART-OFHOSTS
PoolCOMPONENT: Relay ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
0..n MQTT broker instances per environmentUNIT: Service Event Loop ⚭MQTT topic subscriptions and broker bridging
Description

The relay layer runs as a pool of Mosquitto/MQTT-Plus broker instances, each maintaining thousands of WebSocket connections and fanning out per-event topics — BECAUSE sustaining up to 10000 concurrent connections requires horizontal broker scaling.

Service Event Loop ⚓︎
Diagram
KINDPART-OFHOSTS
EventLoopCOMPONENT: Service ⚭, COMPONENT: Authentication Service ⚭, COMPONENT: Translation Service ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
0..n Node.js instances per environmentUNIT: Database Server ⚭MQTT message passing and database transactions
Description

The service runs as Node.js single-threaded event loops that react to MQTT messages and serialize state changes through database transactions — BECAUSE an event-loop model handles many concurrent I/O-bound interactions without shared-memory races.

Statistics Scheduler ⚓︎
Diagram
KINDPART-OFHOSTS
TaskUNIT: Service Event Loop ⚭COMPONENT: Statistics Service ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
1 active per running eventUNIT: Database Server ⚭timer-driven, writes via database transactions
Description

A scheduled task on the service event loop captures a statistics snapshot every five minutes for each running event — BECAUSE periodic cumulative counts must be produced on a fixed cadence independent of user activity.

Database Server ⚓︎
Diagram
KINDPART-OFHOSTS
ProcessCOMPONENT: Database ⚭
MULTIPLICITYCOORDINATES-WITHCOORDINATION
1 primary per environmentACID transactions with optimistic concurrency via the ORM
Description

PostgreSQL runs as the single authoritative persistence process per environment, serializing concurrent writes through transactions — BECAUSE a single source of truth with ACID guarantees keeps event state consistent under concurrency.

ARCH: Deployment View (DV) ⚓︎

TIERProperties & Description
Client ⚓︎
Diagram
PART-OFLOCATIONSTACK
Attendee and operator devicesTIER: Client ⚭
Description

The client tier is the web client running on the devices of the audience and the operators — BECAUSE the interactive part of the solution must run where the people are, without installation.

Edge ⚓︎
Diagram
PART-OFLOCATIONSTACK
Cloudflare edge network
Description

The edge tier delivers the static client bundle from a global content delivery network — BECAUSE static content is best served close to a large, distributed audience instead of from the data center.

Data Center ⚓︎
Diagram
PART-OFLOCATIONSTACK
Hetzner cloud (Nürnberg, DE), separated into dev, QA, and production environments
Description

The data center tier groups all server-side tiers within one EU-resident hosting location — BECAUSE EU-resident self-hosting satisfies GDPR and minimizes per-event cost versus public cloud.

Middleware ⚓︎
Diagram
PART-OFLOCATIONSTACK
TIER: Data Center ⚭TIER: Middleware ⚭
Description

The middleware tier terminates, balances, and relays the client connections between the Internet and the business services — BECAUSE sustaining thousands of bidirectional connections is a concern separate from the business logic.

Server ⚓︎
Diagram
PART-OFLOCATIONSTACK
TIER: Data Center ⚭TIER: Server ⚭
Description

The server tier runs the business services and the orchestrator — BECAUSE the business logic must scale and change independently of the connection handling and the persistence.

Database ⚓︎
Diagram
PART-OFLOCATIONSTACK
TIER: Data Center ⚭TIER: Database ⚭
Description

The database tier holds the authoritative persistent state — BECAUSE durable state must reside on a protected tier reachable from the business services alone.

NODEProperties & Description
Client Device ⚓︎
Diagram
KINDTIERPLATFORM
DeviceTIER: Client ⚭Browser (desktop, tablet, mobile)
HOSTSINSTANCESCONNECTS-TO
COMPONENT: Web Client ⚭, COMPONENT: Client NLP ⚭1 per attendee or operatorNODE: Cloudflare CDN ⚭, NODE: Edge Router ⚭
NETWORKSDescription
NETWORK: Public Internet ⚭

The attendee and operator devices run the web client and local NLP entirely in the browser — BECAUSE the solution requires no installation and must run on both managed and unmanaged devices.

Cloudflare CDN ⚓︎
Diagram
KINDTIERPLATFORM
ManagedTIER: Edge ⚭Cloudflare edge network
HOSTSINSTANCESCONNECTS-TO
NODE: Edge Router ⚭
NETWORKSDescription
NETWORK: Public Internet ⚭

A Cloudflare CDN edge distributes the static client bundle and static resources close to users — BECAUSE static content must be delivered quickly and stably to a large, distributed audience.

Edge Router ⚓︎
Diagram
KINDTIERPLATFORM
ServerTIER: Middleware ⚭Linux x86-64
HOSTSINSTANCESCONNECTS-TO
UNIT: Router Process ⚭1 per data center entry pointNODE: Proxy Servers ⚭
NETWORKSDescription
NETWORK: Public Internet ⚭, NETWORK: Backend Network ⚭

The edge router terminates inbound HTTP and WebSocket traffic and round-robins it to per-environment proxies — BECAUSE a single hardened entry point must balance load and isolate environments.

Proxy Servers ⚓︎
Diagram
KINDTIERPLATFORM
ServerTIER: Middleware ⚭Linux x86-64
HOSTSINSTANCESCONNECTS-TO
UNIT: Proxy Pool ⚭0..n per environmentNODE: Relay Brokers ⚭
NETWORKSDescription
NETWORK: Backend Network ⚭

The proxy servers run several reverse proxy instances per environment forwarding to the relay brokers — BECAUSE per-environment scaling of request handling needs multiple proxy instances.

Relay Brokers ⚓︎
Diagram
KINDTIERPLATFORM
ServerTIER: Middleware ⚭Linux x86-64
HOSTSINSTANCESCONNECTS-TO
UNIT: Relay Pool ⚭0..n per environment
NETWORKSDescription
NETWORK: Backend Network ⚭

The relay brokers run several MQTT broker instances per environment holding the live WebSocket connections — BECAUSE sustaining thousands of bidirectional connections requires a dedicated, scalable messaging node.

Service Containers ⚓︎
Diagram
KINDTIERPLATFORM
ContainerTIER: Server ⚭OCI containers on Linux x86-64
HOSTSINSTANCESCONNECTS-TO
UNIT: Service Event Loop ⚭, COMPONENT: Junction Orchestrator ⚭0..n per environmentNODE: Relay Brokers ⚭, NODE: Database Server ⚭
NETWORKSDescription
NETWORK: Backend Network ⚭, NETWORK: Data Network ⚭

The service containers run the Node.js business services and the Junction orchestrator per environment — BECAUSE containerized services give reproducible, independently scalable business logic.

Database Server ⚓︎
Diagram
KINDTIERPLATFORM
ServerTIER: Database ⚭Linux x86-64
HOSTSINSTANCESCONNECTS-TO
UNIT: Database Server ⚭1 primary per environment
NETWORKSDescription
NETWORK: Data Network ⚭

The database server runs PostgreSQL with filesystem asset storage as the authoritative persistence node — BECAUSE durable state must reside on a protected, non-public node.

NETWORKProperties & Description
Public Internet ⚓︎
Diagram
SCOPEPROTOCOLSADDRESSING
PublicHTTPS 443, WSS 443Public IPv4 and IPv6
Description

The public Internet carries all attendee and operator traffic to the CDN and the edge router over TLS only — BECAUSE the audience joins from arbitrary, untrusted networks.

Backend Network ⚓︎
Diagram
SCOPEPROTOCOLSADDRESSING
PrivateHTTP, WS, WSSHetzner private vSwitch, per-environment VLAN
Description

The backend network connects the router, the proxies, the relays, and the service containers within the data center — BECAUSE the internal hops must stay unreachable from the Internet while remaining cheap to scale per environment.

Data Network ⚓︎
Diagram
SCOPEPROTOCOLSADDRESSING
IsolatedTCP 5432Hetzner private vSwitch, database subnet
Description

The data network connects the service containers to the database server only — BECAUSE the persistence node must be reachable from the business services alone.

ARCH: Operations View (OV) ⚓︎

CONCERNProperties & Description
Release Rollout ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Upgradeon every release, outside running eventsPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Event-Safe Maintenance ⚭NODE: Service Containers ⚭COMPONENT: Container Orchestration ⚭
Description

A release is rolled out per environment by pulling the new service container images and recreating the service containers between events — BECAUSE a running broadcast must never be interrupted by a rollout.

Config-File Provisioning ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Configurationbefore each eventPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Event-Safe Maintenance ⚭COMPONENT: Service ⚭COMPONENT: Configuration Loading ⚭
Description

Streaming providers, their parameters, admins, and broker URLs are provisioned through a broadcast.yaml configuration file read by the service — BECAUSE provider endpoints and administrators are operational concerns kept out of the database.

Role Assignment ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Administrationon event creationPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Privacy by Design ⚭COMPONENT: Authentication Service ⚭
Description

The first Manager of an event is assigned by the Software Administrator through configuration rather than a UI — BECAUSE permanent roles must be controlled administratively to uphold privacy by design.

Live Statistics Monitoring ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Monitoringduring each eventPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Concurrent Attendee Scale ⚭, REQUIREMENT: Live Diagnosability ⚭COMPONENT: Statistics Service ⚭, NODE: Proxy Servers ⚭, NODE: Relay Brokers ⚭
Description

During a broadcast the administrator watches the statistics dashboard for the attendee curve, the channel distribution, and the authentication-flow counters — BECAUSE capacity and login problems must be detected while the audience is still online.

Authentication Diagnostics ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Incidenton reported login failuresPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Live Diagnosability ⚭COMPONENT: Authentication Service ⚭COMPONENT: Logging ⚭
Description

Reported attendee login failures are diagnosed from the recorded token states (issued, sent, used) and the server log — BECAUSE operators must find out why an attendee fails to authenticate while the event runs.

Horizontal Scaling ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Capacityahead of large eventsPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Horizontal Scalability ⚭, REQUIREMENT: Concurrent Attendee Scale ⚭NODE: Proxy Servers ⚭, NODE: Relay Brokers ⚭, NODE: Service Containers ⚭COMPONENT: Container Orchestration ⚭
Description

Operators scale an environment by adding proxy, relay, and service instances ahead of large events — BECAUSE townhall-scale audiences of up to 10000 require capacity provisioned per environment.

Database Backup ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Backupnightly and before each eventPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Event Setup Recovery ⚭, REQUIREMENT: GDPR Compliance ⚭NODE: Database Server ⚭, ENTITY: Event ⚭COMPONENT: Database Backup ⚭
Description

The PostgreSQL database and the filesystem assets are dumped nightly and before each event onto the backup storage of the same data center — BECAUSE event setups must survive a database loss without leaving the EU hosting boundary.

Database Restore ⚓︎
Diagram
CATEGORYTRIGGEROPERATOR
Recoveryon database lossPERSONA: Sven ⚭
ADDRESSESELEMENTSTOOLS
REQUIREMENT: Event Setup Recovery ⚭NODE: Database Server ⚭, NODE: Service Containers ⚭COMPONENT: Database Backup ⚭, COMPONENT: Container Orchestration ⚭
Description

A lost database is rebuilt from the latest dump onto a fresh database server and the service containers are recreated against it — BECAUSE the recovery must be a rehearsed procedure rather than an improvisation during an event.

ARCH: Quality Perspectives (QP) ⚓︎

TACTICProperties & Description
Connection Scaling ⚓︎
Diagram
Properties
QUALITYScalability
ADDRESSESREQUIREMENT: Concurrent Attendee Scale ⚭, REQUIREMENT: Horizontal Scalability ⚭
MECHANISMstateless proxy and relay pools behind a round-robin router
TRADES-OFFMaintainability
AFFECTSCOMPONENT: Router ⚭, COMPONENT: Proxy ⚭, COMPONENT: Relay ⚭, UNIT: Router Process ⚭, UNIT: Proxy Pool ⚭, UNIT: Relay Pool ⚭, TIER: Middleware ⚭, NODE: Edge Router ⚭, NODE: Proxy Servers ⚭, NODE: Relay Brokers ⚭
OPERATED-BYCONCERN: Horizontal Scaling ⚭
TOOLSCOMPONENT: Container Orchestration ⚭
Description

The proxy and relay tiers scale horizontally as stateless pools so connection load distributes across instances per environment — BECAUSE a single broker cannot hold the required attendee count while a sharded pool can.

Live Failover Continuity ⚓︎
Diagram
Properties
QUALITYAvailability
ADDRESSESREQUIREMENT: Provider Failover Continuity ⚭
MECHANISMmulti-provider resources with server-pushed active-resource switch
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Web Client ⚭, ENTITY: Channel ⚭, ENTITY: Resource ⚭
TOOLSCOMPONENT: Messaging ⚭
Description

Each channel carries multiple configured resources and the service pushes the active-resource change over MQTT so clients follow automatically — BECAUSE provider outages must be survived without attendee action.

Privacy by Design ⚓︎
Diagram
Properties
QUALITYPrivacy
ADDRESSESREQUIREMENT: Privacy by Design ⚭, REQUIREMENT: GDPR Compliance ⚭
MECHANISMautomated anonymization on finish and no permanent accounts
TRADES-OFFUsability
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Database ⚭, ENTITY: User ⚭, ENTITY: Message ⚭, ENTITY: AuthorizationToken ⚭, ENTITY: SessionToken ⚭
Description

Personal data exists only while an event runs and is automatically anonymized or deleted on finish, with no standing user accounts — BECAUSE minimizing retained personal data is the strongest guarantee against data-protection risk.

Email-Verified Access ⚓︎
Diagram
Properties
QUALITYSecurity
ADDRESSESREQUIREMENT: Unguessable Access Tokens ⚭
MECHANISMunguessable URLs plus time-limited one-time tokens and single sessions
TRADES-OFFUsability
AFFECTSCOMPONENT: Authentication Service ⚭, ENTITY: AuthorizationToken ⚭, ENTITY: SessionToken ⚭
Description

Access requires an unguessable URL and a short-lived one-time token, with only one active session enforced per user per event — BECAUSE layered, expiring secrets keep unauthorized viewers out without permanent credentials.

Real-Time Reactivity ⚓︎
Diagram
Properties
QUALITYPerformance
ADDRESSESREQUIREMENT: Live Configuration Latency ⚭
MECHANISMMQTT publish/subscribe fan-out on per-event topics
AFFECTSCOMPONENT: Relay ⚭, COMPONENT: Service ⚭, COMPONENT: Web Client ⚭, UNIT: Relay Pool ⚭, UNIT: Service Event Loop ⚭
TOOLSCOMPONENT: Messaging ⚭
Description

Configuration and interaction changes are published on per-event MQTT topics and fanned out to subscribers — BECAUSE publish/subscribe propagates every change to all clients within the required time without polling.

Abuse Resistance ⚓︎
Diagram
Properties
QUALITYSecurity
ADDRESSESREQUIREMENT: Interaction Abuse Throttling ⚭
MECHANISMper-user rate limiting plus client and server sentiment filtering
TRADES-OFFUsability
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Client NLP ⚭
TOOLSCOMPONENT: Sentiment Analysis ⚭
Description

Interaction is protected by configurable per-user throttling and optional client- and server-side sentiment checks — BECAUSE combining rate limits with content filtering defends the interaction channels against flooding and abuse.

Universal Browser Reach ⚓︎
Diagram
Properties
QUALITYPortability
ADDRESSESREQUIREMENT: Cross-Browser Compatibility ⚭, REQUIREMENT: Mobile Usability ⚭
MECHANISMstandards-based responsive web client with no plugins
AFFECTSCOMPONENT: Web Client ⚭, NODE: Client Device ⚭
TOOLSCOMPONENT: UI Framework ⚭, COMPONENT: Styling Framework ⚭
Description

The client is a standards-based responsive web application that adapts from desktop to mobile without plugins — BECAUSE a plugin-free web app reaches every recent browser on managed and unmanaged devices.

Provider Stream Passthrough ⚓︎
Diagram
Properties
QUALITYPerformance
ADDRESSESREQUIREMENT: Streaming Quality ⚭
MECHANISMprovider-hosted encoding and delivery embedded by the client without transcoding
AFFECTSCOMPONENT: Web Client ⚭, ENTITY: Channel ⚭, ENTITY: Resource ⚭
Description

The video is encoded and delivered by the streaming provider in the produced 1080p30 quality per language and embedded by the client as a resource of the channel, so the solution never touches the video itself — BECAUSE transcoding or relaying the video through the solution would cap the quality at the solution’s own capacity.

Network Segmentation ⚓︎
Diagram
Properties
QUALITYSecurity
ADDRESSESREQUIREMENT: Isolated Persistence Node ⚭, REQUIREMENT: GDPR Compliance ⚭
MECHANISMTLS-only public ingress, private backend VLAN, and an isolated database subnet
TRADES-OFFMaintainability
AFFECTSTIER: Middleware ⚭, TIER: Database ⚭, NODE: Edge Router ⚭, NODE: Database Server ⚭, NETWORK: Public Internet ⚭, NETWORK: Backend Network ⚭, NETWORK: Data Network ⚭
TOOLSCOMPONENT: Reverse Proxy ⚭
Description

Traffic passes three segments, the TLS-only public Internet up to the hardened router, the private backend VLAN between the connection-handling tiers and the services, and the isolated data subnet reaching the database from the service containers alone — BECAUSE every hop an attacker has to cross before reaching the persisted personal data is one more chance to stop them.

Dump-Based Recovery ⚓︎
Diagram
Properties
QUALITYReliability
ADDRESSESREQUIREMENT: Event Setup Recovery ⚭
MECHANISMlogical database dumps with a rehearsed restore onto a fresh server
TRADES-OFFAvailability
AFFECTSNODE: Database Server ⚭, NODE: Service Containers ⚭, ENTITY: Event ⚭, ENTITY: Message ⚭
OPERATED-BYCONCERN: Database Backup ⚭, CONCERN: Database Restore ⚭
TOOLSCOMPONENT: Database Backup ⚭
Description

The database is dumped logically on a schedule tightened before each event and rebuilt from the latest dump onto a fresh server by a rehearsed procedure — BECAUSE a portable dump plus a drilled restore meets the recovery objectives without operating a standby database.

Edge Asset Delivery ⚓︎
Diagram
Properties
QUALITYScalability
ADDRESSESREQUIREMENT: Start-Surge Asset Delivery ⚭
MECHANISMstatic client bundle served from a global CDN edge
AFFECTSCOMPONENT: Web Client ⚭, TIER: Edge ⚭, NODE: Cloudflare CDN ⚭
TOOLSCOMPONENT: Build Tool ⚭
Description

The client bundle is built into static files and served from the CDN edge close to the audience, so the start surge of an event downloads from the edge instead of from the data center — BECAUSE a CDN absorbs ten thousand simultaneous downloads which would saturate the single data center entry point.

Shared Typed Contracts ⚓︎
Diagram
Properties
QUALITYMaintainability
ADDRESSESREQUIREMENT: Compile-Time Contract Safety ⚭
MECHANISMcommon module of shared types compiled by one TypeScript toolchain on both sides
AFFECTSCOMPONENT: Web Client ⚭, COMPONENT: Service ⚭, ASPECT: Client/Common/Server Split ⚭, ASPECT: TypeScript Everywhere ⚭, ASPECT: Dependency Layering ⚭, ASPECT: Layered Linting ⚭, ASPECT: Identifier Naming ⚭
TOOLSCOMPONENT: Language ⚭, COMPONENT: Linting ⚭
Description

The message topics and payload types live once in the common module and are compiled into both client and server by the same strongly typed toolchain, layered so that the module depends on neither side — BECAUSE a contract shared at the type level turns every mismatch into a build error.

Snapshot Observability ⚓︎
Diagram
Properties
QUALITYMaintainability
ADDRESSESREQUIREMENT: Live Diagnosability ⚭
MECHANISMperiodic statistics snapshots plus recorded token states and structured logs
AFFECTSCOMPONENT: Statistics Service ⚭, COMPONENT: Authentication Service ⚭, UNIT: Statistics Scheduler ⚭, ENTITY: EventStatistic ⚭, ENTITY: AuthorizationToken ⚭
OPERATED-BYCONCERN: Live Statistics Monitoring ⚭, CONCERN: Authentication Diagnostics ⚭
TOOLSCOMPONENT: Logging ⚭
Description

A scheduled task snapshots the event, channel, and user counters every five minutes and the authentication module records every token state next to its structured log — BECAUSE the running event can be observed and a failed login explained from data the solution collects anyway.

ARCH: Design Decisions (DD) ⚓︎

DECISION: Use MQTT over WebSockets as the live transport ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Concurrent Attendee Scale ⚭, REQUIREMENT: Live Configuration Latency ⚭, PREMISE: Attendee Networks Pass WebSocket Traffic ⚭
AFFECTSCOMPONENT: Relay ⚭, COMPONENT: Service ⚭, UNIT: Relay Pool ⚭
DECIDESTACTIC: Real-Time Reactivity ⚭, COMPONENT: Messaging ⚭, COMPONENT: Message Broker ⚭
ALTERNATIVESREST polling, bespoke WebSocket protocol
WHENA single event must push video state, configuration changes, chat, questions, and likes to between 2500 and 10000 concurrently connected browsers with sub-two-second latency, and the same channel must carry bidirectional interaction.
WHATWe use MQTT over WebSockets as the live transport, brokered by Mosquitto and MQTT-Plus in a horizontally scaled relay tier, with per-event topics for fan-out and a thin Node.js service reacting to published messages.
WHYMQTT’s publish/subscribe model fans a single publish out to thousands of subscribers far more cheaply than per-client REST polling or bespoke socket handling, and its mature broker ecosystem already solves connection scaling; a plain HTTP/REST design was rejected because it cannot deliver low-latency server-initiated fan-out at this connection count.
CONSEQUENCESEvery live capability has to be expressible as messages on per-event topics, and the relay tier becomes a scaling and operating unit of its own, while attendee networks blocking WebSocket traffic lock their users out of the live channel.

DECISION: Self-host on Hetzner instead of public cloud ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: GDPR Compliance ⚭, REQUIREMENT: Per-Event Cost Efficiency ⚭, PREMISE: EU Hosting on Self-Operated Infrastructure ⚭
AFFECTSTIER: Data Center ⚭, ASPECT: Git Codeline ⚭
ALTERNATIVESAzure, AWS, GitHub
WHENThe solution must be GDPR-compliant with EU data residency, and a primary economic goal is to minimize recurring cost per event, the solution having been built specifically to replace a costlier third-party platform.
WHATWe operate all server tiers on self-managed Hetzner infrastructure in Nürnberg, Germany, separated into dev, QA, and production environments, rather than on Azure or AWS, and keep the source on a self-administered Gitea rather than on a hosted forge.
WHYHetzner delivers EU-resident hosting at a fraction of hyperscaler cost, satisfying both the data-residency and cost-minimization forces; public cloud was rejected because its per-event egress and compute pricing would undermine the cost goal that justified building the solution at all.
CONSEQUENCESProvisioning, scaling, monitoring, and backup are operated by the team itself instead of being consumed as managed services, so the Operations View carries the procedures a hyperscaler would have provided.

DECISION: Privacy by design with no permanent user accounts ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Privacy by Design ⚭, REQUIREMENT: GDPR Compliance ⚭, PREMISE: Message Texts Contain Personal Data ⚭
AFFECTSCOMPONENT: Authentication Service ⚭, COMPONENT: Service ⚭, ENTITY: User ⚭, PRINCIPLE: Privacy-Visible Identity ⚭
DECIDESTACTIC: Privacy by Design ⚭
ALTERNATIVESpersistent user accounts
WHENEvents handle personal attendee data under GDPR, yet attendance is transient and the operator wants to carry as little personal-data liability as possible while still supporting per-event identity for chat and moderation.
WHATWe hold no permanent user accounts: users exist only via an event access list, role grant, or pattern match, and on event finish an automated procedure anonymizes messages and deletes users, tokens, and Moderator roles.
WHYDeleting personal data the moment it is no longer needed minimizes both breach impact and compliance burden, which outweighs the convenience of persistent accounts; a conventional account model was rejected because standing personal data is exactly the liability privacy by design exists to avoid.

DECISION: Email one-time token as the authentication factor ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Unguessable Access Tokens ⚭, PREMISE: Attendees Read Their Email While Logging In ⚭, PREMISE: Email Gateway Delivers Tokens Within Minutes ⚭
AFFECTSCOMPONENT: Authentication Service ⚭, DIALOG-PATTERN: Two-Factor Login ⚭, PRINCIPLE: Frictionless Joining ⚭
DECIDESTACTIC: Email-Verified Access ⚭
ALTERNATIVESpassword accounts, external identity providers
WHENAccess must be limited to invited attendees without permanent credentials, while also supporting frictionless and fully automated joining for large distributions provisioned from the Event Registration System.
WHATWe authenticate via a one-time “NNN-NNN” token emailed to the attendee’s address, with optionally pre-generated tokens embeddable in the access URL for automatic entry, and we enforce a single active session per user per event.
WHYAn emailed token proves control of the authorized address with zero stored credentials and reuses email as a channel everyone already has, fitting the no-accounts stance; password accounts and external identity providers were rejected as too heavy and as reintroducing the persistent personal data the design forbids.

DECISION: Decouple logical Channels from physical provider Resources ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Provider Failover Continuity ⚭, PREMISE: Streaming Providers Deliver the Video ⚭, PREMISE: German and English Cover All Events ⚭
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Web Client ⚭, ENTITY: Channel ⚭, ENTITY: Resource ⚭
DECIDESTACTIC: Live Failover Continuity ⚭
ALTERNATIVESdirect binding of clients to a single provider stream
WHENProductions ship in multiple languages and resolutions and must survive a streaming-provider outage mid-event by switching providers without attendees having to act or even notice.
WHATWe model an event as logical Channels each backed by multiple physical Resources, where exactly one Channel and one Resource are active at a time, and switching the active Resource is pushed live to all clients.
WHYSeparating the audience-facing logical stream from interchangeable provider endpoints makes live failover a state change rather than a reconfiguration, satisfying both the multi-variant and continuity forces; binding clients directly to a single provider was rejected because it would make any provider problem an event-ending failure.

DECISION: Embed provider-delivered video instead of self-hosted streaming ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Streaming Quality ⚭, REQUIREMENT: Per-Event Cost Efficiency ⚭, PREMISE: Streaming Providers Deliver the Video ⚭
AFFECTSCOMPONENT: Web Client ⚭, ENTITY: Channel ⚭, ENTITY: Resource ⚭, ENTITY: Streaming Provider ⚭
DECIDESTACTIC: Provider Stream Passthrough ⚭
ALTERNATIVESself-hosted media server (e.g. OvenMediaEngine, Wowza), relaying the video through the data center
WHENProductions are delivered in 1080p30 in two languages to up to 10000 attendees, the streaming providers already encode and distribute the video worldwide, and the per-event cost has to stay low.
WHATWe leave the video entirely with the streaming providers: the client embeds the provider player of the active resource, and the solution carries only the metadata telling every client which resource to play.
WHYA provider delivers the produced quality from a global network for a per-event fee, whereas self-hosted streaming would need transcoding and egress capacity for 10000 viewers in the data center; a self-hosted media server was rejected as the single most expensive and most fragile piece the solution could take on.
CONSEQUENCESThe solution depends on the providers for the entire video path, so the provider failover has to be a first-class mechanism, and the video quality is capped by what the providers deliver rather than tunable by the solution.

DECISION: One modular service process instead of microservices ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Per-Event Cost Efficiency ⚭, REQUIREMENT: Compile-Time Contract Safety ⚭, REQUIREMENT: Horizontal Scalability ⚭
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Authentication Service ⚭, COMPONENT: Translation Service ⚭, COMPONENT: Statistics Service ⚭, UNIT: Service Event Loop ⚭, NODE: Service Containers ⚭
ALTERNATIVESone service per capability (authentication, messaging, translation, statistics)
WHENThe business logic of events, access, moderation, translation, and statistics is small and shares one data model, the connection load is carried by the relay tier anyway, and a small team operates the solution itself.
WHATWe run the entire business logic as one Node.js service process with authentication, translation, and statistics as modules inside it, scaled by running several identical instances per environment.
WHYThe scaling problem of the solution is the connection count, which the relay tier solves, not the business logic, so splitting it would buy nothing but network hops, partial failures, and contracts to keep in sync; per-capability services were rejected because they multiply the operating effort of a self-hosted solution.
CONSEQUENCESEvery module shares the release cycle and the failure domain of the service, and a module growing a load profile of its own has to be carved out later at the cost of a refactoring.

DECISION: TypeScript with a shared common module across client and server ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Compile-Time Contract Safety ⚭
AFFECTSASPECT: Client/Common/Server Split ⚭, ASPECT: TypeScript Everywhere ⚭, ASPECT: Dependency Layering ⚭, ASPECT: Identifier Naming ⚭
DECIDESTACTIC: Shared Typed Contracts ⚭, COMPONENT: Language ⚭
ALTERNATIVESplain JavaScript, per-tier types generated from an interface description (e.g. OpenAPI, AsyncAPI)
WHENClient and server exchange dozens of message types over MQTT topics, both sides evolve together in one repository, and a contract mismatch would surface only during a live event.
WHATWe write client, server, and a common module in TypeScript, keep every topic and payload type in the common module, and let both sides import it, with the common module depending on neither of them.
WHYSharing the types directly makes the compiler the contract check with no generator and no drift between a description and the code; plain JavaScript was rejected as it leaves mismatches to runtime, and generated per-tier types as they reintroduce an intermediate description to keep in sync.

DECISION: Vue.js single-page client with headless widgets ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Cross-Browser Compatibility ⚭, REQUIREMENT: Mobile Usability ⚭, REQUIREMENT: Live Configuration Latency ⚭
AFFECTSCOMPONENT: Web Client ⚭, ASPECT: Vite Client Build ⚭
DECIDESTACTIC: Universal Browser Reach ⚭, COMPONENT: UI Framework ⚭, COMPONENT: Widget Framework ⚭, COMPONENT: Build Tool ⚭
ALTERNATIVESReact, Svelte, server-rendered pages with progressive enhancement
WHENThe attendee and operator screens run in any recent browser on managed and unmanaged desktop and mobile devices, react to server-pushed changes within seconds, and are styled to the corporate design without a native look.
WHATWe build the client as a Vue.js single-page application composed of headless Reka UI widgets styled with Tailwind CSS, bundled by Vite into static files.
WHYA reactive component model maps server-pushed state straight onto the screen, and headless widgets give accessible behavior while leaving the styling free; React was rejected for its heavier toolchain in a small team, Svelte for its thinner ecosystem, and server-rendered pages because they cannot follow live state without reloads.

DECISION: HAProxy as a two-stage router and proxy edge ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Horizontal Scalability ⚭, REQUIREMENT: Isolated Persistence Node ⚭
AFFECTSCOMPONENT: Router ⚭, COMPONENT: Proxy ⚭, UNIT: Router Process ⚭, UNIT: Proxy Pool ⚭, TIER: Middleware ⚭, NODE: Edge Router ⚭, NODE: Proxy Servers ⚭
DECIDESCOMPONENT: Reverse Proxy ⚭
ALTERNATIVESnginx, Traefik, a managed cloud load balancer
WHENTen thousand long-lived WebSocket connections per event have to enter one hardened data center entry point and be spread across the per-environment proxy and relay instances, with dev, QA, and production separated at the edge.
WHATWe terminate all traffic at one HAProxy router process per entry point, firewalled by NFTables, which round-robins it to a pool of HAProxy proxy instances per environment forwarding to the relay brokers.
WHYHAProxy handles WebSocket upgrades and connection counts of this size with a mature configuration model and serves both stages with one product; nginx was rejected for its weaker connection-level balancing, Traefik for its container-centric configuration, and a managed load balancer because the solution is self-hosted.
CONSEQUENCESThe router is a single point of entry per data center and its capacity is the ceiling of the environment, and every routing change touches a hand-maintained configuration.

DECISION: Three network segments with an isolated database subnet ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Isolated Persistence Node ⚭, REQUIREMENT: GDPR Compliance ⚭
AFFECTSNETWORK: Public Internet ⚭, NETWORK: Backend Network ⚭, NETWORK: Data Network ⚭, NODE: Database Server ⚭, TIER: Database ⚭
DECIDESTACTIC: Network Segmentation ⚭
ALTERNATIVESone flat private network, database attached to the backend network
WHENThe persisted personal data of the attendees lives on the database server, while the router, proxies, and relays face the Internet and are the parts most likely to be compromised.
WHATWe segment the data center into a private backend VLAN carrying the router, proxies, relays, and services, and an isolated data subnet carrying only the database and the service containers, behind the TLS-only public Internet.
WHYA compromised connection-handling node then still has no route to the database, which is the strongest containment available at no recurring cost on a private vSwitch; a flat network was rejected because it makes every node a stepping stone to the personal data.

DECISION: Single-host Docker Compose instead of a cluster orchestrator ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Per-Event Cost Efficiency ⚭, REQUIREMENT: Horizontal Scalability ⚭, REQUIREMENT: Event-Safe Maintenance ⚭
AFFECTSNODE: Service Containers ⚭, NODE: Proxy Servers ⚭, NODE: Relay Brokers ⚭
DECIDESCOMPONENT: Container Orchestration ⚭
ALTERNATIVESKubernetes, Nomad
WHENEach environment runs a handful of proxy, relay, and service instances on self-managed servers, scaling is planned ahead of an event rather than reacting to load, and rollouts happen only between events.
WHATWe run and recreate the containers of an environment with Docker Compose from one compose file per environment, adding instances by editing that file and recreating between events.
WHYPlanned, per-event scaling and rollouts between events need no scheduler, self-healing, or rolling updates, so a cluster would add an operating burden without a benefit; Kubernetes and Nomad were rejected because operating the cluster would cost more than the solution it hosts.
CONSEQUENCESThere is no automatic failover of a crashed instance during an event, and growing beyond one host per environment means revisiting this decision.

DECISION: PostgreSQL as the single self-hosted relational store ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: GDPR Compliance ⚭, REQUIREMENT: Event Setup Recovery ⚭, REQUIREMENT: Per-Event Cost Efficiency ⚭, PREMISE: EU Hosting on Self-Operated Infrastructure ⚭
AFFECTSCOMPONENT: Database ⚭, UNIT: Database Server ⚭, NODE: Database Server ⚭, TIER: Database ⚭
DECIDESCOMPONENT: Database ⚭
ALTERNATIVESa document store (e.g. MongoDB), an embedded database (e.g. SQLite), a managed cloud database
WHENEvents, channels, messages, tokens, and statistics form a relational model with transactional invariants, the data has to stay in the EU data center, and moderation and reporting need ad-hoc queries over it.
WHATWe persist all state in one self-hosted PostgreSQL primary per environment, accessed by the service alone, with the filesystem beside it for the static assets.
WHYA relational store with ACID transactions matches the model and the consistency the moderation needs, and PostgreSQL self-hosts on the same servers at no license cost; a document store was rejected for its weaker invariants, an embedded database for its single-writer limit across service instances, and a managed database as it leaves the self-hosted boundary.

DECISION: Typed SQL builder instead of a full ORM ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Compile-Time Contract Safety ⚭, REQUIREMENT: Concurrent Attendee Scale ⚭
AFFECTSCOMPONENT: Service ⚭, COMPONENT: Database ⚭
DECIDESCOMPONENT: Persistence Layer ⚭
ALTERNATIVESPrisma, TypeORM
WHENThe service persists the event state through TypeScript against PostgreSQL, the schema is generated spec-first from the data model, and the message handlers have to stay cheap under the load of a large event.
WHATWe access PostgreSQL through Drizzle, a typed SQL query builder and schema definition layer, with the schema derived from the data model.
WHYA thin typed layer keeps the end-to-end type safety of the shared contracts down to the database without the query overhead and abstraction leaks of a heavy ORM; Prisma was rejected for its separate schema language and query engine, TypeORM for its runtime cost and weaker typing.

DECISION: Logical dumps instead of continuous archiving for backup ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Event Setup Recovery ⚭, REQUIREMENT: Per-Event Cost Efficiency ⚭
AFFECTSNODE: Database Server ⚭
DECIDESTACTIC: Dump-Based Recovery ⚭, COMPONENT: Database Backup ⚭
ALTERNATIVESpgBackRest, Barman (continuous WAL archiving with point-in-time recovery)
WHENThe recovery objective tolerates the loss of a day of changes (an hour right before an event), the data volume per event is small, and the backup must stay within the EU data center without a backup server of its own.
WHATWe back up with logical pg_dump dumps taken nightly and before each event onto the backup storage of the data center and restore them with pg_restore onto a fresh server.
WHYA logical dump is portable across PostgreSQL versions, needs no additional server, and meets the objectives as the data changes mainly before an event; continuous archiving was rejected because point-in-time recovery buys nothing for data that is anonymized at the end of every event anyway.

DECISION: Serve the static client from a CDN edge outside the data center ⚓︎

STATUSAccepted
DRIVEN-BYREQUIREMENT: Start-Surge Asset Delivery ⚭, REQUIREMENT: GDPR Compliance ⚭, PREMISE: Connection Surge at Event Start ⚭
AFFECTSTIER: Edge ⚭, NODE: Cloudflare CDN ⚭, ENTITY: Content CDN ⚭
DECIDESTACTIC: Edge Asset Delivery ⚭
ALTERNATIVESserving the bundle from the data center router, a second Hetzner location
WHENUp to 10000 attendees download the client bundle within the same minute at the start of an event, the data center has one entry point, and the personal data has to stay within the EU.
WHATWe serve the static client bundle and static resources from a Cloudflare CDN edge, while every live connection and every request carrying personal data goes to the data center directly.
WHYThe bundle is public, identical for everyone, and cacheable, exactly what a CDN absorbs at any scale, so the start surge never reaches the data center; serving it from the router was rejected because the surge would compete with the live connections for the same entry point.
CONSEQUENCESOnly static, non-personal content leaves the EU hosting boundary, but the CDN sees the client addresses, so the data processing agreement with the CDN provider is part of the GDPR compliance evidence.

ARCH: Code Patterns (CP) ⚓︎

CODE-PATTERN: Declarative Permission Check ⚓︎

APPLIES-TOCOMPONENT: Service ⚭, COMPONENT: Authentication Service ⚭, ROLE: Attendee ⚭, ROLE: Moderator ⚭, ROLE: Presenter ⚭, ROLE: Manager ⚭, ROLE: Administrator ⚭
REALIZESTACTIC: Email-Verified Access ⚭
DECIDED-BYDECISION: Privacy by design with no permanent user accounts ⚭
TOOLSCOMPONENT: Persistence Layer ⚭
AVOIDrole checks in the client alone, or an ad-hoc if (session.role === ...) inside a DAO method

The authorization model is coded as one declarative permission table, holding exactly one entry per PERMISSION of the Authorization Model (identified by its anchor id) with the role, the entity, the granted operations, the admitted lifecycle states, and an optional condition function, which the single authorize() evaluates for every operation after the event scope check, denying whatever no entry grants — BECAUSE the table is then reviewed line by line against the specification, while a check spread over the code is neither complete nor auditable.

type Permission<E extends Entity> = {    id:         string    role:       Role    entity:     E    operations: Operation[]    states?:    string[]    condition?: Condition<E>}const permissions: AnyPermission[] = [    { id: "moderator-read-messages", role: "moderator", entity: "Message", operations: [ "read" ] },    { id: "moderator-decide",        role: "moderator", entity: "Message", operations: [ "accept", "reject" ] },    { id: "moderator-forward",       role: "moderator", entity: "Message", operations: [ "forward", "update" ],      states: [ "accepted", "forwarded" ],      condition: ({ operation, obj, changes }) => obj.type === "Question"          && (operation !== "update" || confinedTo(changes, "presenterAnnotation", "predecessorId", "questionTags")) }]export const authorize = async (db: DB, session: Session, operation: Operation,    entity: Entity, obj: unknown, changes: object = {}): Promise<void> => {    if (session.role !== "administrator"        && (session.user === null || await eventOf[entity](db, obj as Ref) !== session.user.eventId))        throw new AuthorizationError(session, operation, entity)    const state = (obj as { state?: string }).state ?? ""    const ctx   = { db, session, operation, obj, changes } as Context<Entity>    for (const p of permissions) {        if (p.role !== session.role || p.entity !== entity || !p.operations.includes(operation))            continue        if (p.states !== undefined && operation !== "create" && !p.states.includes(state))            continue        if (p.condition !== undefined && !(await (p.condition as Condition<Entity>)(ctx)))            continue        return    }    throw new AuthorizationError(session, operation, entity)}

CODE-PATTERN: DAO per Entity ⚓︎

APPLIES-TOCOMPONENT: Service ⚭, ENTITY: Event ⚭, ENTITY: Channel ⚭, ENTITY: Message ⚭, ENTITY: AuthorizationToken ⚭, ENTITY: SessionToken ⚭
REALIZESTACTIC: Shared Typed Contracts ⚭
DECIDED-BYDECISION: Typed SQL builder instead of a full ORM ⚭, DECISION: PostgreSQL as the single self-hosted relational store ⚭
TOOLSCOMPONENT: Persistence Layer ⚭, COMPONENT: Database ⚭
USESCODE-PATTERN: Declarative Permission Check ⚭
AVOIDa query assembled outside the DAO of its entity, or a DAO writing the table of another entity

Every entity of the Data Model is persisted through exactly one Data Access Object class (app-db-dao-dm-*.ts, a lifecycle-carrying entity through app-db-dao-sm-*.ts), which takes the session and whole objects (a draft to create, the changed row to update), authorizes every operation through the shared core before touching the Drizzle table, and bundles the writes of one operation into one transaction — BECAUSE the DAO is then the single place where an entity meets its table, its permissions, and its invariants, so a schema or permission change is applied once.

export class SessionTokenDAO {    constructor (protected core: DB) {}    async create (session: Session, draft: Draft<SessionToken>): Promise<SessionToken> {        const db = this.core.require()        /*  authorize the creation on the draft  */        await this.core.authorize(session, "create", "SessionToken", draft)        /*  bundle multiple operations into a single transaction  */        return db.transaction(async (tx) => {            /*  close any prior session of the user for the event (SPEC-DR single-session)  */            await tx.delete(schema.sessionTokens).where(and(                eq(schema.sessionTokens.userId,  draft.userId),                eq(schema.sessionTokens.eventId, draft.eventId)))            /*  store the draft  */            const [ row ] = await tx.insert(schema.sessionTokens).values(draft).returning()            return row        })    }}

CODE-PATTERN: Version-Checked Write ⚓︎

APPLIES-TOCOMPONENT: Service ⚭, UNIT: Service Event Loop ⚭, ENTITY: Event ⚭, ENTITY: Channel ⚭, ENTITY: Message ⚭, ENTITY: SessionToken ⚭
DECIDED-BYDECISION: One modular service process instead of microservices ⚭
TOOLSCOMPONENT: Persistence Layer ⚭
USESCODE-PATTERN: DAO per Entity ⚭
AVOIDa last-writer-wins UPDATE of the whole row, or a read-modify-write across two statements

Every row carries a version column, and every update or deletion of a DAO loads the stored row, derives the changed attributes (changesOf), and writes them in one statement whose WHERE also matches the version the caller based its object on, incrementing it (bump) on the way and raising a ConflictError when no row was hit (stored) — BECAUSE two moderators editing the same message at once must not silently overwrite each other, and the version check costs one predicate instead of a lock.

/*  ensure a version-checked write of an object of an entity returned the    stored row, i.e. hit the version it was based on  */stored<T> (obj: T | undefined, entity: Entity, id: string): T {    if (obj === undefined)        throw new ConflictError(entity, id)    return obj}/*  the incremented version of a row (optimistic locking)  */bump (version: PgColumn): SQL {    return sql`${version} + 1`}/*  usage inside a DAO: delete the row, version-checked (optimistic locking)  */const [ stored ] = await db    .delete(schema.sessionTokens)    .where(and(eq(schema.sessionTokens.sessionId, id), eq(schema.sessionTokens.version, sessionToken.version)))    .returning({ sessionId: schema.sessionTokens.sessionId })this.core.stored(stored, "SessionToken", id)

TEST: Test Cases (TC) ⚓︎

CoverageCoveredTotalRatio
USE-CASE914 64%
SCENARIO2151 41%
REQUIREMENT2663 41%
RULE1818 100%
TEST-CASEProperties & Description
Valid Token Grants Access ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: User Authentication ⚭, SCENARIO: Login with Emailed Token ⚭, RULE: Access Requires List or Pattern Match ⚭, TRANSITION: consume ⚭, PERMISSION: Prove the Email Address ⚭
PRE-CONDITIONAn invited user with a sent, unexpired authorization token exists for a running event.
INPUTThe user submits the correct six-digit token for their email.
EXPECTEDThe system issues a session token and grants access to the stream.
POST-CONDITIONThe authorization token is in state used.
Unauthorized Email Rejected ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: User Authentication ⚭, SCENARIO: Email Not Authorized ⚭, RULE: Access Requires List or Pattern Match ⚭, PERMISSION: Enter the Event ⚭
PRE-CONDITIONAn email not on the access list and not matching the access pattern.
INPUTThe user enters that email in the login dialog.
EXPECTEDThe system denies access and shows a not-authorized notice.
POST-CONDITIONNo session token exists and no authorization token was sent for the email.
URL Token Skips Login Dialog ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Automatic Event Access URL ⚭, SCENARIO: Automatic Token in URL ⚭, RULE: Token Format and Validity ⚭, TRANSITION: consume ⚭
PRE-CONDITIONAn event allows URL tokens and a pre-generated token exists for an invited email.
INPUTThe user opens the event URL carrying that email and token.
EXPECTEDThe system issues a session token and grants access without showing the login dialog.
POST-CONDITIONThe user holds an active session token.
Second Login Closes First Session ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Limit Parallel Access ⚭, RULE: Single Active Session per Event ⚭
PRE-CONDITIONA user holds an active session for an event from one device.
INPUTThe same user completes a login from a second device.
EXPECTEDThe first connection is closed and only the new session remains active.
POST-CONDITIONExactly one active session token exists for the user and event.
Description
  1. The user watches the stream on the first device.
  2. The same user completes a login with a fresh authorization token on a second device.
  3. The tester observes the first device.
Moderated Question Starts Pending ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Moderate Chat and Questions ⚭, SCENARIO: Submit Moderated Question ⚭, RULE: Moderation Determines Initial Visibility ⚭
PRE-CONDITIONAn event with question moderation enabled is running.
INPUTAn attendee submits a question.
EXPECTEDThe question is stored in state pending and is not visible to the audience.
Unmoderated Chat Starts Accepted ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Moderate Chat and Questions ⚭, SCENARIO: Post a Chat Message ⚭, RULE: Moderation Determines Initial Visibility ⚭
PRE-CONDITIONAn event with chat moderation disabled is running.
INPUTAn attendee submits a chat message.
EXPECTEDThe message is accepted at once upon creation and is immediately visible.
Chat Cannot Enter Question States ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Moderate Chat and Questions ⚭, RULE: State Set Depends on Message Type ⚭
PRE-CONDITIONAn accepted chat message exists in a running event.
INPUTA moderator attempts to forward the chat message to the presenter.
EXPECTEDThe system refuses the transition, as a chat message permits only the states pending, accepted, and rejected.
POST-CONDITIONThe chat message remains in state accepted.
Moderator Message Starts Accepted ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Moderator-Authored Messages ⚭, SCENARIO: Seed the Conversation as Moderator ⚭, RULE: Moderator Messages Auto-Accepted ⚭
PRE-CONDITIONAn event with chat moderation enabled is running.
INPUTA moderator posts a chat message without overriding the sender name.
EXPECTEDThe message is accepted at once upon creation with the sender name “Moderator” and is immediately visible.
Forwarded Message Is Locked ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Edit and Delete Messages ⚭, SCENARIO: Forwarded Question Locked ⚭, RULE: Forwarded Messages Are Immutable ⚭, PERMISSION: Correct Own Messages ⚭
PRE-CONDITIONAn accepted question of an attendee exists in a running event.
INPUTThe original attendee attempts to edit and then to delete the forwarded message.
EXPECTEDThe system refuses both the edit and the deletion and the message remains unchanged.
Description
  1. The moderator forwards the accepted question to the presenter.
  2. The original attendee attempts to edit the text of the question.
  3. The original attendee attempts to delete the question.
Sentiment Auto-Reject Below Threshold ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Server-Side Sentiment Analysis ⚭, SCENARIO: Auto-Rejected by Sentiment ⚭, RULE: Sentiment Auto-Decision Threshold ⚭
PRE-CONDITIONServer-side sentiment analysis and auto-reject are enabled.
INPUTAn attendee submits a message scoring -0.5.
EXPECTEDThe system rejects the message at once upon creation, without a moderator decision.
Sentiment Auto-Accept Above Threshold ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Server-Side Sentiment Analysis ⚭, SCENARIO: Auto-Accepted by Sentiment ⚭, RULE: Sentiment Auto-Decision Threshold ⚭
PRE-CONDITIONServer-side sentiment analysis and auto-accept are enabled for a moderated event.
INPUTAn attendee submits a question scoring +0.5.
EXPECTEDThe system accepts the question at once upon creation, bypassing the moderator decision.
Throttled Submission Not Stored ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Interaction Abuse Throttling ⚭, SCENARIO: Throttled Submission ⚭, TACTIC: Abuse Resistance ⚭
PRE-CONDITIONA running event with the default submission limit of 10 per user per minute.
INPUTThe attendee submits an eleventh question within the same minute.
EXPECTEDThe system rejects the eleventh submission and informs the attendee to wait, but accepts the twelfth one after the minute has passed.
POST-CONDITIONThe eleventh question is not stored, while the ten earlier ones remain unchanged and the twelfth one is stored.
Description
  1. The attendee submits ten distinct questions within one minute.
  2. The attendee submits an eleventh question before that minute has passed.
  3. The attendee submits a twelfth question after the minute has passed.
Live Provider Switch Propagates ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Live Provider Switching ⚭, RULE: Single Active Resource per Channel ⚭
PRE-CONDITIONA running event with two configured resources and connected clients.
INPUTThe manager activates the second resource on the channel.
EXPECTEDAll connected clients switch to the new stream without user interaction.
POST-CONDITIONExactly one resource of the channel is active.
Channel Activation Deactivates Previous ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Live Provider Switching ⚭, RULE: Single Active Channel ⚭
PRE-CONDITIONA running event with two configured channels, the first one active.
INPUTThe manager activates the second channel.
EXPECTEDThe second channel becomes active and the first one is deactivated in the same step.
POST-CONDITIONExactly one channel of the event is active.
First Channel Activated on Creation ⚓︎
Diagram
Properties
VERIFIESRULE: Initial Channel Becomes Active ⚭, RULE: Single Active Channel ⚭, PERMISSION: Lay Out the Channels ⚭
PRE-CONDITIONA provisioned event without any channel.
INPUTThe manager creates a channel without marking it as active.
EXPECTEDThe system stores the channel as the active one.
POST-CONDITIONExactly one channel of the event is active.
First Resource Activated on Creation ⚓︎
Diagram
Properties
VERIFIESRULE: Initial Resource Becomes Active ⚭, RULE: Single Active Resource per Channel ⚭, PERMISSION: Administer the Resources ⚭
PRE-CONDITIONA channel without any resource.
INPUTThe administrator creates a resource without marking it as active.
EXPECTEDThe system stores the resource as the active one.
POST-CONDITIONExactly one resource of the channel is active.
Active Channel Not Deactivated Directly ⚓︎
Diagram
Properties
VERIFIESRULE: Single Active Channel ⚭, PERMISSION: Lay Out the Channels ⚭
PRE-CONDITIONAn event with two channels, the first one active.
INPUTThe manager deactivates the first channel directly, then deletes it.
EXPECTEDThe system rejects both the deactivation and the deletion, as another channel would have to be activated first.
POST-CONDITIONThe first channel still exists and is the only active channel of the event.
Active Resource Not Deactivated Directly ⚓︎
Diagram
Properties
VERIFIESRULE: Single Active Resource per Channel ⚭, PERMISSION: Administer the Resources ⚭
PRE-CONDITIONA channel with two resources, the first one active.
INPUTThe administrator deactivates the first resource directly, then deletes it.
EXPECTEDThe system rejects both the deactivation and the deletion, as another resource would have to be activated first.
POST-CONDITIONThe first resource still exists and is the only active resource of the channel.
Config Change Reaches Clients ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Live Configuration Propagation ⚭
PRE-CONDITIONA running event with connected clients and chat disabled.
INPUTThe manager enables chat for the event.
EXPECTEDConnected clients show the chat panel within 2 seconds without a reload.
Registration Import Avoids Duplicates ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Import Registered Attendees ⚭
PRE-CONDITIONA running event with an empty access list.
INPUTThe manager imports a second registration sheet overlapping the first one.
EXPECTEDThe overlapping users are not duplicated, their tokens from the first import are returned unchanged, and only the new users receive fresh tokens.
Description
  1. The manager imports a registration sheet with the emails A, B, and C.
  2. The manager records the tokens returned for A, B, and C.
  3. The manager imports a second registration sheet with the emails B, C, and D.
Returned URL Format ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Return Access URLs to Registration ⚭, RULE: Token Format and Validity ⚭, ATTRIBUTE: token ⚭
PRE-CONDITIONA registration import has generated tokens for new users.
INPUTThe manager exports the access URLs.
EXPECTEDEach URL contains event, user, and a six-digit “NNN-NNN” token in the URL column.
Anonymization Removes Personal Data ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Explicit User Consent ⚭, RULE: Anonymization on Event Finish ⚭
PRE-CONDITIONA running event with messages, likes, tokens, and an access list.
INPUTThe manager finishes the event.
EXPECTEDSender names become “Anonymous”, likes become bare counts, and tokens, users, and Moderator roles are deleted.
POST-CONDITIONNo personal attendee data remains and Manager roles are retained.
User Vanishes Without Role or Access ⚓︎
Diagram
Properties
VERIFIESRULE: No Permanent User Accounts ⚭
PRE-CONDITIONA user exists solely through the access list of a running event, holding no role.
INPUTThe manager removes the user from the access list.
EXPECTEDThe user record is deleted together with the access list entry, as nothing else keeps it alive.
POST-CONDITIONNo user record for the email address exists.
Export Contains Required Fields ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Export Attendee Inputs ⚭, RULE: Likes Conserved as Count on Finish ⚭, ATTRIBUTE: timestamp ⚭, ATTRIBUTE: state ⚭, ATTRIBUTE: likes ⚭, ATTRIBUTE: text ⚭
PRE-CONDITIONA finished, anonymized event with messages.
INPUTThe manager exports the attendee inputs.
EXPECTEDThe export includes at least timestamp, state, number of likes, and message text per message.
Manager Role Survives Finish ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Export Attendee Inputs ⚭, SCENARIO: Export After Finish ⚭, SCENARIO: Access Lost After Finish ⚭, RULE: Manager Retained for Export ⚭, PERMISSION: Export the Messages ⚭, PERMISSION: Enter the Event ⚭
WORKFLOWSWORKFLOW: Run Broadcast Event ⚭
PRE-CONDITIONA running event with a manager role and a moderator role assigned.
INPUTThe manager exports the event data after having finished the event.
EXPECTEDThe moderator role is deleted by the anonymization while the manager role remains and can still export the event data.
POST-CONDITIONThe manager role exists until the event is deleted.
Description
  1. The manager finishes the event.
  2. The moderator attempts to open the event.
  3. The manager exports the attendee inputs of the finished event.
Chat Message Shows Configured Name ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Chat Messages ⚭, REQUIREMENT: Configurable Name Appearance ⚭, SCENARIO: Post a Chat Message ⚭, RULE: Moderation Determines Initial Visibility ⚭
PRE-CONDITIONA running event with chat enabled, chat moderation disabled, and the name appearance set to first name only.
INPUTAn attendee sends a chat message.
EXPECTEDThe message appears in state accepted under the first name of the attendee, with the email address shown on hover.
POST-CONDITIONThe message is stored as a chat in state accepted.
Like Toggles the Count ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Like Messages ⚭, SCENARIO: Like a Message ⚭
PRE-CONDITIONA visible chat message of another attendee with a like count of 0.
INPUTAn attendee likes the message and then undoes the like.
EXPECTEDThe like count reads 1 after the like and 0 again after the undo.
POST-CONDITIONNo like of the attendee is recorded for the message.
Description
  1. The attendee likes the message.
  2. The tester reads the like count shown on the message.
  3. The attendee undoes the like on the same message.
  4. The tester reads the like count shown on the message again.
Deleted Message Leaves Placeholder ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Edit and Delete Messages ⚭, REQUIREMENT: Deleted Message Placeholder ⚭, SCENARIO: Delete an Own Message ⚭
PRE-CONDITIONA running event with chat enabled and chat moderation disabled, with two attendees watching.
INPUTThe first attendee deletes their own message from between the two other messages.
EXPECTEDThe stream keeps the position of the message and shows a “This message was deleted” placeholder instead of its text on both attendee screens.
POST-CONDITIONThe message text is no longer retrievable by any attendee.
Description
  1. The second attendee posts a chat message.
  2. The first attendee posts a chat message.
  3. The second attendee posts another chat message.
  4. The first attendee deletes their own message.
  5. The tester inspects the stream on the screens of both attendees.
Client-Side Check Holds Back Improper Input ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Client-Side Sentiment Analysis ⚭, SCENARIO: Held Back by Client-Side Check ⚭
PRE-CONDITIONA running event with client-side sentiment analysis enabled.
INPUTAn attendee submits a question with clearly improper wording.
EXPECTEDThe client prevents the submission and informs the attendee, and no request reaches the server.
POST-CONDITIONNo message exists for the submission.
Direct Moderator Reply Stays Private ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Answer Attendee Inputs ⚭, SCENARIO: Answer an Attendee Directly ⚭, RULE: Moderator Messages Auto-Accepted ⚭
PRE-CONDITIONA running event with chat enabled and two attendees watching the stream.
INPUTThe moderator replies to the message of the first attendee as a direct message.
EXPECTEDThe reply reaches the first attendee in state accepted while the second attendee does not see it.
POST-CONDITIONThe reply is stored as accepted with the first attendee as its sole recipient.
Description
  1. The first attendee posts a chat message.
  2. The moderator replies to that message as a direct message.
  3. The tester inspects the stream on the screens of both attendees.
Resource URL Selects the Resource ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Direct Resource Access URL ⚭, SCENARIO: Return via Direct Resource URL ⚭
PRE-CONDITIONA running event with a default stream and a second, static resource, and an attendee holding an active session.
INPUTThe attendee opens the event URL carrying the resource parameter naming the static resource.
EXPECTEDThe system shows the static resource instead of the default stream.
POST-CONDITIONThe session of the attendee remains active.
Language Switch Applies Immediately ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: In-Session Language Switching ⚭, SCENARIO: Switch the Language ⚭
PRE-CONDITIONAn attendee watches a running event with the interface in German.
INPUTThe attendee switches the language to English in the header.
EXPECTEDThe interface and the translated messages appear in English without a page reload.
POST-CONDITIONThe stream continues uninterrupted.
Presenter Sees Forwarded Questions Only ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Presenter Dashboard ⚭, SCENARIO: Forwarded Questions Only ⚭, PERMISSION: Read Forwarded Questions ⚭
PRE-CONDITIONA running event holds one question in each of the states pending, accepted, rejected, and forwarded.
INPUTThe presenter opens the presenter view of the event.
EXPECTEDThe view lists the forwarded question only, while a direct request for any of the three other questions is refused.
POST-CONDITIONThe four questions remain in their states.
Administrator Sees No Attendee Data ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: GDPR-Compliant EU Processing ⚭, RULE: No Permanent User Accounts ⚭, PERMISSION: Administer Every Event ⚭
PRE-CONDITIONA running event with a populated access list and messages exists, provisioned through the configuration.
INPUTThe administrator reads the event through the configuration and requests its access list and messages.
EXPECTEDThe event settings are returned, while the requests for the access list and the messages are refused.
POST-CONDITIONNo access list entry or message was disclosed to the administrator.
Administrator Enters Without Access List Entry ⚓︎
Diagram
Properties
VERIFIESRULE: Administrator Bypasses the Access List ⚭, SCENARIO: Enter and Edit Any Event ⚭, PERMISSION: Administer the Authorization Tokens ⚭
PRE-CONDITIONA running event whose access list does not contain the configured administrator email address and whose access email pattern does not match it.
INPUTThe administrator requests the login challenge for the configured administrator email address at the event URL and returns the received token.
EXPECTEDThe token is issued and sent without consulting the access list, and the administrator is admitted to the event.
POST-CONDITIONThe administrator holds an active session for the event while its access list is unchanged.
Description
  1. The administrator opens the event URL and enters the configured administrator email address.
  2. The tester verifies that a token was sent to that address.
  3. The administrator returns the token.
  4. The tester inspects the access list of the event.
Administrator Role Granted by Configuration Only ⚓︎
Diagram
Properties
VERIFIESRULE: Administrator Bootstrapped by Configuration ⚭, SCENARIO: Administrator Role Stays Configured ⚭, PERMISSION: Administer the Roles ⚭
PRE-CONDITIONThe configuration grants the Administrator role to exactly one email address, and its holder has entered an event.
INPUTThe administrator attempts to grant the Administrator role to a user of the event and to revoke their own Administrator role through the user interface.
EXPECTEDBoth attempts are refused, while granting the Manager role to the same user succeeds.
POST-CONDITIONThe set of Administrator roles equals the configured one.
Description
  1. The administrator attempts to grant the Administrator role to a user of the event.
  2. The administrator attempts to revoke their own Administrator role.
  3. The administrator grants the Manager role to the same user.
  4. The tester inspects the roles of the administrator user and of the event user.
Concurrent Attendee Load ⚓︎
Diagram
Properties
VERIFIESREQUIREMENT: Concurrent Attendee Scale ⚭, REQUIREMENT: Horizontal Scalability ⚭
PRE-CONDITIONA running event deployed with scaled proxy, relay, and server instances.
INPUT10000 simulated attendees connect simultaneously and interact.
EXPECTEDAll 10000 attendees hold a served WebSocket connection at the same time, meeting the upper bound of the 2500 to 10000 attendees per event metric.