Commit Graph
56 Commits
Author SHA1 Message Date
mike1237 d8399bc3c4 Add Docker support (#8)
Dockerfile and docker-compose.yml contributed by @mike1237. Thanks for the contribution!
2026-02-13 23:10:43 -05:00
ancsemi 96c825bdb1 fix: avatar upload - replace label-for-input with button to prevent double-trigger
The <label for='avatar-file-input'> elements created a native label-input
association. In many browsers, e.preventDefault() on label click does NOT
reliably prevent the native for-attribute behavior, causing both the native
activation AND the JS fileInput.click() to fire simultaneously  which
opens the file dialog twice and immediately cancels it.

Fix: Changed <label> to <button type='button'> and removed the for
attribute entirely. The JS click handler is now the sole mechanism for
opening the file dialog, eliminating the conflict.
2026-02-13 22:37:42 -05:00
ancsemi 48ca76f14d Merge branch 'main' of https://github.com/ancsemi/Haven v1.4.7 2026-02-13 22:04:43 -05:00
ancsemi 537fdde129 v1.4.7: YouTube fix, PFP upload fix, gray space fix, late joiner streams, /play search, Spotify->YT, PiP opacity, stream PiP overlays 2026-02-13 22:02:54 -05:00
ancsemi 2874fdbdb1 Enhance features description in README
Updated the README to include 'streaming' and 'music' in the features description.

Signed-off-by: ancsemi <ancsemi@gmail.com>
2026-02-13 14:18:03 -05:00
ancsemi e728f1af1c v1.5.0: Channel context menu, Dark Souls campfire rework, mobile leaderboard REST API, effect speed sliders
- Replace gear dropdown with '...' hover button on channel items in sidebar
- Context menu: mute (all users), toggle streams/music, delete (admin-only)
- Dark Souls: 50-75% dimmer, higher reach (55vh), sporadic campfire flicker
- Shippy Container: REST API (/api/high-scores) fallback when window.opener is null (mobile fix)
- Auth token passed to game via URL hash for mobile score submission
- Effect Speed slider for all dynamic-effect themes (CRT, FFX, Ice, Nord, Dark Souls, Bloodborne, Matrix, Cyberpunk, LoTR)
- CSS --fx-mult custom property controls all animation durations
- Theme effect audit: all selectors verified, no mismatches
2026-02-13 11:45:10 -05:00
ancsemi 7c072242c5 Header reorg, delete channel safety, slider tracks, DS flame fix
- Reorganize header: search/pin/gear moved left next to channel name,
  voice+leave always furthest right, flex spacer pushes them apart
- Delete channel moved into gear dropdown with TWO confirm dialogs
- Fix all slider tracks (slider-sm, ns-slider, volume-slider,
  stream-vol-slider): add explicit ::-webkit-slider-runnable-track
  and ::-moz-range-track with background + margin-top on thumbs
- Fix Dark Souls flame effect: CSS used 'dark-souls' but theme
  button uses 'darksouls' (no hyphen)  effects never activated
- Center trophy emoji in Shippy leaderboard circle button (flexbox)
2026-02-13 11:05:18 -05:00
ancsemi 4bcb47c2c9 Music PiP overlay, mobile sidebar fix, Shippy UX polish
- Replace window.open music popout with in-app floating PiP overlay
  (same iframe = no playback position reset, draggable, themed)
- Fix mobile sidebar: add !important to position:fixed in 768px media
  query (theme CSS was overriding with position:relative)
- Shippy Container: change 'flap' to 'jump' in instructions
- Shippy Container: leaderboard button now trophy circle at bottom-right
2026-02-13 10:26:05 -05:00
ancsemi c082aa5e66 Fix header buttons, music popout controls, mobile layout, Shippy mobile, Dark Souls effect
- Header: uniform 30px button height, consistent spacing, buttons stay right-aligned
- Music popout: proper Haven-styled popup with play/pause, volume, mute, pop-in button
- Music popout: syncs playback position (SoundCloud seekTo, YouTube start param)
- Pop-out button moved to top-left on music panel (matches stream placement)
- Mobile: ensure .main fills full width, welcome screen properly centered
- Shippy Container: responsive canvas, slide-out leaderboard sidebar on mobile
- Dark Souls: much more prominent firelight flicker (2x opacity, taller fire bar, faster animation)
2026-02-13 10:01:47 -05:00
ancsemi b16d87e123 Fix popped-out stream tile collapse, hollow hexagon favicon, voice/user state sync
- Stream pop-out: collapse tile to 28px instead of dimming video, frees up space
- Favicon: hollow dark-purple hexagon with thick border (was filled light-purple)
- Server: add request-voice-users and voice-rejoin handlers for state sync
- Server: multi-tab safe disconnect (check socketId before removing users)
- Client: emit voice-rejoin on socket reconnect if in voice
- Client: request voice users on channel enter and every 30s refresh
2026-02-13 09:00:14 -05:00
ancsemi a05f142c2e Fix invisible theme effects + replace WinXP with Win95
Effects fix:
- Dramatically boosted opacity/alpha on ALL theme effects (were 0.04-0.06, now 0.15-0.35)
- Added position: relative to .main for each theme that needs it
- Ice icicles: replaced text-based with SVG mask icicle shapes
- Nord snowfall: doubled particle count (8->14), larger dots, full opacity
- Dark Souls: 3x brighter ember glow, added ambient firelight overlay
- FFX: 4x stronger water gradient, thicker wave bar with blur
- Bloodborne: doubled vignette intensity
- Matrix: 4x more visible rain lines
- LOTR: 3x brighter candlelight with flickering rhythm
- Abyss: deeper vignette

Windows 95 (replaces XP):
- Flat #c0c0c0 gray everywhere, navy #000080 accents
- All border-radius forced to 0 (global * rule)
- Classic outset/inset borders on all buttons, inputs, panels
- Blue gradient title bars (sidebar-header, modal h3)
- Highlight selection: navy bg + white text
- Dithered scrollbar track pattern
- Win95 checkerboard aesthetic throughout
2026-02-13 00:59:39 -05:00
ancsemi c3f300e03d Add retro themes (Fallout, CRT, WinXP) + creative effects for existing themes
New themes:
- Fallout (PIP Boy): Green phosphor monochrome, scanlines, terminal glow, monospace fonts
- CRT: Amber phosphor, heavy scanlines, CRT curvature effect, screen flicker
- Windows XP (Luna Blue): Light theme with classic blue sidebar/header, outset borders, Tahoma font, Bliss sky gradient

Creative effects added to existing themes:
- FFX: Flowing water overlay on sidebar, wave bar at bottom
- Ice: Icicle shapes on headers, shimmer particles
- Nord: CSS snowfall particle animation
- Dark Souls: Ember glow on sidebar, fire line at bottom
- Bloodborne: Pulsing blood-red vignette
- Matrix: Digital rain shimmer on sidebar
- Cyberpunk: Glitch text effect on brand name
- Minecraft: Pixelated avatars, hard-edge borders
- LOTR: Warm candlelight glow on sidebar
- Abyss: Deep pressure depth vignette

Bug fixes:
- Upload Image button: Changed to <label for=...> for native file input
- SoundCloud popout: Opens embed URL directly (preserves state)
- Header layout: Music indicator + hidden streams moved into voice-controls
2026-02-13 00:37:43 -05:00
ancsemi f784eb2af5 Fix music pop-out dual play, scrap slider fill system, shape-based status indicators
- Pop-out: blank original iframe src when opening pop-out window, restore on close
- Sliders: remove entire _initSliderFills() system (MutationObserver, prototype patch,
  injected style element, all _sliderFillUpdate refs). Vanilla sliders with themed
  track bg and accent thumb only. Remove all ::-moz-range-progress fill rules and
  theme-specific --track-fill overrides
- Status indicators: colorblind-accessible shapes - circle (online), half-dome (away),
  square (DND), hollow circle (invisible/offline). Applied to member list dots,
  status picker dots, and user bar dot
2026-02-13 00:11:52 -05:00
ancsemi a0409e17fb Fix PFP upload, hide/show streams, pop-out music player, YouTube embed fix
- Fix: PFP upload button - wrapped _initSliderFills Object.defineProperty in try-catch
  so it can't crash the HavenApp constructor and prevent _setupAvatarUpload from running
- Add: Hide/show individual stream tiles - eye button on each tile, hidden-streams bar
  with restore buttons, stream count label shows hidden count
- Add: Pop-out music player - opens YouTube/Spotify/SoundCloud embed in separate window,
  minimizes in-app panel, shows indicator when pop-out window is active
- Fix: YouTube 'Video unavailable' for clients - added origin parameter to embed URL,
  added ws: to CSP connectSrc (required for HTTP-mode Socket.IO connections)
2026-02-12 23:47:28 -05:00
ancsemi 2b8c04cb22 Discord-style status indicators on avatars, fix .env Tenor refs, sync website
- Add: Status indicator dots overlaid on user avatars (green=online, yellow=away, red=dnd, grey=offline/invisible) with dark border cutout, responsive sizing for mobile
- Fix: .env.example still referenced Tenor API  updated to GIPHY with correct URL
- Fix: CSS comment 'Tenor key'  'GIPHY key'
- Sync: website/index.html replaced with canonical docs/index.html
- Add: Help & Support footer link to docs/index.html
- Add: Deploy checklist note in CHANGELOG.md
2026-02-12 22:54:08 -05:00
ancsemi 138c7a2b9d v1.4.6: Fix slider tracks, YouTube embeds, double screen share, pop-out soft-lock, music sync, music panel reopen, late joiner music state
- Fix: Slider fill tracks now use injected <style> rules targeting ::-webkit-slider-runnable-track per-slider, bypassing Chrome shadow DOM limitation
- Fix: YouTube embeds use youtube.com/embed/ (not youtube-nocookie.com) to resolve 'Video unavailable' for other users
- Fix: Removed duplicate screen share tile creation from shareScreen() in voice.js
- Fix: PiP leavepictureinpicture event now on video element (not pipWindow)
- Fix: Transparent overlay on music iframes to force synced controls
- Fix: Music panel X minimizes with reopenable indicator in channel header
- Fix: Server tracks active music per voice room and sends to late joiners
2026-02-12 22:45:45 -05:00
ancsemi 3dc0eacf1b Fix mobile screenshots, slider fills, sidebar scroll, collapsible DMs
- Replace dead mobile screenshot URLs with permanent ones from issue #4
- Add fill gradient to voice volume sliders (.volume-slider)
- Update dynamic voice sliders to track --fill CSS variable
- Make .channel-section flex:1 with overflow so sidebar scrolls properly
  (fixes theme bar pushed off screen on mobile)
- Convert DM section to collapsible sub-menu (Discord-style toggle)
  - Click header to expand/collapse, state persists in localStorage
  - Shows total unread badge when collapsed
  - Auto-expands when a new DM opens
2026-02-12 17:52:29 -05:00
ancsemi 422e2bf5d8 Rearrange screenshots: Haven top-left, Matrix top-right, screen sharing wide bottom 2026-02-12 16:54:51 -05:00
ancsemi 833aa52308 Replace alt theme screenshot with screen sharing + voice chat screenshot 2026-02-12 16:46:33 -05:00
ancsemi 7425b73af8 Redirect help requests to help.havenapp@gmail.com 2026-02-12 15:34:30 -05:00
ancsemi ec11fef287 Add support/help page, update download to v1.4.5
- New docs/support.html: troubleshooting, FAQ, bug report instructions, contact info
- Added Help link to docs/index.html nav and footer
- Download buttons now point to v1.4.5 tagged release
- Version history updated with v1.4.5 as latest
2026-02-12 15:11:39 -05:00
ancsemi e65681ce94 fix: SSL_ERROR_RX_RECORD_TOO_LONG bat file now detects actual protocol (#2)
- Fixed %ERRORLEVEL% bug in Start Haven.bat (parse-time expansion inside if block)
- Bat file now detects HTTP vs HTTPS and opens correct URL in browser
- Added SSL/HTTPS troubleshooting to README and GUIDE
- Bumped version to 1.4.5
v1.4.5
2026-02-12 15:02:26 -05:00
ancsemi 2aa3499abe v1.4.4 Profile pictures, modernized emojis, AIM sounds, admin custom sounds
Added:
- User profile picture upload (2MB max, magic-byte validated PNG/JPEG/GIF/WebP)
- Avatar rendering in messages + online-users list with letter fallback
- Socket-based avatar sync (set-avatar event, real-time propagation)
- Emoji picker expanded to 500+ emojis across 10 categories (new: Monkeys, Faces)
- Modern emojis: side-eyes, monkeys, melting face, shushing, etc.
- AIM Classic synthesized sounds: message ding, door open, door close, nudge
- Join/Leave sound selectors in Settings with AIM options
- Admin custom sound upload system (1MB max, MP3/OGG/WAV/WebM)
- Custom sounds management UI with preview + delete
- Audio file playback engine with caching in NotificationManager

Changed:
- Emoji categories restructured from 8 to 10
- CSP mediaSrc updated for audio data URI support
- Message rendering uses img tags for PFP with onerror fallback
- Online users show 24px avatar circles
- All 10 theme avatar borders extended to img variant
2026-02-12 13:56:36 -05:00
ancsemi 8b401e5632 v1.4.3 Legal overhaul: 18+ age gate, comprehensive ToS/EULA v2.0, LICENSE hardening
- Rewrote 8-clause Release of Liability into 12-section Terms of Service,
  EULA & Release of Liability (age restriction, indemnification, dispute
  resolution, class action waiver, limitation period, IP rights, severability,
  survival of terms, etc.)
- Added mandatory 18+ age verification checkbox (separate from EULA acceptance)
- Server enforces ageVerified on both /api/auth/login and /api/auth/register
- Database: age_verified column added to eula_acceptances table
- LICENSE: added Age Restriction (Section 4) and Indemnification (Section 5)
- EULA version bumped to 2.0  all existing users must re-accept on next login
- CSS: h4/ul styling for EULA content, widened modal to 700px, checkbox spacing
2026-02-12 13:39:12 -05:00
ancsemi f48edca597 Fix OG/Twitter thumbnail to login screenshot, fix all changelog dates 2025->2026 2026-02-12 12:55:38 -05:00
ancsemi 68b0289299 Fix og:url, add canonical URL, theme-color, and twitter:site meta tags 2026-02-12 12:47:50 -05:00
ancsemi 7d2074b68d Add FUNDING.yml to enable Sponsor button with Ko-fi link 2026-02-12 12:45:34 -05:00
ancsemi ebc1e3a2ec Update landing page — add all screenshots, mobile showcase, themes gallery 2026-02-12 12:12:24 -05:00
ancsemi 75fd77342d Remove old website/ path — moved to docs/ for GitHub Pages 2026-02-12 11:35:14 -05:00
ancsemi 058e8a2ca5 Move landing page to docs/ for GitHub Pages compatibility 2026-02-12 11:35:02 -05:00
ancsemi cb9005306b Add Haven landing page website — themed to match Haven default theme, with download, version history, features, comparison table, Ko-fi donation link 2026-02-12 11:27:19 -05:00
ancsemi a93efeac98 Update README with new screenshots and formatting
Added additional screenshots to README and improved formatting.

Signed-off-by: ancsemi <ancsemi@gmail.com>
2026-02-12 09:54:22 -05:00
ancsemi c8da84658c v1.4.2 fix admin status & display name lost on reconnect
- Socket auth middleware now refreshes is_admin + display_name from DB
  on every connect, not just from possibly-stale JWT payload
- Admin status synced from .env ADMIN_USERNAME on every socket connect
  (not only login), so .env changes take effect without re-login
- New session-info event pushes authoritative user data to client on
  every connect/reconnect, overwriting stale localStorage
- Client handles session-info to update display name, admin UI, and
  localStorage in real time
2026-02-12 09:24:51 -05:00
ancsemi 75b43da088 v1.4.1 independent voice/text channels, mobile input & header fixes
- Decouple voice from text channels (Discord-style): dedicated voice:<code>
  socket.io rooms, server-side leave on switch, broadcastVoiceUsers emits to
  both voice and text rooms, lightweight voice-count-update to all clients
- Sidebar voice indicators:  badge with user count per channel
- Mobile input: shorter placeholder, 34px buttons, tighter padding, 90px
  auto-resize cap
- Mobile header: remove flex-wrap, hide 'Voice' label text at 768px,
  allow voice-controls to shrink
- Roadmap added to README (webhooks, permissions, threads, files, E2EE)
- Version bump 1.4.0  1.4.1
2026-02-12 08:48:59 -05:00
ancsemi c623cad764 v1.4.0 display name separation, mobile overhaul, GIPHY branding fix
- Display name now separate from login username (stored in display_name column)
  - Login name set at registration, immutable, shown as @username subtitle
  - Display name freely changeable, allows spaces, non-unique
  - All messages/voice/leaderboards show display name via COALESCE
  - JWT and auth responses include displayName field
- Mobile viewport fix: 100vh -> 100dvh (dynamic viewport height)
  - Message input no longer hidden behind phone URL bar
- Mobile header decluttered: hide search/pin/delete/copy icons on <= 768px
- Mobile voice join button added to right-sidebar users panel
- Status bar hidden on mobile to reclaim vertical space
- Message toolbar tap-to-reveal at 768px breakpoint (was only 480px)
- GIF picker: corrected Tenor branding to GIPHY to match actual API
2026-02-12 08:23:42 -05:00
ancsemi ed80125ed9 v1.3.9 fix stale-cache command breakage, mobile tap-to-reveal toolbar
Fixed: static file caching changed from 1h maxAge to always-revalidate with ETags, preventing stale JS after server restarts

Improved: mobile message actions (react/reply/pin/edit/delete) hidden by default, revealed with a tap on the message, cleaned up phone UI significantly
2026-02-12 07:18:13 -05:00
ancsemi b4fc865cfa v1.3.8 in-game leaderboard, voice dropdown, 5 new themes, themed sliders
Fixed: leaderboard scoring (removed noopener), darkened Dracula theme

Added: in-game leaderboard panel, high-score announcements, voice controls dropdown, Dark Souls/Elden Ring/Minecraft/FFX/Zelda themes, themed slider fills with per-theme glow effects
2026-02-11 23:57:59 -05:00
ancsemi c866b76515 v1.3.7 voice leave audio cue, stream cleanup, QoL fixes
- Play voice_leave tone when local user leaves voice chat
- Show 'Left voice chat' info toast on disconnect
- Destroy all screen-share tiles on voice leave (fixes ghost tiles)
- Escape key now closes all modal overlays (settings/bans/leaderboard/add-server)
2026-02-11 23:38:03 -05:00
ancsemi a38de7f668 v1.3.6: NS default 10%, RGB speed boost, triangle bg vibrancy, DM voice persist, stream resize, theme popup 2026-02-11 23:01:52 -05:00
ancsemi 84f6b79611 v1.3.5: NS sensitivity slider, RGB cycling theme, custom theme overhaul 2026-02-11 22:36:46 -05:00
ancsemi 04530223ff v1.3.4: noise suppression, persistent voice, delta-time physics, leaderboard 2026-02-11 22:23:09 -05:00
ancsemi 7423a83242 v1.3.3: bug fixes, TenorGIPHY migration, custom theme picker
Fixed:
- Upload error handling (check HTTP status before JSON parse)
- Screen share X button (minimize instead of destroy streams)
- Online users visibility (show all connected users server-wide)
- DM button feedback (toast, disable, scroll to channel)

Changed:
- Replaced Tenor GIF API with GIPHY (endpoints, client patterns, README)

Added:
- Custom theme with canvas-based HSV triangle colour picker
- Theme persists in localStorage, applies on page load without flash
2026-02-11 22:10:40 -05:00
ancsemi d7f91ee4da v1.3.2: Security hardening II + QoL features
Security:
- Upload serving: Content-Disposition: attachment for non-images
- Image magic-byte validation (JPEG/PNG/GIF/WebP headers checked)
- CSP tightened: ws: removed, wss: only
- Inline onerror handler replaced with delegated JS listener
- Password min raised to 8 chars
- Account enumeration mitigated on registration

QoL:
- Password change from settings (POST /api/auth/change-password)
- Emoji picker: 8 categories, search bar, 280+ emojis
- /butt slash command
2026-02-11 21:41:58 -05:00
ancsemi 8718754a56 v1.3.1 Security hardening
- GIF endpoints: require auth + rate limit (30/min/IP)

- Health endpoint: strip version fingerprint

- Port 3001 redirect: rate limit, timeouts, fix open redirect

- Link preview: rate limit + DNS rebinding SSRF protection

- HSTS, Permissions-Policy, Referrer-Policy, X-Content-Type-Options

- Server timeouts: headers 15s, request 30s, keepalive 65s, socket 120s
2026-02-11 21:23:08 -05:00
ancsemi 63e4880885 License: non-commercial clause, Tenor setup guide, Shippy description trim
- Replace MIT with MIT-NC: prohibit selling/monetizing without permission

- Add attribution link to original author (ancsemi)

- Add full Tenor API setup instructions to README

- Shorten Shippy Container game description
2026-02-11 21:17:16 -05:00
ancsemi 255629d2d4 v1.3.0: DMs, user status, channel topics, file sharing, persistent unread
Features:
- Direct messages: private 1-on-1 via DM button in member list
- User status: online/away/dnd/invisible with custom text + auto-away
- Channel topics: admin-editable topic bar below channel header
- File sharing: upload PDFs, docs, audio, video, archives (25 MB limit)
- Persistent read state: server-tracked unread counts survive refresh

Database:
- New read_positions table for unread tracking
- New columns: users.status, users.status_text
- New columns: channels.topic, channels.is_dm
- New column: messages.original_name
- All migrations are safe for existing DBs

UI:
- Status picker dropdown in sidebar
- DM section in channel list
- File attachment cards with type icons
- Inline audio/video players in chat
- Status dots colored by user status
- Topic bar with click-to-edit for admins

Server:
- /api/upload-file endpoint with expanded MIME whitelist
- set-status, set-channel-topic, start-dm, mark-read socket events
- get-channels returns topic, is_dm, unread counts
- emitOnlineUsers includes status data
- Idle detection with 5-min auto-away
2026-02-11 20:44:05 -05:00
ancsemi 415ff761e4 v1.2.0: comprehensive bug hunt + voice UX + pinning + link previews + GIF search
Security fixes:
- Admin username hijack via rename (critical)
- XSS via unescaped quotes in _escapeHtml (critical)
- SSRF protection on /api/link-preview
- API key leak in get-server-settings to non-admins
- Cross-channel reaction removal without verification
- Voice signaling (offer/answer/ICE) without room membership check
- Typing indicator without channel membership check

Bug fixes:
- Voice audio: single MediaStreamSource splits to analyser + gain
- Talking indicator: 300ms hysteresis for smooth detection
- Screen share: SDP rollback, event.streams[0], track.onunmute
- GIF send broken: wrong property names silently dropped all GIFs
- Reconnect recovery: re-emit channel/state events on socket reconnect
- Screen share privacy: stopScreenShare() on viewer close
- Auto-scroll: force flag after message append
- Delete-user FK violation: clean up all related tables
- Delete-channel: remove associated pinned_messages
- Delete-message: remove associated pinned_messages
- LIKE wildcard injection in search-messages

Performance:
- N+1 query in get-messages replaced with 3 batch queries

Features (from prior uncommitted work):
- Voice join/leave audio cues, talking indicators
- Multi-stream screen sharing with tiled grid
- Message pinning (admin-only, 50/channel cap)
- Enhanced markdown: fenced code blocks, blockquotes
- Link previews with OG metadata + 30min cache
- Tenor GIF search with admin-configurable API key

Docs:
- README updated with new features, voice/screen share docs
- CHANGELOG v1.2.0 entry with full details
- Version bumped to 1.2.0
2026-02-11 20:33:29 -05:00
ancsemi 330e8f6f25 Fix voice audio, talking indicator, screen share, and GIF setup UX
Voice audio (Bug 2):
- Guard _playAudio against duplicate Web Audio graph creation
- Prevents multiple GainNodes competing for the same stream

Talking indicator (Bug 3):
- Already fixed: 300ms hysteresis hold timer in both local and remote
  talk detection (prevents flicker from micro-pauses between syllables)

Screen share (Bug 4):
- Add SDP rollback in voice-offer handler for renegotiation glare
- Guard voice-answer handler against stale answers after rollback
- Use event.streams[0] in ontrack for proper stream association
- Add track.onunmute to re-trigger screen display when data arrives
- Mute all screen share video tiles (prevents browser autoplay block)
- Explicit vid.play() call as autoplay backup

GIF search (Bug 1):
- Tenor API key can now be set from the admin GIF picker UI
- Stored in server_settings DB table (no .env editing needed)
- Server checks DB first, falls back to TENOR_API_KEY env var
- Shows step-by-step setup guide when key is missing
- Non-admins see a clear 'ask your admin' message
2026-02-11 19:40:19 -05:00
ancsemi 31644c4d39 Voice UX polish, message pinning, markdown, link previews
- Voice join/leave audio cues (ascending/descending synth tones)
- Talking indicator: username glows with accent pulse when speaking
- Multi-stream screen sharing: CSS Grid tile layout, per-user labels
- Fix remoteStream variable reference bug in voice.js _createPeer
- Message pinning (admin-only): pin/unpin with DB table, panel, 50-pin limit
- Enhanced markdown: fenced code blocks, blockquotes, improved inline code
- Link previews: server-side OG metadata fetch with 30-min cache, preview cards
- CSP updated for preview images
- .gitignore: exclude .vs/
2026-02-11 19:18:30 -05:00
ancsemi 2ecba49848 feat: screen sharing, mobile overhaul, whitelist access control
- Screen sharing via WebRTC getDisplayMedia, renegotiation with
  all peers, video viewer panel with close/minimize
- Mobile: safe-area-inset support, PWA meta tags, enhanced phone
  breakpoints (480/360px), GIF picker full-width, pull-to-refresh
  prevention, improved touch targets, scroll smoothing
- Whitelist: database table, registration gate, admin toggle +
  add/remove UI in settings, server_settings integration
2026-02-11 18:09:24 -05:00