- Add shuffle toggle to mini-player and full-screen player (Fisher-Yates
shuffle of upcoming queue items, restores original order on toggle off)
- Fix ADD_TO_QUEUE to insert after current track instead of appending to end
- Add confirmation dialog ("Switch song, DJ Cutoff?") when clicking a
different song while one is playing
- Dedup playlist songs by title+artist (keeps first occurrence)
- Make artist name clickable in full-screen player (navigates to search)
- Music page reads ?q= param to pre-fill search from artist links
- Add pre-cache module for upcoming tracks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fetch timed LRC lyrics from LRCLIB API (Navidrome fallback for plain text)
- Synced lyrics component with auto-scroll, active line highlighting, and tap-to-seek
- Past lines fade out, current line enlarges — Spotify-style karaoke experience
- Add "Download All" button on expanded playlists for bulk offline download
- Button shows green checkmark when all songs already downloaded
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Deduplicate Navidrome search results by title+artist (keep highest bitRate)
- Deduplicate Soulseek results by filename across peers (show peer count badge)
- Add MusicBrainz fuzzy search with one-tap Soulseek auto-download
- Add swipe-right-to-queue gesture on mobile song rows
- Add audio output device selector (phone/Bluetooth) in full-screen player
- Include offline mode, download button, and service worker from prior work
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Polls /api/version every 60s and on tab focus. When the server's
build ID differs from the one loaded at page init, a fixed purple
banner appears at the top of the screen prompting the user to reload.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Playlists now display as expandable cards with cover art thumbnails
on the /music page when no search is active. Tapping a playlist
reveals its songs with cover art via the SongRow component.
Also added GET handler for /api/music/playlist/[id] and
improved playlist-picker dialog with cover art.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Search and play music from the Navidrome library with a persistent mini
player, full-screen drawer with lyrics/playlists, and Soulseek P2P
fallback for discovering new tracks. All streaming proxied through
server-side API routes to keep credentials hidden.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace manual Threadfin lookup instructions with a signed approve
button in admin notification emails. Clicking it activates channels
in Threadfin via WebSocket API and sends a confirmation email to
the requester.
- Add /api/approve-channels endpoint with HMAC-signed tokens
- Add lib/threadfin.ts for WebSocket-based channel activation
- Add lib/token.ts for signed token creation/verification
- Add ws dependency for Threadfin WebSocket communication
- Update docker-compose with TOKEN_SECRET and THREADFIN_* env vars
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users now browse the iptv-org catalog instead of manually typing channel
names. Adds /api/channels proxy with 1-hour cache, debounced search,
click-to-select with chips, and updated admin email format.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add channel request form (/request-channel) that emails admin with
channel details via nodemailer. Adds cyan "Request a Channel" button
to both hero and CTA sections of the homepage alongside Live TV and
Music buttons. Rename Traefik router to avoid conflicts with media stack.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the vpn-setup/ directory (Headscale/Tailscale scripts, CoreDNS,
onboarding) and add a lightweight access code gate instead. Visitors
must enter a code to view the site — validated via API route with an
httpOnly cookie persisted for 1 year.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Movies/Shows/Music/Live Sports buttons with Request/Watch/Upload
flow. Update request-access page with clear requests.jefflix.lol and
movies.jefflix.lol instructions plus install-as-app tips. Clean up
README, remove @vercel/analytics, add backlog tasks and vpn-setup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resend required domain verification that wasn't set up. Switch to
self-hosted Mailcow (mx.jeffemmett.com) using nodemailer for SMTP,
matching the pattern used by other projects (cosmolocal, etc).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Live Sports button linking to Jellyfin Live TV section
- Create /request-access page for users to request account access
- Add API endpoint that sends email notifications via Resend
- Add environment variables for RESEND_API_KEY and ADMIN_EMAIL
- Add .gitignore to exclude build artifacts and node_modules
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add og-image.jpg (1200x630) for link previews
- Add metadataBase, openGraph, and twitter metadata to layout.tsx
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change media server links from jeffemmett.com to jefflix.lol subdomains:
- movies.jefflix.lol for movies
- shows.jefflix.lol for TV shows
- music.jefflix.lol for music
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds new section before footer encouraging users to support real artists
instead of extractive corporate gatekeepers:
- Filmworkers Unions (strike funds, worker cooperatives)
- Local Arts Funds (theaters, galleries, indie creators)
- Direct to Artists (Patreon, Bandcamp, Ko-fi)
Includes callout with streaming cost breakdown ($180/year to corporations)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace generic hand icon with new custom design in key section.
#VERCEL_SKIP
Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>