How to Add a Native Rich Text Editor in Expo / React Native (No WebView)
Rich text editing in React Native has always been tricky — especially when you want native performance instead of relying on WebViews. Most available libraries work great for the web, but fall short on mobile.
That’s where [expo-rte](https://github.com/mdadul/expo-rte) comes in.
It’s a pure native rich text editor for Expo and React Native, built using expo-modules, Kotlin, and Swift. No WebView. Fully cross-platform.
In this guide, you’ll learn how to install, set up, and customize expo-rte in your app.
Why expo-rte?
- Pure native UI — smooth scrolling, native gestures, no WebView overhead.
- Cross-platform — works on both iOS and Android.
- Feature-rich — bold, italic, underline, strikethrough, bullet lists, numbered lists, undo/redo, and more.
- Customizable — configure toolbar layout, button density, and styles.
This guide will walk you through installing and using it in your Expo or React Native project.

Install expo-rte
Run:
npm install expo-rte
# or
yarn add expo-rte
Since it’s a native module, you’ll need to run a development build (Expo Go won’t work):
npx expo run:ios
npx expo run:android
Add the Editor to Your App
Create a simple editor screen:
import React, { useRef } from 'react';
import { View } from 'react-native';
import { RichTextEditor, RichTextEditorRef } from 'expo-rte';
export default function App() {
const editorRef = useRef(null);
const handleChange = ({ nativeEvent }) => {
console.log('Content:', nativeEvent.content);
};
return (
);
}
Customize the Toolbar
expo-rte lets you control which formatting options appear.
import { ToolbarConfig } from 'expo-rte';
const toolbarConfig: ToolbarConfig = {
adaptive: true,
density: 'comfortable',
scrollable: true,
groupButtons: true,
buttons: [
{ type: 'bold', icon: 'B', label: 'Bold', group: 'format' },
{ type: 'italic', icon: 'I', label: 'Italic', group: 'format' },
{ type: 'underline', icon: 'U', label: 'Underline', group: 'format' },
{ type: 'bullet', icon: '•', label: 'Bullet List', group: 'list' },
{ type: 'numbered', icon: '1.', label: 'Numbered List', group: 'list' },
{ type: 'undo', icon: '↶', label: 'Undo', group: 'action' },
{ type: 'redo', icon: '↷', label: 'Redo', group: 'action' },
],
};
Pass it into your editor:
Control the Editor Programmatically
With a ref, you can:
editorRef.current?.setContent('
New content
');const html = await editorRef.current?.getContent();
editorRef.current?.undo();
editorRef.current?.redo();
Troubleshooting
- Editor not showing? Make sure you’re using a development build.
- Buttons not working? Check your
toolbarConfig. - Performance issues? Enable
adaptive: truein the toolbar config.
Conclusion: With expo-rte, you can add a native rich text editor to your Expo/React Native app—no WebView required. It’s fast, customizable, and works across iOS and Android.
📌 Full docs & source code: github.com/mdadul/expo-rte
> Written by
Emdadul Islam
Software Engineer. View profile →
Read more
How to Implement Multi-Factor Authentication (MFA) with TOTP in Your Web Application
In today’s digital landscape, securing user accounts with just a password isn’t enough. Multi-Factor Authentication (MFA) adds an essential layer of security by requiring users to provide two or more verification factors. In this comprehensive guide,...
Host Your Own S3-Compatible MinIO Server on a VPS with Caddy and HTTPS
Host Your Own S3-Compatible MinIO Server on a VPS with Caddy and HTTPS Want to self-host object storage like AWS S3 but on your own VPS? Say hello to MinIO — a blazing-fast, S3-compatible storage solution. In this guide, we’ll show you how to install...
How to Add TanStack Query in Astro + React Project
Photo by Lautaro Andreani on Unsplash TanStack Query (formerly known as React Query) is a powerful tool for data fetching, caching, and synchronization in React applications. It simplifies handling server-side state in a predictable and efficient man...