Type-safe rich text editor for React developers
Built on Meta's Lexical. Headless, extensible, and production-ready.
π Demo β’ π Documentation β’ β‘ Playground
Rich text editors shouldn't be a nightmare. LexKit makes building them delightful:
- π Type-safe everything - Commands and states inferred from your extensions. No runtime surprises.
- π¨ Headless & flexible - Build any UI you want. Style it your way.
- π§© Modular extensions - Add only what you need, when you need it.
- β‘ Production features - HTML/Markdown export, image handling, tables, undo/redo.
- βοΈ React-first - Hooks, components, and patterns you already know.
// Your extensions define your API - TypeScript knows everything β¨ const extensions = [boldExtension, listExtension, imageExtension] as const; const { Provider, useEditor } = createEditorSystem<typeof extensions>(); function MyEditor() { const { commands, activeStates } = useEditor(); // TypeScript autocompletes and validates these commands.toggleBold(); // β
Available commands.toggleUnorderedList(); // β
Available commands.insertImage(); // β
Available commands.nonExistent(); // β TypeScript error }npm install @lexkit/editorInstall the Lexical peer dependencies:
npm install lexical @lexical/react @lexical/html @lexical/markdown @lexical/list @lexical/rich-text @lexical/selection @lexical/utilsimport { createEditorSystem, boldExtension, italicExtension, listExtension, RichText, } from "@lexkit/editor"; const extensions = [boldExtension, italicExtension, listExtension] as const; const { Provider, useEditor } = createEditorSystem<typeof extensions>(); function Toolbar() { const { commands, activeStates } = useEditor(); return ( <div className="toolbar"> <button onClick={() => commands.toggleBold()} className={activeStates.bold ? "active" : ""} > Bold </button> <button onClick={() => commands.toggleItalic()} className={activeStates.italic ? "active" : ""} > Italic </button> <button onClick={() => commands.toggleUnorderedList()}> Bullet List </button> </div> ); } function Editor() { return ( <div className="editor-container"> <Toolbar /> <RichText placeholder="Start writing..." /> </div> ); } export default function App() { return ( <Provider extensions={extensions}> <Editor /> </Provider> ); }That's it. You now have a fully functional, type-safe rich text editor.
- Text Formatting: Bold, italic, underline, strikethrough, inline code
- Structure: Headings, lists (with nesting), quotes, horizontal rules
- Rich Content: Tables, images (upload/paste/alignment), links, code blocks
- Advanced: History (undo/redo), command palette, floating toolbar, context menus
- Toggle lists with intelligent nesting behavior
- Context-aware toolbar (indent/outdent appear when needed)
- Nested lists without keyboard shortcuts
- Clean UX that matches modern editors
- HTML with semantic markup
- Markdown with GitHub Flavored syntax
- JSON for structured data
- Custom transformers for specialized formats
- CSS classes or Tailwind utilities
- Custom themes for consistent styling
- Dark mode support
- Accessible by default
LexKit powers editors in:
- Content management systems
- Documentation platforms
- Blog editors
- Note-taking applications
- Comment systems
- Collaborative writing tools
- π¬ Discord - Get help, share ideas
- π GitHub Issues - Bug reports, feature requests
- π Discussions - Questions, showcase your projects
We welcome contributions! Whether you:
- Find and report bugs
- Suggest new features
- Contribute code or documentation
- Share projects built with LexKit
- Star the repo to show support
Check our Contributing Guide to get started.
A huge thank you to my golden sponsor:
Your support helps keep this project alive and growing! π
LexKit is free and open source, built by developers for developers. If it's helping you build better editors, consider supporting its development:
- β Star this repository to show your support
- π Sponsor the project to help with maintenance and new features
- π’ Share LexKit with other developers
Your support keeps this project alive and helps us build better tools for the React community.
Built with β€οΈ by novincode
MIT License - Use it however you want.

