FrostBloom Viewer
VIEWER
- {{ selectedGuild.name }}
{{ error }}
{{ toast.message }}
Select a server to get started
{{ eventStatsHeader.totalEvents }}
Total Events
{{ eventStatsHeader.totalSignups }}
Total Signups
{{ eventStatsHeader.avgSignups }}
Avg Signups
{{ eventStatsHeader.uniqueParticipants }}
Unique Participants
Upcoming Events
{{ ev.title || 'Untitled' }}
{{ ev.type }}
{{ formatDate(ev.timestamp) }}
{{ ev.counts.main }}/{{ ev.counts.cap }}
FULL
{{ ev.counts.slots_left }} left
Bench: {{ ev.counts.bench }} | Absent: {{ ev.counts.absent }} | Tentative: {{ ev.counts.tentative }}
MAIN ({{ ev.main.length }})
{{ m.ign }}
BENCH ({{ ev.bench.length }})
{{ expandedBenches[ev.event_id] ? '▼' : '▶' }}
{{ b.ign }}
{{ b.bench_reason === 'auto_bench' ? '🔴 Auto-bench' : '🔶 Bench' }}
{{ status }}
{{ name }}
No event data available for stats
{{ statsData.period.label }} · since {{ statsData.period.since }}
{{ statsData.overview.totalEvents }}
Events
{{ statsData.overview.confirmed }}
Confirmed
{{ fmtPct(statsData.overview.attendanceRate) }}
Attendance (incl. missed)
{{ fmtPct(statsData.overview.slotFillRate) }}
Slot Fill
{{ statsData.overview.signups }}
Signups
{{ statsData.overview.noShows }}
No-Shows
{{ statsData.overview.missed }}
Missed / No response
⚔️ {{ statsData.overview.missedWar }} · 🐉 {{ statsData.overview.missedRaid }}
⚔️ {{ statsData.overview.missedWar }} · 🐉 {{ statsData.overview.missedRaid }}
{{ statsData.overview.avgPerEvent }}
Avg / Event
{{ statsData.overview.uniqueParticipants }}
Unique
Weekly Trends
Not enough data in this period
Signups
Events
Attendance %
Role Distribution
No confirmed signups
{{ a.label }}: {{ a.value }} ({{ a.pct }}%)
Status Distribution
No data
{{ x.status }}: {{ x.count }} ({{ x.pct }}%)
Top No-Shows
No data
{{ i + 1 }}
{{ n.ign }}
{{ n.count }}x absent
Top Missed (No Response)
No data
{{ i + 1 }}
{{ m.ign }}
{{ m.count }}x · {{ m.war }}x war · {{ m.raid }}x raid
Top Attendees
No data
{{ i + 1 }}
{{ a.ign }}
{{ a.count }} events · {{ a.bench }} bench
Bench Frequency
No data
{{ i + 1 }}
{{ b.ign }}
{{ b.count }}x benched
Poll Participation
{{ statsData.pollStats.totalPolls }}
Total Polls
{{ statsData.pollStats.totalVotes }}
Total Votes
{{ statsData.pollStats.avgVotes }}
Avg Votes/Poll
{{ statsData.pollStats.participants }}
Voters
🔥 Most active: “{{ statsData.pollStats.mostActive.question }}” — {{ statsData.pollStats.mostActive.votes }} votes
{{ p.question }}
{{ p.active ? 'Active' : 'Closed' }}
Collaborative Canvas
Real-time collaborative drawing
Draw shapes, arrows, and freehand sketches together on a world map background. WebSocket-powered with editor/viewer roles.
Features:
Rectangles
Ellipses
Arrows
Freehand
Real-time cursor sync
Editor/Viewer roles
Map background
Select an event to view/create groups
★ {{ getCommanderName(sq.leader_id) }}
{{ sq.members.length }}/5
{{ m.games }} {{ m.games === 1 ? 'game' : 'games' }}
Drop roster item here
+ free slot
GVG Roster
{{ m.order ? m.order + '. ' : '' }}{{ m.ign || 'N/A' }}
{{ m.user }}
No league roster data found
{{ (selectedMember.ign || selectedMember.user || '?').charAt(0).toUpperCase() }}
{{ selectedMember.ign || selectedMember.user }}
{{ selectedMember.weapon || 'No loadout' }}
Officer Notes
Loading...
No notes yet
{{ note.tag }}
{{ note.content }}
Jungle Announcer
C
{{ ch.name }}
Serving Schedule
⏱ ~{{ jungleEstimate.perCh }}s/ch · {{ jungleEstimate.n }} channels · ~{{ jungleEstimate.total }}s / {{ jungleEstimate.window }}s window
{{ formatTime(jungle.timing_session) }} session · {{ jungle.timing_windows.length }} window(s). Remaining mm:ss sets when the window triggers.
⚠ Over budget: trailing channels will be skipped.
Announce runs
s into each window (0 = at window open · late values leave less room for the channel pass)
| Time (remaining) | Voice Line to Play | Est. pass | |
|---|---|---|---|
| ~{{ jungleEstimate.total }}s |
No windows configured — add one below.
Channel Sequence
Click a channel to toggle it on/off. Use arrows to adjust visit order.
#{{ channelSeqIndex(ch.id) + 1 }}
{{ ch.name }}
No voice channels available
{{ ch.name }}
🎙 {{ jungleEstimate.n }} channels selected · ~{{ jungleEstimate.total }}s per window pass · {{ jungleEstimate.window - jungleEstimate.total }}s free
⚠ {{ jungleEstimate.n }} channels · ~{{ jungleEstimate.total }}s needed > {{ jungleEstimate.window }}s window · {{ jungleEstimate.total - jungleEstimate.window }}s over
Audio & Voice Settings
Connect Sound (First Join)
{{ jungle.config.connect_filename ? jungle.config.connect_filename : (jungle.config.connect_audio ? 'Saved' : 'No file uploaded') }}
Default Announcement (Recurring)
{{ jungle.config.announce_filename ? jungle.config.announce_filename : (jungle.config.announce_audio ? 'Saved' : 'No file uploaded') }}
Custom Voice Lines Library
Create unique phrases and map them to individual timing windows in the schedule.
{{ l.name }}
{{ l.source === 'upload' ? (l.filename || 'upload') : 'TTS' }}
No custom lines yet — default announcement plays in all windows.
{{ howtoStep + 1 }} / {{ jungleHowtoSteps.length }}
{{ jungleHowtoSteps[howtoStep].t }}
{{ jungleHowtoSteps[howtoStep].d }}