FreePlay is a companion app for freeplay.church. It runs on any Android TV device and will pre-fetch each weeks lesson in the classroom so they're ready to be displayed on Sunday without needing an Internet connection. The lessons can be scheduled in advance for classrooms and customized.
The only reason this program is free is because of the generous support from users. If you want to support us to keep this free, please head over to ChurchApps or sponsor us on GitHub. Thank you so much!
We have a great community for end-users on Facebook. It's a good way to ask questions, get tips and follow new updates. Come join us!
If you discover an issue or have a feature request, simply submit it to our issues log. Don't be shy, that's how the program gets better.
If you would like to contribute in any way, head over to our Slack Channel and introduce yourself. We'd love to hear from you.
If you'd like to set up the project locally, see our development guide. For this app:
- Update .env - to point to production or your dev environment.
- Start React Native - Run
npm startto start the React Native server. - Install Android App - In Android Studio open the /android folder. Either configure a new Android TV emulator or connect a AndroidTV device and click the run button to install the app.
- Connect App to React Native - Run
adb shell input keyevent 82to open the developer menu. Go to settings, Debug server host and enter YourIP:8081. Restart the app via Android Studio.
- Make sure the environment variables point to the production servers in EnvironmentHelper.ts
- Increment the version number in android/app/build.gradle
- Run
cd androidfollowed bygradlew bundleReleaseto produce the release bundle. (If fails, File->Invalidate Caches in Android Studio) - Run
cd..followed byreact-native run-android --variant=releaseto generate an apk file. You can close the node window when it completes. - The apk file is located at
android/app/build/outputs/apk/release/app-release.apk. Publish it to the Amazon and Google Play stores.
FreePlay is designed to be forked and re-skinned. You can lock it to a single content provider (e.g. only lifechurch), give it your own name, icons, and colors, and ship it under your own developer accounts to the App Store, Google Play, and Amazon Appstore.
The entire customization surface is one file β branding.json β plus the asset files you replace. No TypeScript changes required.
-
Fork the repo on GitHub.
-
Edit
branding.jsonat the repo root. Required fields to change:appNameβ display name on the deviceslugβ Expo slug (must be unique)schemeβ deep-link URL scheme (e.g.church.yourorg.player)ownerβ your Expo account ownerandroid.packageβ Play / Amazon bundle IDios.bundleIdentifierβ App Store bundle IDeas.projectIdβ fromnpx eas init(see step 5)eas.updatesUrlβ Expo gives you this when you create the projectsentry.organization/sentry.projectβ if you use Sentry; otherwise remove the Sentry plugin fromapp.config.jsproviderIdsβ array of provider IDs to expose. Set to a single entry (e.g.["lifechurch"]) to lock the app to one provider and skip the picker screen entirely.colors.primaryβ your brand accent color (hex). Light/dark variants and tinted overlays are also configurable; if you only setprimary, the overlay tints derive from it automatically.tvosSubmitβ yourascAppIdandappleTeamIdfor tvOS submission (only needed if you ship to Apple TV)
-
Replace assets (keep the same filenames so
app.config.jsdoesn't need to change):assets/images/icon.pngβ app iconassets/images/splash.pngβ splash screenassets/images/tv_banner.pngβ Android TV bannerassets/images/tv_icon.pngβ Android TV iconassets/images/icon-*.pngβ the Apple TV image set (icon-1280x768, icon-400x240, icon-800x480, icon-1920x720, icon-3840x1440, icon-2320x720, icon-4640x1440)src/images/logo.png,src/images/logo-white.png,src/images/logo-icon.pngβ in-app logos
-
Replace Firebase configs (or remove Firebase):
google-services.jsonβ Android Firebase config from your Firebase projectGoogleService-Info.plistβ iOS Firebase config from your Firebase project- If you don't need Firebase, remove
"@react-native-firebase/app"from thepluginsarray inapp.config.js.
-
Create your EAS project under your Expo account:
npx eas initPaste the generated project ID into
branding.jsoneas.projectId. EAS will also print the updates URL β paste that intoeas.updatesUrl. -
Update
eas.jsonsubmit credentials (only if shipping to tvOS):submit.tvos-production.ios.ascAppIdandappleTeamIdβ match what you put inbranding.json. These are read byeas submit, not by the app.
-
Build:
eas build --profile production --platform android # Play Store eas build --profile amazon # Amazon Appstore eas build --profile tvos-production --platform ios # Apple TV
git remote add upstream https://github.com/ChurchApps/FreePlay.git
git pull upstream main
Your changes live almost entirely in branding.json and binary asset files, so merge conflicts in source code should be rare.
When branding.json has exactly one entry in providerIds:
- The "Providers" picker screen is skipped β after the splash, the app routes the user directly into that provider's auth flow (or straight to its content if it doesn't require auth).
- The "Providers" entry is hidden from the sidebar navigation.
- The Provider Settings screen still lets the user disconnect / re-authenticate, but doesn't offer to switch providers.
With multiple entries in providerIds, the app behaves exactly as upstream FreePlay does today.
- Install Windows Susbystem for Android
- Intall Amazon App Store for Windows and open it.
- Run
adb connect 127.0.0.1:58526 - Start the React Native server with
npm start - In Android Study, select
Microsoft...as the device and click Run. - Run
adb shell input keyevent 82to open the developer menu. Go to settings, Debug server host and enter YourIP:8081. Restart the app via Android Studio.



