Feature Requests

With Expo, you can write iOS and Android experiences in JavaScript using React Native.
[expo-audio] Expose `OGG` output format and `OPUS` audio encoder on Android (API 29+)
expo-audio 's AndroidOutputFormat and AndroidAudioEncoder unions are a strict subset of what the underlying MediaRecorder supports. MediaRecorder.OutputFormat.OGG and MediaRecorder.AudioEncoder.OPUS have been available since API 29 (Android 10, 2019) but are not reachable from JS, even though the rest of the recording pipeline is a straight passthrough to MediaRecorder . Adding them is a ~20 line change: two enum entries plus API 29 guards in AudioRecords.kt , and two entries in Audio.types.ts . Two concrete wins that the current M4A/AAC-only path can't deliver: Crash-safe recordings. M4A is an MP4 container — it requires the muxer to finalise the moov atom on stop() . If the app is killed mid-recording the file is unplayable. OGG is a chunked, self-describing container: every page is independently valid and carries its own CRC. A killed recording remains playable up to the last complete page. This is the main reason we reach for OGG on Android. Opus is dramatically more efficient for voice than AAC. 32 kbps mono Opus is effectively transparent for speech. A 20-minute recording is ~5 MB at the settings we use, versus ~19 MB for the AAC default — useful for memory, storage, and upload cost. Opus also has lower latency and is the default voice codec for every modern browser/WebRTC stack. Both use cases are reachable today if you drop down to writing a native module, but that's a lot of plumbing for two enum entries.
0
Allow `eas upload` and `eas build --local` to tag builds with a build profile
Today, any build that ends up on EAS via a local path is forced to: distribution = Internal profile / runtime / channel = None a "Local" chip on the dashboard This happens because packages/eas-cli/src/commands/upload.ts hardcodes distribution: DistributionType.Internal in createLocalBuildAsync , and neither eas upload nor eas build --local accepts --profile , --channel , --distribution , or --runtime-version flags. Use case: I build my production iOS binary locally (to keep signing under my control, to avoid EAS build minutes, or to iterate faster) and then submit it to App Store Connect with eas submit . I would like the resulting row on expo.dev to accurately reflect that this was a "production" profile build, with the correct channel and runtime, so that: The dashboard gives a truthful audit trail of what went to the store. EAS Update channel resolution works correctly against the build. Teammates can tell production binaries apart from dev or preview builds at a glance. Proposed solution: Add the following flags to eas upload (and surface the same metadata on eas build --local ): --profile <name> Build profile from eas.json to tag the upload with --distribution <type> internal | store --channel <name> EAS Update channel --runtime-version <value> Runtime version (or read it from the binary when possible) Internally, this means: Accepting these flags in the oclif command spec. Resolving the profile via EasJsonAccessor the same way eas build does. Passing the resolved values into LocalBuildMutation.createLocalBuildAsync instead of the current hardcoded DistributionType.Internal . Workarounds today: eas build --local --auto-submit submits the binary to App Store Connect correctly, but the EAS dashboard row is still stamped as "Local / Internal / None / None". eas submit --path ./build.ipa --profile production only tags the submission, not the build row. Neither workaround gives a correct production row on the builds page.
0
Load More