An honest look at what each editor does best.
Pre-built UI — toolbar, menus, and blocks included
Working editor in minutes, not hours or days
Block-based editing out of the box
Slash commands and markdown shortcuts included
Built-in AI generation — provider-agnostic, works with any LLM
Built-in Y.js real-time collaboration
Much gentler learning curve for React developers
Smallest core bundle at just 22KB
Backed by Meta with excellent engineering resources
Best-in-class accessibility support
Framework-agnostic — works everywhere
Massive community with 23.1k stars
import { Editor } from "@/components/ui/rich-editor"
function App() {
return (
<Editor
initialContent={content}
onChange={({ json, html }) => save(json)}
/>
)
}import { LexicalComposer } from '@lexical/react/LexicalComposer'
import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'
import { ContentEditable } from '@lexical/react/LexicalContentEditable'
import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'
import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'
import LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary'
import { HeadingNode, QuoteNode } from '@lexical/rich-text'
import { ListNode, ListItemNode } from '@lexical/list'
const config = {
namespace: 'MyEditor',
nodes: [HeadingNode, QuoteNode, ListNode, ListItemNode],
onError: (error) => console.error(error),
}
function App() {
return (
<LexicalComposer initialConfig={config}>
<RichTextPlugin
contentEditable={<ContentEditable />}
ErrorBoundary={LexicalErrorBoundary}
/>
<HistoryPlugin />
<OnChangePlugin onChange={save} />
</LexicalComposer>
)
}Try Mina Rich Editor — 3 lines of code, zero ProseMirror.
MIT License · 2025–2026 Mina Massoud