audio streaming app plyr.fm
38
fork

Configure Feed

Select the types of activity you want to include in your feed.

status: add ambient theme, CORS, AT-URI lookup, docs rewrite, UX fixes (#1137)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

authored by

nate nowack
Claude Opus 4.6
and committed by
GitHub
8f841550 28a65d30

+54 -2
+54 -2
STATUS.md
··· 47 47 48 48 ### March 2026 49 49 50 + #### ambient weather theme — "live" (PRs #1127-1136, Mar 16) 51 + 52 + **why**: plyr.fm had dark/light/system themes but no personality. the ambient "live" theme adds a location-aware atmospheric background that reflects real weather conditions — making the app feel connected to the listener's environment. 53 + 54 + **what shipped**: 55 + - new "live" theme option alongside dark/light/auto in both desktop and mobile settings 56 + - fetches weather from Open-Meteo API using device geolocation, renders gradient background based on conditions (clear/cloudy/rain/snow/fog/storm × day/night × temperature warmth) 57 + - full UI tinting: 12 CSS variables (glass surfaces, borders, track cards, backgrounds) are blended with weather-derived tint colors at 6-15% strength 58 + - live is a first-class peer theme, not a toggle layer — server-persisted per account via new `theme` column on `user_preferences` (alembic migration) 59 + - localStorage is a flash-prevention cache synced from server, not source of truth 60 + 61 + **technical notes**: 62 + - initial implementation (#1127-1132) built live as a separate toggle, which caused bugs on account switch (light base + ambient gradient = broken UI). redesigned in #1134 to make live a peer of dark/light/system 63 + - theme was never server-persisted before this work — it was purely localStorage. added the DB column and wired preferences.fetch() to sync server → localStorage → DOM 64 + - accent color had the same sync gap (#1136): server stored it, but preferences.fetch() never applied it to the DOM or localStorage. on fresh loads, `--accent` fell back to CSS default blue regardless of saved preference 65 + - geolocation is cached device-global (`ambient_location` in localStorage) — survives theme switches for instant re-activation. old DID-scoped keys are auto-migrated 66 + - live resolves to dark base theme (CSS class `theme-dark`), with gradient overlay and tinted variables on top 67 + 68 + --- 69 + 70 + #### CORS open access + Jetstream fixes (PRs #1106-1107, Mar 14) 71 + 72 + **why**: CORS was restricted to `*.plyr.fm` subdomains, blocking third-party ATProto clients and embeds from calling the API. separately, the Jetstream consumer was crash-looping due to OpenTelemetry span errors, and PDS uploads failed silently on transient network errors. 73 + 74 + **what shipped**: 75 + - CORS now allows any HTTPS origin to call the API 76 + - fixed Jetstream crash loop caused by OTEL span context errors 77 + - added retry logic for PDS upload network failures 78 + 79 + --- 80 + 81 + #### AT-URI lookup endpoints (PR #1123, Mar 15) 82 + 83 + **why**: external ATProto clients need to resolve `at://` URIs to plyr.fm page URLs. without this, a client that discovers a `fm.plyr.track` record on the network has no way to link to it on plyr.fm. 84 + 85 + **what shipped**: 86 + - `GET /tracks/by-uri?uri=at://...` and `GET /playlists/by-uri?uri=at://...` endpoints 87 + - returns the track/playlist object if found, 404 otherwise 88 + 89 + --- 90 + 91 + #### docs rewrite + UX polish (PRs #1108-1120, Mar 14-16) 92 + 93 + **what shipped**: 94 + - rewrote listeners and creators docs pages — lead with experience, not protocol jargon 95 + - reordered upload form: required fields first 96 + - PDS tooltip on upload form explaining what "store on your PDS" means 97 + - fixed liker profile links interrupting playback (#1121) 98 + - PDS tooltip hover uses delayed hide to prevent flicker (#1110) 99 + 100 + --- 101 + 50 102 #### [community feedback](https://bsky.app/profile/cinny.bun.how/post/3mgq2bao26s2p) (Mar 10) 51 103 52 104 three pieces of feedback on Bluesky: ··· 197 249 198 250 ### current focus 199 251 200 - Jetstream deployed to production with environment-scoped collection filtering and origin trust validation for ingest URLs. both API uploads and Jetstream ingest share a unified `run_post_track_create_hooks()` path for copyright scanning, genre classification, and embedding generation. remaining open question: audit trail persistence for firehose events. 252 + ambient "live" theme shipped to production — weather-aware atmospheric UI with server-persisted theme preference per account. theme and accent color now sync from server on every preferences fetch, fixing long-standing issue where preferences were localStorage-only and didn't survive account switches or fresh loads. Jetstream remains stable in production. 201 253 202 254 ### known issues 203 255 - iOS PWA audio may hang on first play after backgrounding ··· 332 384 333 385 --- 334 386 335 - this is a living document. last updated 2026-03-13 (status maintenance: archived February, added missing March entries). 387 + this is a living document. last updated 2026-03-16 (added ambient theme, CORS, AT-URI lookup, docs rewrite, UX fixes). 336 388