--- stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] inputDocuments: - _bmad-output/planning-artifacts/briefs/brief-video-view-manager-2026-05-19/brief.md - _bmad-output/planning-artifacts/prds/prd-video-view-manager-2026-05-19/prd.md --- # UX Design Specification: Scrying Pool (Video View Manager) **Author:** Morr **Date:** 2026-05-19 --- ## Executive Summary ### Project Vision Scrying Pool is a FoundryVTT v14 module that gives the GM direct, real-time control over individual player webcam visibility — something the native AV system completely lacks. The core promise: one click to show or hide any player's camera, with every connected client updating instantly. Beyond the v1 toggle, the module grows into a session cinematography tool — GMs can design the visual experience of their table like a director. The architecture is Progressive Enhancement: Level 1 adds a right-click action to existing AV Tiles (zero new UI); Level 2 adds the Director's Board for bulk control; Level 3 adds Scene Presets and automation. ### Target Users | Persona | Core Need | Key UX Insight | |---|---|---| | Marcus (Veteran GM) | Prep once, trust automation; one-click override always available | Ambient status over popup-driven notifications; Director framing resonates | | Sofia (Privacy-conscious player) | Always know her feed state; opt out of automation touching her camera | Needs persistent self-state indicator; language must be neutral ("managed" not "hidden"). **Open question:** Sofia A (wants GM camera management — relief) vs. Sofia B (resents unilateral control — needs consent). These have opposite requirements; primary driver must be decided before detailed design. | | Jake (Streamer GM) | Keyboard-first operation; zero mouse during live broadcast | Full action set must have keyboard bindings as first-class feature; compact strip must be a roster (avatar + initials), not a status bar | | Alex (New player) | Plain language, toast explanations, no camera anxiety | Wants rich informative toasts; role-differentiated notification verbosity required | ### Key Design Challenges **1. Role-differentiated rendering is a core architectural requirement** The GM UI and Player UI are not the same surface with permissions masked. The GM needs: bulk controls, ambient status, keyboard affordances, scene-level automation. The player needs: one thing — a persistent, never-dismissible indicator of their own camera state, with GM controls entirely absent. These must be built as separate surfaces at the template and rendering level — separate component trees, separate event handlers. The shared layer is the data model, not the UI. **2. Notification verbosity is role-differentiated** Marcus (GM) needs zero interrupt-driven notifications — ambient, glanceable status is the correct pattern. Alex (new player) needs rich, plain-language toasts. A persistent self-state badge is the ground truth signal (always present, never dismissible); toasts are the announcement layer. Architecture decision needed: a notification bus (role + user preference determines render), not toasts bolted onto individual state mutations. **3. Language and framing carry psychological weight** "Hidden by GM" reads as punitive. "Camera managed by GM" / "Camera visible to table" is factually identical but psychologically neutral. All player-facing state copy must be audited for framing as a trust concern, not just tone. **4. Level 1 discoverability is a known strategic tradeoff** Right-click on AV Tile is fast and zero-footprint but entirely undiscoverable. This is not a tension — it is a known tradeoff: zero footprint costs zero adoption for new users without out-of-band documentation. Mitigation: a single one-time contextual tooltip on first GM activation ("Right-click to manage visibility") that is dismissed forever. Marcus never sees it again; Alex gets his footing. Alternatively, accept Level 1 is deliberately power-user-only and document that decision explicitly. **5. Consent is an open question requiring explicit decision** The module enables a GM to manipulate what others see of a player's video stream. GDPR Article 7 concerns apply. An explicit documented decision is required: is consent handling in-scope or out-of-scope? If out-of-scope, what is the rationale? "Camera managed by GM" language softens the feeling but does not address the fact. ### Design Opportunities **1. State display tiers: director cues / table awareness / background operations** Don't design 8 equal visual treatments. Design 3 tiers that reflect the GM's directing posture: **Director cues** (GM changed something — confirmation feedback, high visual weight), **table awareness** (something happened that affects the scene — `offline`, `reconnecting`, medium weight), **background operations** (infrastructure doing its job, stay out of the way — `ghost`, `never-connected`, no tile rendered). Same three buckets as urgency hierarchy, but framed from control rather than reaction. **2. Director's Board as production monitor — two modes** The Director's Board should feel like a broadcast monitor the GM glances at: persistent, always-on, low-footprint. Two modes required: **full seating chart** (faces, names, states — spatial, iconic, tabletop culture) and **compact roster strip** (avatar thumbnail at 24px minimum + initials + state — for streamers who cannot sacrifice screen real estate during live broadcast). A collapsed strip that shows only colored dots is insufficient; it must remain a roster under compression. **3. Unified visual language system** A coherent system of icons, overlays, color, and copy legible across all surfaces: AV tile overlays, Director's Board cards, toast notifications, player self-indicator badge. Icons must always have plain-language tooltips — icons alone fail new users. Copy language is shared and consistent across all surfaces. **4. Director framing as product identity (UI layer only)** "Director's Board," "Scene Presets," "Spotlight," "Blackout" — this vocabulary positions camera management as session craft, not system administration. This framing belongs exclusively in the UI and documentation layer. Internal code uses functional names: `VisibilityManager`, `ParticipantState`, `AudienceView`. **5. Architecture-forward Visibility Matrix** `Map>` from day one — even though v1 uses GM-global state. GM-only writes with read-fanout to all players: simple, auditable, no race conditions. Level 1 and Level 2 must write to the same matrix; a GM upgrading from Level 1 to Level 2 sees fully coherent state with no migration. **6. Empty and cold-start states need design** What does the Director's Board look like when no webcams are enabled? What does a player see joining a session with no configuration? Cold-start moments are first impressions. These states are currently undesigned and must be explicitly addressed. --- ## Core User Experience ### Defining Experience The defining experience of Scrying Pool is the GM as session director — not a system administrator, not a settings manager, but someone who shapes the visual atmosphere of the table in real time. The core loop is minimal and fast: 1. GM notices a camera state that needs to change 2. GM acts (right-click, keyboard shortcut, or Director's Board tap) 3. State applies **optimistically on the GM's client immediately**; all other clients update within 500ms 4. GM's ambient monitor confirms the change — and moves on The entire experience must support **playing while managing**. A GM who has to leave the fiction to operate the module has been failed by the UX. ### Platform Strategy - **Desktop browser only** (Chrome/Firefox, 1080p+). No mobile target. Player-facing surface is minimal by design. - The module **overlays and enhances** existing AV Tile markup — it does not replace it. ### Effortless Interactions | Interaction | Target User | Effortless Standard | |---|---|---| | Hide/show a player's camera | Marcus & Jake (GM) | One right-click or single keyboard shortcut. No confirmation dialog. Optimistic — instant on GM client. | | Know your own camera state | Sofia (Player) | Persistent badge at top-center of own tile + secondary fixed HUD anchor independent of tile position. Always present. Never requires action to find. | | Understand why your camera changed | Alex (New player) | Toast appears automatically with plain-language explanation. Role-based verbosity defaults — players receive own-state changes only. | | See all camera states at once | Marcus (GM) | Director's Board is a glance, not a read. State is spatial and iconic. GM notification default: silent for system transitions, minimal for director cues. | **Friction to eliminate:** - No confirmation dialogs for show/hide - No page reload required for any state change - No manual sync — state propagates automatically to late joiners - No visual reflow when states change — tile positions stay fixed - No silent lag — a brief tile spinner appears only on sync timeout, not on normal operation ### Critical Success Moments **The first successful hide** — A GM right-clicks an AV tile, selects "Hide Camera," the overlay appears instantly on their own client, propagates to all others within 500ms. The Director's Board confirms the state. *This is the moment the module earns trust.* Failure mode guarded: context menu item available across all applicable Participant States; socket listener registered at `ready` hook. **The persistent badge, noticed** — A player glances at their tile and sees "Camera managed by GM" at top-center. They weren't watching when it changed. The badge was just there — also anchored in a fixed HUD position independent of tile scroll. They feel informed, not surveilled. *This is the moment trust is extended to the player.* Failure mode guarded: badge passes WCAG AA contrast against all tile backgrounds; secondary HUD anchor survives tile being off-screen. **The cold start works** — A new GM activates the module. A **sidebar icon confirms the module is active**. When the first AV tile renders, a single tooltip appears: "Right-click to manage visibility." Triggered by `firstGMActivation` world flag — not session state. The tooltip never appears again. *This is the moment zero-footprint and discoverability coexist.* Failure mode guarded: tested with AV disabled, AV with no players, and AV with players connected. ### Experience Principles 1. **Play while managing** — Every control must be operable without breaking the GM's attention from the session. If it requires a modal, a wizard, or more than two clicks, it's too much. 2. **State is always visible, never chased** — Persistent indicators are the truth. Toasts are the announcement. A user should never have to remember a notification to know current state. The badge and HUD anchor are ground truth; toasts are optional. 3. **Neutral language is non-negotiable** — Player-facing copy is audited at every surface. No language that implies punishment, surveillance, or loss of agency. ### Notification Design Constraints Role-based defaults wired to urgency tiers from day one: | Urgency Tier | GM Default | Player Default | |---|---|---| | Director cues (GM changed something) | Minimal — ambient confirmation | Not shown | | Table awareness (system event affecting scene) | Silent — visible in Director's Board only | Shown for own state only | | Background operations | Silent | Silent | Toast spam is a trust-destroyer. The notification architecture must enforce these defaults, not leave them to user discovery. --- ## Desired Emotional Response ### Primary Emotional Goals **For the GM (Marcus, Jake):** **Calm authority.** The feeling of a director who knows exactly what the audience sees, who can adjust the frame without breaking a sweat. This is an *output* of good UX, not an *input* — the design must produce calm authority in a tired, distracted GM at hour three of a session. **For the player (Sofia, Alex):** **Informed safety.** The knowledge that your presence is being managed, you know exactly how, and you have not been excluded without explanation. Informed safety requires both the *what* (persistent badge) and the *why* (one-time normalising explanation). Without the why, informed can become alarmed. ### Emotional Journey Mapping | Stage | GM Feels | Player Feels | |---|---|---| | **First activation** | Curious, slightly skeptical | Unaware — module invisible to players | | **First GM activation nudge** | Mildly prompted, easily dismissed | — | | **First successful hide** | Satisfied, surprised by speed | Informed via badge + toast; grounded by audio-continuity phrase | | **First badge encounter (player)** | — | One-time micro-explanation: *why* this exists, normalised as table craft not surveillance | | **Mid-session use** | Confident, in flow | Reassured — badge consistent and predictable | | **Something goes wrong** | In control; undo reachable | Aware and unworried — toast with context explains the situation | | **Returning next session** | Habitual trust — state persisted | Familiar safety — badge behaviour predictable across sessions | ### Micro-Emotions to Achieve | Emotion | For Whom | Triggered By | |---|---|---| | **Confidence** | GM | Instant visual confirmation; undo always reachable | | **Trust** | Player | Persistent badge with neutral language; one-time explanation of why | | **Flow** | GM | Zero-friction controls; Director's Board scannable with degraded attention | | **Clarity** | New player | Contextual toasts: "Camera managed by GM. Your audio is unaffected." | | **Belonging** | All players | Portrait fallback; soft visual fade on hide (not instant cut) | | **Readiness** | GM (no-video sessions) | Sidebar icon + empty state communicates active and waiting, not broken | ### Micro-Emotions to Avoid | Emotion | For Whom | Risk Trigger | |---|---|---| | **Anxiety** | Socially anxious player | Badge visible to others; no audio-continuity phrase; uninformed state | | **Surveillance unease** | Player | Badge without micro-explanation on first encounter | | **Frustration** | GM | Slow confirmation; no undo; text-heavy Director's Board at hour three | | **Confusion** | New GM | Module active but silent; empty state feels like failure | | **Distrust** | Player | Inconsistent badge; hidden from stream without knowing | | **Overwhelm** | All | Toast spam; notification at emotionally invested moments | ### Emotion–Design Connections | Desired Emotion | UX Design Approach | |---|---| | **Calm authority (GM)** | Optimistic UI; colour-coded Director's Board tiles (scannable, not readable); undo/quick-reveal as first-class action | | **Informed safety (Player)** | Persistent badge at top-center + HUD anchor; one-time micro-explanation on first encounter; all viewer-category states always visible to participant | | **Flow (GM)** | Right-click + keyboard shortcut; no confirmation dialogs; optional reason field on hide (easy to provide, never required) | | **Clarity (New player)** | Toasts with context and grounding: "Camera managed by GM · Scene direction. Your audio is unaffected — you can still participate fully." | | **Belonging (All)** | Portrait fallback; 300–500ms fade on hide; toast delayed 1–2s after hide to avoid interrupting emotionally invested moments | | **Ethical readiness** | Dismissible first-activation nudge: "Before your first session, consider telling your players that you can manage camera visibility during play." | ### Ethical Design Positions | Tension | Design Position | |---|---| | **Dramatic reveal vs. informed player** | Real-time badge transparency always. Solution is pre-session consent via opt-out nudge, not delayed transparency. | | **Authority without justification** | Optional reason field on hide action. Easy to provide context, never required. Toast gracefully omits reason when none provided. | | **Streamer asymmetric visibility (v2)** | Players must always see all their visibility states across all viewer categories. Hard architectural requirement for v2. | | **Consent friction vs. GM autonomy** | Opt-out nudge at first GM activation, never a gate. One click to dismiss. | ### Emotional Design Principles 1. **Speed is trust** — Optimistic UI is an emotional design decision. A state change that feels instant communicates GM competence; lag communicates a broken system. 2. **Presence is safety** — The badge must never disappear. An absent badge is more alarming than a "Camera managed" badge. Consistency is the product. 3. **Explain the why, not just the what** — Badge + one-time micro-explanation + audio-continuity grounding phrase. Players who understand the reason feel agency even when they lack control. 4. **Transitions carry emotional weight** — 300–500ms fade on hide; 1–2s toast delay after emotionally significant hide events. The *how* of a change matters as much as the *what*. 5. **Design for the exhausted user** — Calm authority must be achievable at hour three. Undo is always reachable. Director's Board is scannable, not readable. 6. **Ethical defaults, not ethical enforcement** — The module prompts good behaviour (consent nudge, optional reason field) but never gates it. Experienced GMs are not lectured; new GMs are guided. ## UX Pattern Analysis & Inspiration ### Inspiring Products Analysis #### FoundryVTT (v11–v14) **Core problem it solves elegantly:** Orchestrates a complex multi-role collaborative experience (GM authority + player participation) with a single shared canvas, without overwhelming either party. Every interaction is spatially grounded — things live *somewhere* on screen with consistent affordances. **What makes it compelling:** - **Right-click as authority gesture** — context menus are the GM's Swiss Army knife; one click, contextually appropriate. Must target Scrying Pool's *own* roster strip (WebRTC DOM is not a stable extension surface; `contextmenu` on `