Honest Comparison

Mina vs Lexical

An extensible text editor framework by Meta

01Quick Stats

Mina

StarsNew
Bundle~45KB
LicenseMIT
ActivityActive
FrameworkReact

Lexical

Stars23.1k
Bundle22KB core
LicenseMIT
ActivityActive
FrameworkFramework-agnostic
02Feature Comparison
Feature
Mina
Lexical
Pre-built UI
Full UI included
Headless (BYO everything)
Setup time
Minutes
Hours to days
Block-based editing
Out of the box
Build from scratch
Slash commands
Built-in
Build from scratch
AI integration
Built-in, any provider
Not included
Real-time collaboration
Built-in (Y.js)
Build from scratch
Learning curve
Gentle
Steep
Core size
~45KB
22KB
Backing
Independent
Meta (Facebook)
Accessibility
Good
Excellent
Framework support
React only
Any framework
Community
New
23.1k stars
03Strengths

Where each editor shines

An honest look at what each editor does best.

Mina wins

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

Lexical wins

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

04Code Comparison
Mina — 9 lines
import { Editor } from "@/components/ui/rich-editor"

function App() {
  return (
    <Editor
      initialContent={content}
      onChange={({ json, html }) => save(json)}
    />
  )
}
Lexical — 26 lines
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>
  )
}
05The Verdict

Choose Mina if...

  • You want a working editor immediately, not a framework
  • You need block-based editing without building it yourself
  • You prefer batteries-included over assembling pieces
  • You're a React developer who wants minimal setup

Choose Lexical if...

  • You need the absolute smallest core bundle
  • You want Meta-backed long-term stability
  • You need framework-agnostic support
  • You're building a deeply custom editing experience from scratch

Ready to build?

Try Mina Rich Editor — 3 lines of code, zero ProseMirror.

Installation coming soon

MIT License · 2025–2026 Mina Massoud