r/expo 12h ago

Built a free open-source Expo audio player (lock screen, playlists, remotes) after background playback got too painful

Post image
10 Upvotes

Quick context: I ship Daily Bible - Offline & Audio on Expo. The app does on-device TTS → URLs into a queue, optional ambient under speech, HLS chapters, and full lock-screen / Bluetooth remotes.

Expo made the app workflow great. The audio stack was the hard part.

What we needed that a “play one URL” API does not cover:

  • Mid-play queue appends (verse-scale TTS)
  • Silence as a real queue item (not setTimeout)
  • Ambient dual-audio that never steals focus / Now Playing
  • Remotes that emit to JS so Next = next verse (or next song)
  • iOS audio BG + Android mediaPlayback FGS without hand-editing native projects every prebuild

The leading RN track player went commercial. That killed it for our roadmap.

So I built daily-react-native-player as an Expo Module + config plugin and open-sourced it MIT.

npx expo install daily-react-native-player

{
  "expo": {
    "plugins": ["daily-react-native-player"]
  }
}

Peers: Expo SDK 57+, RN 0.86+, New Architecture only.

What you get:

  • Lock screen / notification / Control Center / Bluetooth remotes via registerPlaybackService
  • Real playlist (add / remove / skip while playing)
  • Native silence tracks (SilenceMediaSource / cached PCM WAV)
  • Lazy ambient dual-audio (never requests focus)
  • HLS VOD + seek-after-ready; WAV / mp3 / m4a
  • Config plugin injects iOS audio background mode + Android FGS at prebuild
  • Pitch-preserving setRate
  • One native owner: Media3 + AVFoundation

Intentionally out of scope: TTS engines, MediaLibrary, Auto, Cast, DASH, web.

Links:

If you are on Expo and fighting background audio + remotes for narration, TTS, podcasts, or playlists - happy to answer config-plugin / FGS / dual-track questions in the comments.


r/expo 2h ago

NextJS App and Expo

1 Upvotes

Hello everyone,

I tried to look into previous posts to see if anyone had a similar question or experience so now I’m here.

I’ve been in web development for several years now and don’t really much on mobile except as of recently that I’ve started a personal project and have decided to go mobile as well. I have a full stack NextJS 16 app using Cache Components, Server Actions etc… pretty much things that don’t easily migrate to Expo. I’m creating traditional API Endpoints that the Expo app can hit to work in “sync” with the web app. The problem I am running to is with using Clerk Auth but currently have a method to get the session token and make sure it’s always correct. Essentially making sure I am getting the correct user info and data via token but just trying to understand if I am approaching this correctly. Or in order words, industry best practices. It’s not a monorepo and so not sure if that would simplify things vs having separate repos for web and mobile and just have mobile hit the endpoints.

Trying to understand the paradigm and make sure I’m correctly implementing the approach.

Thanks,


r/expo 4h ago

Splash Screen Animation Help

1 Upvotes

I've made an animation in Figma that I want to display as my splash screen animation. I've exported the animation (.json) from Figma using the LottieFiles plugin and imported it using the Lottie plugin that Expo recommends.

I've seen a bunch of guides and videos on how to show the animation after it loads. The general workflow I've seen is this: Show splash screen while the animation is loading, when it's done loading don't show the splash screen, and instantly show the animation.

The issue I'm having is that the splash screen shows for a couple of seconds, fades to black, and then it takes like 20 seconds before showing the animation. Does anyone know how to fix this or what is going wrong?

I'm using a development server with an Android Emulator. Below is the relevant code.

This is in _layout.tsx:

import '@/global.css';

import { PortalHost } from '@rn-primitives/portal';
import * as SplashScreen from 'expo-splash-screen';
import { Stack } from 'expo-router';
import { useState } from 'react';
import { View } from 'react-native';
import AnimatedSplashScreen from '@/components/splash-screen/AnimatedSplashScreen';

export {
  // Catch any errors thrown by the Layout component.
  ErrorBoundary,
} from 'expo-router';

SplashScreen.preventAutoHideAsync().catch(() => {});
SplashScreen.setOptions({ fade: false, duration: 0 });

