Skip to content

Conversation

@pull
Copy link

@pull pull bot commented Jan 14, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

chrfalch and others added 12 commits January 14, 2026 12:14
…ckground recording (#42134)

# Why

We had some reports from our QA that audio recording in the background
was not possible. After testing it seemed that `shouldPlayInBackground`
had to be set together with `allowsBackgroundRecording` for this to
work.

# How

This commit fixes so that only `allowsBackgroundRecording` is required
for background recording on Android - `shouldPlayInBackground` is for
audio playback only.

# Test Plan

✅ Bare Expo on Android (iOS is not touched) now works correctly.

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).

---------

Co-authored-by: Expo Bot <[email protected]>
# Why

- Updates BottomSheet to match SwiftUI
[sheet](https://developer.apple.com/documentation/swiftui/view/sheet(ispresented:ondismiss:content:))
- Added support for `height` detents via `presentationDetents` modifier
- Simplify BottomSheet native code by moving the complexity to
individual modifiers.

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

- Removed props from BottomSheet in favour of modifiers.
- Updated BottomSheet docs and improved example
- Added `fitToContents` prop for content fitting BottomSheet, the prop
name is kept similar to react native screen's formSheet.

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Tested docs and example locally.


https://github.com/user-attachments/assets/06a14e36-3e82-49d5-97e9-a5297b1ab7f1


<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

---------

Co-authored-by: Aman Mittal <[email protected]>
…ose warning (#41971)

# Why

Resolves #41968 / #41304

On Firefox specifically, a `WebSocket` fires a `close` event when the
page refreshes. This happens just before `pagehide` /
`visibilitychange`, as a tab becomes unavailable. This then shows our
HMR-close warning, telling users that the WebSocket disconnected, which
persists beyond the reload since the new tab is already available and
the console is partially persisted.

# How

The `pagehide` and `visibilitychange` events fire after the `close`
event, and using those with some kind of timing/buffer trick would be
too complex for this case. There's nothing on the event tells us that
it's the current tab that's closing. We can't check for `wasClean` /
code 1001 since that could be the server shutting down properly.

The cleanest solution seems to be to just add a timeout that is long
enough to never fire since the tab is already closing. It doesn't seem
like there's an obvious event/timer that never fires, instead, the
timeout has to just be long enough.

Sorry.

# Test Plan

- Open SDK 54 web app in Firefox and reload; check that the HMR
disconnection warning doesn't show with this patch applied

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Create a base package for expo-widgets stack PRs.

# How

Create new package

# Test Plan

Nothing to test yet.
# Why

This PR improves the accessibility of Maestro test artifacts by renaming
the hidden `.maestro` folder to `maestroArtifacts` before uploading it
as an artifact. This makes the test results easier to access when
downloaded locally.

# How

- Added a new step "📦 Prepare testing artifacts" to both iOS and Android
test workflows
- Modified the artifact upload paths to use the renamed folder
- Removed the `include-hidden-files: true` flag since it's no longer
needed

# Test Plan

- download the artifacts, maestro artifacts are not in a hidden folder

# Checklist

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…ding screen (#42155)

# Why

In #42134 I removed the button "Stay active in the background", this is
not necessary, it can still be used in the recording screen since it
contains a player as well as a recorder.

# Test Plan

✅ Bare Expo

# Checklist

- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
# Why

SwiftUI supports nested like Text syntax via `Text("Hello
\(Text("World"))")` text concatenation. We want to support it with Expo
UI.
<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

We pass the nested `Text` components as react children and concat on
native recursively. The concatenation is only supported if the modifier
returns a Text, so i added `applyTextModifier` function to modifier
registry that is used by `Text` on concatenation.

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Added example and docs.


<img width="400" height="auto" alt="Screenshot 2025-12-17 at 9 10 31 PM"
src="https://github.com/user-attachments/assets/ac2632d8-21e2-49f5-a0ba-715ba8152c87"
/>

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

---------

Co-authored-by: Aman Mittal <[email protected]>
Co-authored-by: Kudo Chien <[email protected]>
…ield` CLI (#42152)

# Why

This was missing a non-build entrypoint file. That means the shebang was
missing from the `bin` entrypoint and that yarn was modifying the
execution rights of `build`, which would be lost when `build` is cleared
and wasn't present on `main` either.

# How

- Add `bin/cli.js` entrypoint (chmod `+x`)
- Switch `bin` to `bin/cli.js`

# Test Plan

- n/a

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…rvice advertisement to `expo start` (#42138)

# Why

Resolves DVT-79

We'd like to replace port scanning (and eventually probably the
`DevelopmentSession`) when running `expo start`. This would allow dev
clients and Expo Go to search for apps without the need to either make
requests to the API (keeping track of `DevelopmentSession`s) and without
scanning ports.

# How

The advertising is activated by `EXPO_UNSTABLE_BONJOUR`, so we can get
it into a canary release. Once we're confident it's working and
corresponding client functionality is present we can make it the
default.

Supporting DNS-SD is a bit tricky and while there's several solutions we
can consider, the requirements are lengthy:
- `expo start` is a long-running process, therefore the DNS-SD
advertiser...
  - must behave well and not cause excessive traffic
  - must react to updating/changing network interfaces and addresses
  - must avoid conflicts as per the specification
  - must be fault-tolerant
- running on all kinds of networks, it must...
  - respond differently to different NICs to avoid address spill
- support responding on `lo0`, when offline, and on all non-local
networks otherwise
  - resolve conflicts with human-readable names preferably
- running on macOS, it must avoid conflicts with `mDNSResponder`
- running on Windows, it must support its differences in setting up a
UDP6 socket
- it must be maintainable, tested, and not pose a supply chain risk

These requirements are captured in `dnssd-advertise` with corresponding
tests.

# Test Plan

- `EXPO_UNSTABLE_BONJOUR=1 expo start`, e.g. in `apps/router-e2e`
- Then: `dns-sd -B _expo._tcp.`
- Then: `dns-sd -L "Router E2E" _expo._tcp`

**Manual Checks:**
- [x] Tested manually on macOS
- [x] Tested manually on Linux
- [x] Tested manually on Windows

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
@pull pull bot locked and limited conversation to collaborators Jan 14, 2026
@pull pull bot added the ⤵️ pull label Jan 14, 2026
@pull pull bot merged commit 9cb8329 into code:main Jan 14, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants