Files
chrisandClaude Opus 5.5 15ab815df6 Share what's playing in any Android music app
A local Expo module listens to system media sessions (the only way
Android exposes other apps' playback, gated by notification access; we
never read notifications). It filters to known music apps, debounces and
deduplicates changes, sends a heartbeat while playing, and delivers
reports through WorkManager so they survive the app being closed.

- One-screen onboarding that doubles as Google Play's prominent
  disclosure, opening straight to the app's toggle in Android settings
- Only media notifications are pre-ticked on that settings screen
- Device registration is single-flight (several screens react to the
  same permission change) and self-heals if the server revokes a token
- Sign-out revokes the phone's token; resuming sharing re-sends the
  current track immediately
- Pause controls in Settings and on the feed
- Fix invisible tab icons and labels on Android
- Keep Metro out of build output so it doesn't exhaust file watchers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MzFywujuH9TiuXbr9vjoX8
2026-10-03 17:37:30 -04:00

21 lines
845 B
JavaScript

// https://docs.expo.dev/guides/customizing-metro/
const { getDefaultConfig } = require('expo/metro-config');
const config = getDefaultConfig(__dirname);
// Metro watches the whole monorepo. Keep it out of build output (Gradle, Xcode,
// Next.js, tsup): those folders hold tens of thousands of files, and exhausting
// the OS file-watch limit makes Metro silently stop picking up code changes.
const buildOutput = [
/[/\\]apps[/\\]mobile[/\\]android[/\\]/,
/[/\\]apps[/\\]mobile[/\\]ios[/\\]/,
/[/\\]modules[/\\][^/\\]+[/\\]android[/\\]build[/\\]/,
/[/\\]apps[/\\]web[/\\]\.next[/\\]/,
/[/\\]apps[/\\]api[/\\]dist[/\\]/,
/[/\\]\.turbo[/\\]/,
];
const existing = config.resolver.blockList;
config.resolver.blockList = [...(Array.isArray(existing) ? existing : existing ? [existing] : []), ...buildOutput];
module.exports = config;