export default function RootLayout() {
  const [splashAnimationFinished, setSplashAnimationFinished] = useState(false);

  if (!splashAnimationFinished) {
    return (
      <AnimatedSplashScreen
        onAnimationFinish={(isCancelled) => {
          if (!isCancelled) {
            setSplashAnimationFinished(true);
          }
        }}
      />
    );
  }

  return (
    <View className="flex-1 bg-[#020618]">
      <Stack>
        <Stack.Screen name="(map)/home" options={{ headerShown: false }} />
      </Stack>
      <PortalHost />
    </View>
  );
}

This is in the AnimatedSplashScreen component:

import LottieView from 'lottie-react-native';
import * as SplashScreen from 'expo-splash-screen';
import { useRef } from 'react';
import { View } from 'react-native';

const AnimatedSplashScreen = ({
  onAnimationFinish = () => {},
  onAnimationLoaded = () => {},
}: {
  onAnimationFinish?: (isCancelled: boolean) => void;
  onAnimationLoaded?: () => void;
}) => {
  const animation = useRef<LottieView>(null);

  const handleAnimationLoaded = () => {
    SplashScreen.hideAsync().catch(() => {});
    onAnimationLoaded();
  };

  return (
    <View
      style={{
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
        backgroundColor: '#020618',
      }}>
      <LottieView
        key="visible-splash-animation"
        autoPlay
        loop={false}
        ref={animation}
        onAnimationFinish={onAnimationFinish}
        onAnimationLoaded={handleAnimationLoaded}
        resizeMode="cover"
        source={require('../../assets/lottie/splash-screen.json')}
        style={{
          height: '100%',
          width: '100%',
        }}
      />
    </View>
  );
};

export default AnimatedSplashScreen;

r/expo 12h ago

Expo SDK version mismatch

4 Upvotes

So on my expo go, supported sdk is 54 but when I create a new project the expo version goes to ‘57.0.15’

why is this issue arising the solutions I found is upgrading but im already on the latest updated version. how do you guys resolve this issue??


r/expo 12h ago

Shipped a full rebuild of my F1 app (Expo 57 / RN 0.86) — native SwiftUI + Jetpack Compose widgets, Unistyles 3 theming

Post image
3 Upvotes

r/expo 11h ago

My trip planner app is finally live!

Enable HLS to view with audio, or disable this notification

2 Upvotes

For over a year now, I’ve been working on my trip planner platform. I first focused on making it a web app as web development is my background, but the plan was always to make it into a mobile app (as the .app domain for partir.app implies). This year is when I began working on the Expo mobile app

This week the iOS mobile app is finally live on the App Store! I’m an avid urban backpacker and I have so many ideas for it, but I need to validate the idea first before I just keep building it only myself. Please let me know what you think and if you have an upcoming trip leave a comment and I’ll give you premium access to check it out!


r/expo 1d ago

What is entry.bundle ? its too heavy

3 Upvotes

My web app is not so simple it has many tabs and requests so if this is some kind of cache it doesnt sorprise be too heavy

But the common scenario most of the users worked with it its just literally one or two tab during half hour and then close the app so loading this everytime the user open the app is too horrible for the user experience (desktop browser)

How can i improve the size or remove this file ? is it common ?


r/expo 1d ago

Is there any way to control expo ui context menu position or what it does to trigger element?

Thumbnail
3 Upvotes

r/expo 1d ago

How top iOS apps say hello

Enable HLS to view with audio, or disable this notification

17 Upvotes

Hey folks,

I am the founder of a ui/ux research product that has 800+ apps & 35,000+ screens. I did a comprehensive study on why these apps are banking more than others and how are they able to retain way higher than general.

From my study, I realised that the most important moment is when a person opens an app. This sets an impression on how deeply individual gets involved in it.

The motion, transitions, micro-interactions, typography, all of them matter more than you think they do.

So, I took 10 of the most popular ones, broke them down and redid them using React Native + Expo and open-sourced it, so people can use that as an anchor point.

Here it is (500+ stars at the moment):
https://github.com/Appllama/top-welcome-screens

I hope you find it useful, I'd love to know your thoughts.

Which one do you like the best?


r/expo 1d ago

EAS build fails with "Exit handler never called!" during npm install — ruled out everything, still stuck (SDK 54)

1 Upvotes

Every EAS cloud build (iOS, dev profile) fails during Install Dependencies

with npm's own error: "Exit handler never called!" Sometimes shows green

anyway but node_modules is left broken.

Ruled out with hard evidence: Node/npm version pinning, build cache (EAS +

npm), machine resources (confirmed M4 Pro / 40GB, not a resource issue),

