soulsync/webui/static
BoulderBadgeDad a62d2d4310 ui appearance: default worker orbs OFF on Firefox for first-time users
The blurred 60fps worker-orb canvas is the main remaining Firefox lag source after the
#935 sweep (multiple Discord lag reports). So for a FIRST-TIME user with no saved
preference, default the orbs OFF on Firefox (smooth first impression where it's needed)
and ON everywhere else (full polish where the browser handles it). An explicit saved
choice ALWAYS wins — this only picks the default when the user hasn't chosen.

Done kettui-style with a SINGLE source of truth, not the dual browser-detection I first
floated (server UA + client _isFirefox would be the same fact in two places that can
drift — exactly the server/client class #943's green-flash fix just cleaned up):

- core/ui_appearance.py (new, pure + importable): is_firefox_user_agent +
  resolve_worker_orbs_default(explicit, is_firefox) — explicit wins, unset → !firefox.
- web_server: the SERVER decides (UA via _request_is_firefox, request-context-safe) and
  injects initial_worker_orbs_enabled; config default flipped None so "unset" is
  distinguishable from an explicit False. The client just consumes the injected value
  (init.js unchanged) — no client-side re-derivation of "is Firefox".
- settings.js: the orb checkbox default now reflects the server value when unset, so
  saving Settings can't silently flip a first-time Firefox user's orbs back on.

No regression: Chrome users unchanged; users with an explicit setting unchanged (it
wins regardless of browser); /api/settings returns raw config so it can't clobber the
default for an unset value. Verified end-to-end through a real Flask request context
(Firefox→off, Chrome→on, explicit wins both ways, no crash outside a request). 8 pure
seam tests pin the contract; ruff clean.
2026-06-28 16:50:22 -07:00
..
docs update docs page 2026-03-13 08:35:28 -07:00
vendor Add WebSocket real-time updates with automatic HTTP polling fallback 2026-03-03 18:26:29 -08:00
amazon.svg Wire Amazon Music enrichment worker into dashboard UI 2026-05-16 17:43:38 -07:00
api-monitor.js wishlist: render library-sourced art (album + artist) — fix blank wishlist images 2026-06-27 17:35:28 -07:00
artists.png add static images 2026-03-09 17:35:46 -07:00
audiodb.png Dashboard: equalizer bars now show real brand logos in the avatar disc 2026-05-27 19:22:28 -07:00
auto-sync.js Auto-Sync Manager: redesign hourly + weekly boards as horizontal lanes 2026-06-25 13:06:07 -07:00
automation.png add static images 2026-03-09 17:35:46 -07:00
basic-search-v2.css Basic search: visual overhaul + per-source picker in hybrid mode 2026-05-28 10:22:07 -07:00
beatport-ui.js Add "All Libraries (combined)" mode to PlexClient 2026-05-06 15:39:19 -07:00
blocklist.js Blocklist Phase 1 (backfill + API + modal): the Blocklist button on the watchlist page 2026-06-07 15:25:52 -07:00
core.js dashboard: show SoulSync's own RAM next to system memory % 2026-06-27 13:42:14 -07:00
dashboard.png add static images 2026-03-09 17:35:46 -07:00
discover-section-controller.js Discover controller — Cin pre-review polish 2026-05-07 20:35:10 -07:00
discover.js Discover: listening-driven recommendations + mix (#913), Fresh Tape fix 2026-06-25 10:15:20 -07:00
discover.png add static images 2026-03-09 17:35:46 -07:00
docs-images-needed.md Service Badges, Page Headers, Docs Page, and Bug Fixe 2026-03-10 14:47:11 -07:00
docs.js #893: support M3U/M3U8 in playlist import-from-file 2026-06-21 19:43:59 -07:00
downloads.js merge: pull upstream/main (2.7.4) into feature/best-quality-search-mode 2026-06-19 16:54:51 +02:00
enrichment-manager.js Show "Running (Spotify Free)" instead of "rate limited" while the worker bridges 2026-06-05 22:08:07 -07:00
enrichment.js preview-clip findings: add Play button + length comparison to verify before approving 2026-06-27 16:27:27 -07:00
explorer.png Create explorer.png 2026-03-30 17:23:31 -07:00
favicon.png enlarge favicon 2026-02-13 16:11:32 -08:00
help.png Add media server setup, processing settings, text import, automation history, and streaming details 2026-03-10 15:35:18 -07:00
helper.js Release 2.8.0: version bump + docker-publish tag + What's New / version modal + PR description 2026-06-27 23:58:22 -07:00
hydrabase.png Add Hydrabase dev UI and WebSocket support 2026-02-21 00:32:04 -08:00
import.png add static images 2026-03-09 17:35:46 -07:00
init.js Bootstrap saved appearance effects early 2026-06-29 00:01:56 +02:00
library.js #916: align missing-track title match with the Reorganize matcher 2026-06-23 15:58:36 -07:00
library.png add static images 2026-03-09 17:35:46 -07:00
manifest.json Service worker for cover art + PWA manifest 2026-04-26 22:17:52 -07:00
media-player.js #809 review follow-up: crossfade preload also streams un-mounted Navidrome tracks 2026-06-07 13:55:58 -07:00
mobile.css Mobile: notification panel fits the screen (override inline JS positioning) 2026-06-04 20:50:33 -07:00
my-accounts.js Profiles: Tidal logo on a light disc (dark logo) in My Accounts 2026-06-10 13:49:25 -07:00
origin-history.js Watchlist: show WHICH tracks a scan found/added + group Download Origins (#831) 2026-06-09 20:14:02 -07:00
pages-extra.js downloads: restore Clear Completed for persisted history (clears the whole completed list) 2026-06-27 23:37:06 -07:00
particles.js perf(dashboard): cache particle glow sprites instead of per-frame gradients 2026-06-22 15:23:16 -07:00
placeholder-album.png Add missing placeholder-album.png to stop 404 spam in console 2026-03-23 18:05:11 -07:00
pwa-icon-192.png Service worker for cover art + PWA manifest 2026-04-26 22:17:52 -07:00
pwa-icon-512.png Service worker for cover art + PWA manifest 2026-04-26 22:17:52 -07:00
search.js Multi-artist tags: Search → Download Now finally knows its metadata source (Netti93) 2026-06-09 17:20:16 -07:00
search.png add static images 2026-03-09 17:35:46 -07:00
service-switch.js Profiles: revert Service Status modal to admin-only 2026-06-10 11:43:22 -07:00
settings.js ui appearance: default worker orbs OFF on Firefox for first-time users 2026-06-28 16:50:22 -07:00
settings.png add static images 2026-03-09 17:35:46 -07:00
setup-wizard.css Add informative help text and tips to every setup wizard step 2026-04-11 23:26:01 -07:00
setup-wizard.js Rebrand folder terminology: Download→Input, Transfer→Output, Staging→Import 2026-04-18 17:35:20 -07:00
shared-helpers.js webui: sync organize-by-playlist toggles + stop dashboard poller 401-spam while locked 2026-06-12 13:28:24 -07:00
shell-bridge.js Library cards: in-card badges no longer trigger artist-detail navigation 2026-06-25 13:57:34 -07:00
stats-automations.js Wing It Pool: two-card landing (review + resolved), matching the Discovery Pool 2026-06-25 14:15:42 -07:00
style.css reduce-effects: kill expensive GPU properties, stop freezing functional motion 2026-06-28 16:22:10 -07:00
sw.js SW: stop cover-art burst from hard-failing on first load 2026-06-11 12:03:41 +02:00
sync-lastfm.js Add Last.fm Radio tab to Sync page (Phase 1c.2) 2026-05-26 15:24:23 -07:00
sync-listenbrainz.js Add Last.fm Radio tab to Sync page (Phase 1c.2) 2026-05-26 15:24:23 -07:00
sync-services.js #867 UX: open Tidal discovery modal in 'discovering' phase so the empty/loading modal isn't interactable 2026-06-13 11:03:40 -07:00
sync-soulsync-discovery.js SoulSync Discovery sync tab: list all kinds + Listening Mix generator 2026-06-25 11:38:41 -07:00
sync-spotify.js Fix playlist sync status labels 2026-06-25 13:43:24 +02:00
sync.png add static images 2026-03-09 17:35:46 -07:00
track-detail.js Track-detail modal: click any download row for a rich, status-aware view 2026-05-31 20:24:37 -07:00
trans.png Add SoulID worker with API-based debut year disambiguation 2026-03-21 10:21:06 -07:00
trans2.png Create trans2.png 2026-03-21 10:23:36 -07:00
watchlist-history.js Watchlist: bespoke live scan deck + persistent per-run Scan History (#831 round 2) 2026-06-09 20:35:16 -07:00
whisoul.png Add library repair worker and UI 2026-02-21 15:00:23 -08:00
wishlist-tools.js feat(quarantine): consolidate quarantine view into downloads page filter 2026-06-24 15:14:54 +02:00
worker-orbs.js worker orbs: drive the render loop with setInterval on firefox (permanent 1fps fix) 2026-06-27 18:27:31 -07:00