# Introduction Introduction to BlockNote [#introduction-to-blocknote]
BlockNote is a block-based rich-text editor for [React](https://reactjs.org/), focused on providing a great out-of-the-box experience with minimal setup. With BlockNote, we want to make it easy for developers to add a next-generation text editing experience to their app, with a UX that's on-par with industry leaders like Notion, Google Docs or Coda. Unlike other rich-text editor libraries, BlockNote organizes documents into blocks. This makes it easy for the user to organize their document, and for developers to interact with the document from code. BlockNote has been created with extensibility in mind. You can customize the document, create custom block types and customize UX elements like menu items. Advanced users can even create their own UI from scratch and use BlockNote with vanilla JavaScript instead of React. * Jump right into the [quickstart](/docs/getting-started) to get started * Learn about [blocks and the editor basics](/docs/foundations/document-structure) and how to interact with the editor using the [editor API](/docs/reference/editor/manipulating-content) * See [UI Components](/docs/react/components) to customize built-in menus and toolbars and [Styling & Theming](/docs/react/styling-theming) to customize the look and feel of the editor * Further extend the editor with your own Blocks using [Custom Schemas](/docs/features/custom-schemas) or add [Real-Time Collaboration](/docs/features/collaboration) Why BlockNote? [#why-blocknote] There are plenty of libraries out there for creating rich-text editors. In fact, BlockNote is built on top of the widely used [ProseMirror](https://prosemirror.net/) and [TipTap](https://tiptap.dev/). As powerful as they are, these libraries often have quite a steep learning-curve and require you to customize every single detail of your editor. This can require months of specialized work. BlockNote instead, offers a great experience with minimal setup, including a ready-made and animated UI. On top of that, it comes with a modern block-based design. This gives documents more structure, allow for a richer user experience while simultaneously making it easier to customize the editor's functionality. Community [#community] We'd love your feedback! If you have questions, need help, or want to contribute reach out to the community on [Discord](https://discord.gg/Qc2QTTH5dF) and [GitHub](https://github.com/TypeCellOS/BlockNote). Next: Set up BlockNote [#next-set-up-blocknote] See how to set up your own editor in the [Quickstart](/docs/getting-started). Here's a quick sneak peek in case you can't wait!This is a paragraph.
"; export default function App() { const editor = useCreateBlockNote(); useEffect(() => { // Replaces the blocks on initialization // But, you can also call this before rendering the editor async function loadHTML() { const blocks = await editor.tryParseHTMLToBlocks(myHTML); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ editor.replaceBlocks(editor.document, blocks); } loadHTML(); }, [editor]); returnThe `useCreateBlockNote` hook is actually a simple `useMemo` wrapper around the `BlockNoteEditor.create` method. You can use this method directly if you want to control the editor lifecycle manually. For example, we do this in the [Saving & Loading example](/examples/backend/saving-loading) to delay the editor creation until some content has been fetched from an external data source.
Note that the `BlockNoteView` component is an [uncontrolled component](https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components). This means you don't pass in the editor content directly as a prop. You can use the `initialContent` option in the `useCreateBlockNote` hook to set the initial content of the editor (similar to the `defaultValue` prop in a regular React `
BlockNote handles the complexities and performance optimizations of managing editor state internally. You can interact with the editor content using the [Editor API](/docs/reference/editor/overview).
This is a paragraph.
"; const blocks = await editor.tryParseHTMLToBlocks(existingContent); await storeToDB(blocks); ```