A React Native app for streaming WMBR 88.1 FM and browsing show archives, song history, and schedules.
You can download the latest release from the Apple and Google Play mobile app stores.
- Live Stream: Listen to WMBR 88.1 FM with live show information
- Song History: Browse recently played songs with Apple Music previews
- Show Archives: Access and play archived shows
- Schedule: View weekly show schedule with current show highlighting
- Show Information: See current hosts, descriptions, and show frequency
- Complete the React Native environment setup
- Install dependencies:
npm install - Start the server:
npm start
- Install iOS pods:
bundle install && cd ios && bundle exec pod install- If
bundle exec pod installfails, trypod install
- If
- Copy
ios/.xcode.envtoios/.xcode.env.localand modify the node path - Open the app in Xcode:
open ios/WmbrApp.xcworkspace
- Build the app (⇧⌘B)
- Start the simulator with:
npm run ios -- --simulator="iPhone 16" # "iPhone 17" if you're on macOS / Xcode 26
- Start Android emulator via Android Studio or connect physical device
- Enable USB debugging on physical devices
- Run debug build:
npm run android
npx react-native bump-version --type (patch|minor|major)Tag the current HEAD of main branch with the new version number.
git tag vX.Y.Z
git push origin --tags- Get
wmbr-upload-key.keystorefile and place inandroid/directory - Set up signing configuration:
cd android cp gradle-local.properties.default gradle-local.properties - Edit
gradle-local.propertieswith keystore credentials (passwords and alias)
Windows:
cd android && gradlew bundleReleasemacOS/Linux:
cd android && ./gradlew bundleReleaseOutput: android/app/build/outputs/bundle/release/app-release.aab
- Hot reload: Save any file to see changes instantly
- Restart: Press
Rin the simulator to reload - Debug menu: Press
Cmd + Din simulator for debug options - Path aliases: Path aliases must be set up in both
tsconfig.jsonandbabel.config.js
- Clear Metro cache:
npm start -- --reset-cacheThis project uses a patch-package solution to fix compatibility issues between react-native-track-player and Kotlin 2.1.x. The original package had TurboModule compatibility issues with newer Kotlin versions causing build failures.
Solution Steps:
- Modified the problematic Kotlin files in
node_modules/react-native-track-player/ - Generated the patch file using
npx patch-package react-native-track-player - Patches are automatically applied during
npm installvia thepostinstallscript - No manual intervention required - the fixes are version controlled in the
patches/directory
Modifications made to react-native-track-player:
In MusicModule.kt:
- Added a wrapper function
launchInScope()to fix coroutine scope issues with Kotlin 2.1.x - Replaced all
scope.launchcalls withlaunchInScopecalls - Fixed nullable bundle handling by adding
?: Bundle()fallbacks - Changed all
return@launchtoreturn@launchInScopefor consistency
In MusicService.kt:
- Fixed the
onBind()method signature to handle nullable Intent parameter properly
If you encounter build errors with react-native-track-player:
- Ensure patches are applied:
npx patch-package - Check that
patches/react-native-track-player+4.1.1.patchexists - Verify
postinstallscript is in package.json
- State Management: React hooks and context
- UI: React Native with custom animations
- APIs: WMBR metadata and archive services