React Native · Expo
A React Native video editor, in your app and your brand
One JavaScript codebase, a complete video editor on iOS and Android: preview, timeline, text, captions, effects, music and MP4 export. Two components, Expo included through a config plugin, built on the New Architecture.
What your users get
iOS and Android from one codebase
The same components, the same projects and the same exports on both.
Captions in one call
Pass your speech-to-text lines to
insertCaptions; with word timings, karaoke follows the speech.Touch editing
Move, resize and rotate layers in the preview; the timeline scrolls under a centred playhead.
Effects and transitions
Looks, adjustments, effects, speed, masks and transitions, with keyframes and easing.
Text and music
Styled, animated titles and audio tracks with volume and voice effects.
Undo and saved projects
Undo and redo built in; projects save as JSON and reopen anywhere.
Try every tool in the live demo.
Install in one line
npm install @nitrakit/react-native react-native-nitro-modules
@nitrakit/react-native includes the iOS SDK; on Android, Gradle gets the SDK from Maven Central with no setup.
- iOS: run
pod install. If users pick from their photo library, addNSPhotoLibraryUsageDescriptionto yourInfo.plist. - Android: raise
minSdkVersionto 26 if it's lower.
Add it to an Expo app
In Expo, add the config plugin to app.json instead; it sets the Android version for you. Then run npx expo prebuild.
{ "expo": { "plugins": ["@nitrakit/react-native"] } }Use a development build: Expo Go can't load the SDK's native code.
Two components: preview and editor
NitrakitPreview plays the project and lets the user move and resize layers; NitrakitEditor has the timeline, tools and panels. Give both the same editor:
import { NitrakitEditor, NitrakitPreview } from '@nitrakit/react-native'
export function EditorScreen({ editor }: { editor: Editor }) {
return (
<View style={{ flex: 1, backgroundColor: '#000' }}>
<NitrakitPreview editor={editor} style={{ flex: 1 }} />
<NitrakitEditor editor={editor} style={{ height: 400 }} onRequest={onRequest} />
</View>
)
}Give NitrakitEditor a fixed height (300–400 works well) and let the preview take the rest. Create the editor once per project, for example in a useMemo or your state store, with createEditor(1080, 1920, 30).
Your pickers, your storage
The editor never opens the photo library itself. When the user adds media, onRequest asks your app; return the answer or a promise of it, null if the user backed out, or nothing to use the built-in picker for fonts, colours, text, text styles and filters. importFile turns what a picker gives you (content://, file://) into a path the SDK can read.
Projects refer to media only by your ids. When a project opens on a device that doesn't have its files, your resolver says where they live:
import { setMediaResolver } from '@nitrakit/react-native'
setMediaResolver(async (id) => (await api.signedUrl(id)).url) // or a local pathSee Your pickers and Projects and media.
Export an MP4
Export renders an MP4 (H.264 video, AAC audio) in the background while the user keeps editing:
import { filesDir } from '@nitrakit/react-native'
const path = `${filesDir()}/export-${Date.now()}.mp4`
try {
await editor.exportVideo(path, editor.exportSettings(1080), (f) => setProgress(f))
// the file at `path` is ready to save, share or upload
} catch (e) {
// failed, or cancelled with editor.cancelExport()
}Make it look like your app
Requirements
| React Native | The New Architecture (the default since 0.76) and react-native-nitro-modules |
|---|---|
| iOS | 16 or later |
| Android | 8.0 or later (minSdkVersion 26) |
| Expo | A development build, with the config plugin |
Library, SDK or build it yourself?
React Native is good at the UI around video: pickers, buttons, a player. Decoding, compositing, effects and encoding need native code on each platform, and an editor needs a timeline, a preview that matches the export, text, undo and saved projects on top. Nitrakit is that whole layer as two components. For the full walkthrough, from install to Expo to export, read Add a video editor to your React Native app.
FAQ
- Does it work in Expo Go?
- No. Expo Go can't load the SDK's native code; use a development build with the config plugin.
- Does it work on the old architecture?
- No. It needs the New Architecture (the default since React Native 0.76) and
react-native-nitro-modules. - Which platforms does it run on?
- iOS 16+ and Android 8.0+ from one codebase. For native apps there are iOS and Android SDKs, and for React on the web, the React video editor.
- Can it make captions?
- Yes.
insertCaptionsturns your speech-to-text lines into captions, word-timed if you have the timings. See Text and captions. - Can I try it without a license key?
- Yes. Everything works without one; exports are watermarked and up to 15 seconds. You need a key when you release. See pricing.
- How much does it add to my app?
- The iOS and Android SDK sizes, plus less than 0.5 MB for the bridge and JavaScript. See App size.