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, add NSPhotoLibraryUsageDescription to your Info.plist.
  • Android: raise minSdkVersion to 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.

app.json
{ "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:

EditorScreen.tsx
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:

App.tsx
import { setMediaResolver } from '@nitrakit/react-native'

setMediaResolver(async (id) => (await api.signedUrl(id)).url)   // or a local path

See 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:

export.ts
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

  • Theme: colours, font and bar sizes, switchable at runtime for dark and light.
  • Tools: hide what you don't offer with hiddenMenuItems, add your own.
  • Wording: your app's words, in your users' languages.

Requirements

React NativeThe New Architecture (the default since 0.76) and react-native-nitro-modules
iOS16 or later
Android8.0 or later (minSdkVersion 26)
ExpoA 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. insertCaptions turns 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.