Can You Build a Custom Keyboard App in React Native? (Yes — Here's How)
Can you actually build a production system keyboard — an Android IME, an iOS Custom Keyboard Extension — entirely in React Native? Not a demo, not a toy, but something you'd ship to real users on both platforms from one codebase?
Yes. This is the proof, and the library that makes it repeatable.
Every mobile app that wants a custom system keyboard has run into the same wall: Android IMEs and iOS Custom Keyboard Extensions are native surfaces. Building one has always meant writing (and maintaining) two separate native UIs in Kotlin and Swift — even if your app is otherwise 100% React Native. Most teams either give up on the idea or pay for a fully native rewrite of a single screen.
react-native-keyboard-bridge removes that wall. You write one component — plain View,
Text, TouchableOpacity, useState — and it runs live on both platforms, as a real, live React
Native surface hosted inside the IME process on Android and the Custom Keyboard Extension process
on iOS. Not a schema. Not a subset. Real React Native, running where conventional wisdom said it
couldn't.
What "runs live" actually means
This isn't a schema you configure, and it isn't a compiled subset of JSX rendered by a hand-written interpreter. It's Hermes + JSI + Fabric — the exact same New Architecture stack any other React Native screen in your app uses — hosted inside a process that most people assumed couldn't afford it.
import { useState } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { commitText, deleteSurroundingText } from 'react-native-keyboard-bridge';
export default function KeyboardApp() {
const [shifted, setShifted] = useState(false);
return (
<View style={styles.row}>
{['q', 'w', 'e', 'r', 't', 'y'].map((key) => (
<TouchableOpacity key={key} onPress={() => commitText(shifted ? key.toUpperCase() : key)}>
<Text style={styles.key}>{shifted ? key.toUpperCase() : key}</Text>
</TouchableOpacity>
))}
<TouchableOpacity onPress={() => deleteSurroundingText(1, 0)}>
<Text style={styles.key}>⌫</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
row: { flexDirection: 'row', justifyContent: 'space-around' },
key: { fontSize: 18, padding: 8 },
});
That's the entire keyboard. No KeyLayout schema to learn, no proprietary DSL, no
platform-specific branch in your component. commitText takes a plain Unicode string, so this
works identically whether you're typing English, Bangla, Arabic, or any other script.
One install
yarn add react-native-keyboard-bridge
The JS bridge, the Android native module (autolinked), the iOS native module, gesture/ swipe-typing helpers, word prediction, and the iOS setup CLI all ship in this single package. See the Installation guide to get a keyboard running in your app today, or read Building Your First Keyboard for a full walkthrough.
Frequently asked questions
Can you build a custom keyboard app with React Native?
Yes. react-native-keyboard-bridge hosts a real, live React Native runtime — Hermes, JSI, and
Fabric — directly inside the Android IME process and the iOS Custom Keyboard Extension process.
Your keyboard component runs unmodified, the same way any other React Native screen does.
Is it a real Android IME and a real iOS Custom Keyboard Extension, or just a demo?
Both are real, installable system keyboards. On Android, CustomKeyboardService extends
InputMethodService directly. On iOS, KeyboardViewController extends UIInputViewController
inside a genuine Xcode App Extension target. Once installed and enabled, either one appears in the
OS keyboard list exactly like any native keyboard app.
Do I need to write any native Kotlin or Swift code?
No. The native side (Kotlin on Android, Swift on iOS) is entirely provided by the library — it only wires up the runtime and a text-editing bridge. Your own code is 100% React Native/TypeScript.
Does it support languages other than English?
Yes — commitText takes a plain Unicode string with no script whitelist, so Bangla, Arabic,
Devanagari, CJK, Cyrillic, and right-to-left layouts all work identically to English. See
How to Support Multiple Languages in a React Native Keyboard.
What React Native version does it require?
React Native 0.74 or later (New Architecture / Fabric), since the library depends on ReactHost
on Android and RCTReactNativeFactory on iOS — both New Architecture APIs.
Try it yourself
- 📦 Install:
yarn add react-native-keyboard-bridge - 📖 Full docs & step-by-step tutorial: developerrejaul.github.io/react-native-keyboard-bridge
- ⭐ Source & issues: github.com/DeveloperRejaul/react-native-keyboard-bridge
- 📦 Package: npmjs.com/package/react-native-keyboard-bridge
If you've ever been told "you can't build a real keyboard in React Native," this library — and the working example app in the repo — is the counter-argument.
