Skip to main content

Why Yoopta?

I’ve integrated rich-text editors into products more times than I’d like to admit. Every time it was the same story: wrestling with complex APIs, fighting against opinionated UI that doesn’t fit your product, hacking around limitations. Yoopta was built to end that cycle. The idea is simple: give developers a headless core when they need full control, but also ship 20+ ready-made plugins, pre-built UI components (toolbars, slash menus, block actions), and theme presets (shadcn, Material) — so you can launch a polished editing experience without building everything from scratch. Whether you’re building a simple blog editor, a Notion-like workspace, a CMS for landing pages, or even a full website builder — Yoopta gives you the primitives to get there. If Yoopta saves you time, consider starring the repo or sponsoring the project. It keeps the project alive.

How it works

Yoopta Editor is headless — the core package (@yoopta/editor) handles all content logic (blocks, elements, operations, history) but renders no UI. You get full control over appearance. Don’t want to build everything yourself? Yoopta also ships:
  • Themes (@yoopta/themes-shadcn) — pre-styled components you can apply in one line with applyTheme()
  • UI components (@yoopta/ui) — toolbar, slash command menu, block actions, and more
  • 20+ plugins — paragraph, headings, lists, tables, images, code, embeds, and more
Each block in the editor runs its own Slate.js instance, which means blocks are isolated, performant, and independently extensible.

Examples & Demos

See what you can build with Yoopta: All examples with source code are available in the examples directory.

Quick Example

import { useMemo } from 'react';
import YooptaEditor, { createYooptaEditor } from '@yoopta/editor';
import Paragraph from '@yoopta/paragraph';
import { Bold, Italic } from '@yoopta/marks';
import { applyTheme } from '@yoopta/themes-shadcn';

const plugins = applyTheme([Paragraph]);
const marks = [Bold, Italic];

export default function Editor() {
  const editor = useMemo(() => createYooptaEditor({ plugins, marks }), []);

  return (
    <YooptaEditor
      editor={editor}
      onChange={(value) => console.log(value)}
      placeholder="Type something..."
    />
  );
}

Packages

Install only what you need:
CategoryPackagesDescription
Core@yoopta/editorHeadless editor engine (requires slate, slate-react, slate-dom)
UI@yoopta/uiToolbar, ActionMenuList, SlashCommandMenu, BlockOptions, FloatingBlockActions
Marks@yoopta/marksBold, Italic, Underline, Strike, Code, Highlight
Text@yoopta/paragraph, @yoopta/headings, @yoopta/blockquoteBasic text blocks
Lists@yoopta/listsBulleted, numbered, and todo lists
Media@yoopta/image, @yoopta/video, @yoopta/file, @yoopta/embedMedia and embed blocks
Layout@yoopta/table, @yoopta/accordion, @yoopta/tabs, @yoopta/steps, @yoopta/carousel, @yoopta/callout, @yoopta/dividerStructured layout blocks
Inline@yoopta/link, @yoopta/mention, @yoopta/emojiInline elements
Code@yoopta/codeCode block with syntax highlighting
Themes@yoopta/themes-shadcn, @yoopta/themes-materialPre-styled plugin components
Exports@yoopta/exportsHTML, Markdown, plain text, email serializers
Collaboration@yoopta/collaborationReal-time collaboration via Yjs

Key Features

Headless Architecture

Full control over UI. Use your own components, apply a theme, or mix both.

Plugin System

20+ built-in plugins. Create custom ones or extend existing plugins with .extend().

Nested Content

Inject plugins inside other plugins — lists inside callouts, code inside tabs, and more.

Drag & Drop

Reorder blocks, nest content, and drag elements with built-in DnD support.

Export Anywhere

Serialize to HTML, Markdown, plain text, or email-safe HTML out of the box.

Beyond Editing

Build CMS dashboards, landing page builders, or full website builders — Yoopta provides the content primitives, you define the experience.

TypeScript First

Full type safety across the editor, plugins, and all APIs.

Next Steps

Community & Support

If Yoopta Editor is useful to you, please give it a star on GitHub!