Commit Graph

8 Commits

Author SHA1 Message Date
Jeff Emmett b9551d7597 feat: add integrated music player with Navidrome + Soulseek support
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>
2026-03-30 20:35:13 -07:00
Jeff Emmett 8c79b97ef7 feat: add one-click channel approval via email
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>
2026-03-23 12:15:10 -07:00
Jeff Emmett cee87aef10 feat: replace request channel form with iptv-org search & select UI
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>
2026-03-22 18:21:36 -07:00
Jeff Emmett 709a87731c feat: add Request a Channel page, API route, and homepage buttons
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>
2026-03-22 17:02:26 -07:00
Jeff Emmett 228f3c6658 feat: replace Tailscale VPN gate with simple access code
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>
2026-03-16 14:07:22 -07:00
Jeff Emmett 99f9f0d681 fix: allow self-signed cert for Mailcow SMTP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:54:36 +00:00
Jeff Emmett 3a2604ea2e feat: switch email from Resend to Mailcow SMTP
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>
2026-02-10 01:52:34 +00:00
Jeff Emmett 279bd30c72 feat: add Live Sports button and user access request system
- 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>
2026-01-31 11:26:31 +00:00