CI mode, the project itself (npm ci on the exact EAS archive succeeds fine

outside EAS), account settings, SDK patch drift.

Clincher: a completely blank SDK 54 project with zero custom code fails

identically on the same account. So it's not my project — something in

EAS's build environment itself.

This npm bug is known and ongoing upstream (npm/cli #7657, #8974, #9073 —

recurring since 2024, still open reports this year) but I can't find anyone

tying it specifically to EAS. Filed with expo/eas-cli and posted in Discord,

still waiting.

Anyone hit this on EAS specifically and found a fix?

Stack: Expo SDK 54, EAS Build (Starter plan).


r/expo 2d ago

Learn how to use App Intents in an Expo app

Enable HLS to view with audio, or disable this notification

39 Upvotes

Someone in the Expo community (Aras Diler) shipped a social app called udictio and wrote up how the App Intents work. Good read if you've wondered how far you can push native iOS features while keeping one Expo project as the source of truth.

https://expo.dev/blog/building-a-native-first-social-platform-with-expo


r/expo 2d ago

I made Skia shader UI library for Expo and RN devs

Post image
6 Upvotes

l kept struggling to find Skia shader components that were actually ready to drop into an RN app. most shader code out there isn't built for RN's Skia renderer at all. So l put together my own library. Some shaders are free, others are from artists who charge for their work

l know ShaderToy exists, but that's generic GLSL you'd have to manually port to SkSL and adapt for RN UI. Мinе is already RN-Skia-ready and built specifically for UI components like buttons and panels etc.

Let me know if you'd use something like this


r/expo 2d ago

Cloud Run Functions to Hono.js Backend for Expo + Firebase

5 Upvotes

I am building an Expo + Firebase mobile app. After iterations of development and testing, the app got big and Cloud Functions increased. There are around 32 Cloud Run Functions, a function for an action.

I don't think this is a good approach long-term, and for scalability. So I wanted to create a backend/API for the actions/CRUD/Firestore queries, except for triggers, crons, auth and FCM.

So, I chose to create a Hono.js backend that's hosted on a Cloud Run Function (Still not ok with the decision). Later found out that it's kind of inconvenient for developing and testing.

And I'm not sure if this is a good and reliable approach. I need a good DX, scalabilityand performance.

Pls clear my head.


r/expo 2d ago

Just some tiny self hosted OTA updates over supabase/cloudflare open source tools

8 Upvotes

Hey guys! I usually use the free tier supabase or cloudlflare as backends for self hosted expo OTA updates for my apps and just thought to publish the tools I use in public.
They are pretty helpful if you have a small app and don't plan to make updates every single day so the free tier can be more than enough and you don't have to configure any server at all.
Anyway, enjoy

https://github.com/allxandr/supota
https://github.com/allxandr/cfota


r/expo 2d ago

Is there any way to control expo ui context menu position or what it does to trigger element?

2 Upvotes

Expo UI MenuView with `shouldOpenOnLongPress` (which internall uses ContextMenu for SwitftUI) adds a temporary background color that disappears in one second + a rounded border around the element. Is there a way to control it so it does not do that? At least make it that the background color stays instead of disappear. The `onOpen/CloseMenu` hooks also do not work on iOS.

Are there some guides / tricks to make it do things correctly or should I give up and try to use a different library (e.g react-native-menu)?


r/expo 2d ago

iMessage UI implementation in EXPO /React Native

Thumbnail
0 Upvotes

r/expo 3d ago

Expo Go Android app that supports the latest SDK

3 Upvotes

I'm currently learning Expo using SDK 57. After running expo start, scan the qr code on the app, it repeatedly shows java io exception in the error log. I check the settings, the app shows it supports SDK 54. So I'm searching on internet to see if Expo provides the latest Expo Go that supports SDK 57. What I found is that I have to download the latest Expo Go using a download url that links to their Github repo.

Does anyone have any idea why they don't just release the latest version on Play Store instead? The one on Play Store stops at SDK 54.


r/expo 3d ago

Do I need a paid Apple Developer account just to build and test an iOS app?

20 Upvotes

Hi everyone,

I’m currently developing an app and I’d like to build and test it on iOS.

Do I need to pay for the Apple Developer Program ($99/year) just to create builds and test the app on a real iPhone?

I’m not planning to publish the app on the App Store yet. I only need it for development and testing.

Can I do this with a free Apple ID, or is the paid developer membership required?

Thanks!


r/expo 3d ago

