feat: add terms of service and privacy policy pages (#567)
* feat: add terms of service and privacy policy pages
- /terms: comprehensive ToS with artist/listener terms, DMCA policy (3-strike), arbitration
- /privacy: ATProto-specific privacy policy with GDPR/CCPA considerations
- DMCA agent registered: DMCA-1069186
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: require terms acceptance on first login
- add terms_accepted_at column to user_preferences
- add POST /preferences/accept-terms endpoint
- create /accept-terms page with summary + full terms links
- add layout guard to redirect authenticated users who haven't accepted
existing users will be prompted on next visit to an authenticated route.
public pages (/, /track/*, /u/*, /terms, /privacy) don't require acceptance.
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: improve legal pages with configurable emails and accurate content
- add LegalSettings config with contact/privacy/dmca emails
- expose legal config via /config endpoint
- create cookie policy page (/cookies)
- fix privacy section 8 to acknowledge moderation (image blurring, DMCA)
- add links to ATProto glossary, external services (Cloudflare, Fly, Neon, Logfire)
- fix terms overlay language to be concrete ("store, stream, transcode")
- add /cookies to terms overlay path exclusions
- delete old /accept-terms route with hardcoded outdated language
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* simplify terms and privacy to match tangled.org style
- cut arbitration, class action waiver, detailed GDPR/CCPA sections
- cut separate cookie policy page
- cut AI training prohibition, listener terms, detailed DMCA procedures
- keep DMCA agent (registered), ATProto federation limitation
- add external PDS disclaimer (like tangled)
- ~475 lines โ ~240 lines terms, ~530 lines โ ~220 lines privacy
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: await logout and reload page to dismiss terms overlay
the overlay depends on layout data which doesn't reactively update
when auth state changes. using window.location.href forces a full
reload to clear the stale layout data.
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: add legal drafts
- terms.md - simplified terms of service
- privacy.md - simplified privacy policy
- questions.md - open questions
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: clarify safe harbor question
* docs: use protonmail for legal contact emails
placeholder domain emails don't exist yet. using plyrdotfm@proton.me
until cloudflare email routing is set up.
๐ค Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
authored by