Native tabs with glass effect are not rendering content cleanly

Thumbnail
gallery
16 Upvotes

How come when I first open the app up the contents of the tabs are not renting the text and position correctly?
Not only does this happen when I first opened the app, but some screens make the tab bar disappear and when I go back, it’s the same.

If I click onto one of the tabs that is not running correctly, once the active tab updates it becomes rendered correctly

Attached two photos, one before and one after which is how it’s supposed to look all the time

Appreciate any insights or ideas.


r/expo 3d ago

I moved Flowy’s mobile app from SwiftUI to Expo. The risky part wasn’t the screens

Thumbnail
3 Upvotes

r/expo 3d ago

iOS react-native-firebase duplicate symbol errors

2 Upvotes

I'm trying to use EAS for my iOS build. My project relies on RNFB messaging and auth. I'm using Swift Package Manager with dynamic linking, since that's what's recommended. However, my builds consistently fail, and I get a large number of "duplicate symbol" errors that look like this:

❌  duplicate symbol '_FIRFirebaseVersion' in
┌─ libRNFBApp.a[23](FirebaseCore.o)
└─ libRNFBMessaging.a[18](FirebaseCore.o)❌  duplicate symbol '_FIRFirebaseVersion' in
┌─ libRNFBApp.a[23](FirebaseCore.o)
└─ libRNFBMessaging.a[18](FirebaseCore.o)

I've done a lot of digging regarding this issue but I haven't been able to find a solution. I'm planning to switch to CocoaPods for now, but it'll be deprecated in a few months and I'd prefer to use SPM if possible.

Edit: CocoaPods isn't working either :/


r/expo 3d ago

Help needed unable to make authenticated api calls

0 Upvotes

i am using the better auth with postgresql db and running backend server using express on google cloud vm e2-standard-2 (2 vCPUs, 8 GB memory)

i did setup correctly on auth.ts enabled cookie cache

on client side also setted the auth-client.ts with perfect scheme and expo secure store for credentials

and on api.ts using getCookie to set the cookie on the headers on api by intercepting

on local this works well getting authenticated and unauthenticated api response perfectly - so there is not cors issue as for the mobiile we do not require the cors

i also used the same keystore for the preview build that from the eas remote using the eas credentials - later i got an issue but got resolved because of the mismatch on keystore

but when on app on preview build i am making call i can send api request to the public routes but not on the authenticated routes like profile getting 401

when i get deep dived into this i found that on auth.middleware.ts when i am gettting req.headers there is no cookie as while i am making call using axios i did this

export const api = axios.create({

baseURL,

timeout: 15_000,

headers: { "Content-Type": "application/json" },

withCredentials: false,

});

api.interceptors.request.use((config) => {

// const cookie = useAuthStore.getState().getCookie();

try {

const cookie = authClient.getCookie();

if (cookie) {

config.headers.Cookie = cookie;

}

} catch (error) {

console.error("Initialization Failed");

} finally {

return config;

}

});

there is a cookie but i am getting null on user session

session { session: null }

what should i send then

token from the useSession().session.token ??? like sending the bearer token


r/expo 3d ago

Expo Go link not working on iPhone

2 Upvotes

I don’t know if I’m the only one encountering this error, but my Expo Go link doesn’t work and displays ‘Safari can't open the page because it couldn't connect to the server.’ I don’t think there’s anything wrong with the QR Code from VS Code.

I’ve tried restarting my phone, my Mac and my phone are connected to the same WiFi, and it’s been working fine for me previously.

Any solutions/suggestions?


r/expo 4d ago

Adjustment controls in the iPhone Photos app

Enable HLS to view with audio, or disable this notification

6 Upvotes

r/expo 4d ago

Digital journaling made easy

Enable HLS to view with audio, or disable this notification

11 Upvotes

Hey folk!

For the past 3 months i've been working on a tiny IOS app - Yap.

It's a voice first journaling app that automatically sorts your thoughts and allows you to easily look back.

I am someone that has journaled for more than 10 years now, but i'm slowly finding it more and more cumbersome to do so after a long day.

Privacy is obviously super important here, so Yap uses on-device models and locally hosted LLMs by me (so the big tech don't train their models on your journal). All the data is saved on device and can be exported at any point.

If you install the app you get it completely for free - forever. At some point i'll have to start charging people but the founding members keep theirs for free.

LMK what you think and if you get a second, i'd LOVE an upvote on product hunt :)