mrkeyoor.com_
Sat 17 Oct 13:32 UTC
Webevaluationupdated 08 Oct 2026

slate review

Slate is a React framework for building rich text editors from a tree-shaped document model, commands, transforms, and plugins. It solves the hard foundation work around selections and editable content while leaving your product to define its schema, toolbar, paste rules, rendering, and collaboration layer.

+1stars / 7d
Verdict

Our Slate run installed 14 packages and built in 54 seconds, but its tests failed after 4 seconds at the CommonJS and ESM boundary, so the source checkout is not a clean confidence signal today. Choose Slate when your editor's custom document behavior is important enough to justify owning paste, collaboration, and device testing. Choose a more packaged editor when standard rich text matters more than control.

We ran it

Lab card: what happened when we ran slateScreenshot of slate (slatejs.org)
Install✓ · 35s14 packages · 187 MB
Build✓ · 54s
Tests✗ · 4sran, no count parsed
Repo1580 files~62,671 lines of source · 7.6 MB · 4 CI workflows

Answers from our run

Does slate build from source?

Dependencies installed in 35 seconds (14 packages), and the build succeeded in 54 seconds. We cloned commit b0951d8 into a clean Debian container with 3 CPUs and no project-specific setup.

Do slate's tests pass?

No. The project's own test command exited unsuccessfully after 4 seconds, and its output did not expose an individual test count.

Who should not use slate?

Teams wanting a finished editor with a toolbar, schema, and HTML paste behavior out of the box: Slate's core is schema-less, and default paste is plain text.

What are the alternatives to slate?

Tiptap, Lexical, ProseMirror. Our Slate run installed 14 packages and built in 54 seconds, but its tests failed after 4 seconds at the CommonJS and ESM boundary, so the source checkout is not a clean confidence signal today.

Setup3/535-second install and 54-second build, followed by a failed suite
Docs4/5Strong concepts and walkthroughs with candid browser caveats
Community5/531,754 stars with October 7 releases and active pull requests
Maturity3/5Long-lived and active, but still beta with no 1.0 schedule

Discussed on

  1. hnSlate – A completely customizable framework for building rich text editors164 points
  2. hnSlate: A framework for building rich text editors in the browser11 points
  3. hnKickstarter campaign to add Android Support to Slate -Rich text editor framework8 points
  4. hnSlate-completely customizable framework for building rich text editors4 points
  5. hnSlate.js: A completely customizable framework for building rich text editors3 points

Who it’s for

React teams building an editor with domain-specific blocks, embeds, mentions, or nested content.
Products willing to own editor behavior and test it across their supported browsers and devices.
Developers who need programmatic document transforms alongside normal typing.
Applications whose collaboration stack can use Yjs, slate-yjs, and a separate network provider.

Who it’s NOT for

Teams wanting a finished editor with a toolbar, schema, and HTML paste behavior out of the box: Slate's core is schema-less, and default paste is plain text.
Projects requiring a finalized 1.0 API: the README calls Slate beta, warns about breaking changes, and gives no 1.0 schedule.
Mobile products without a device-testing budget: the FAQ says iOS is not regularly tested and Android follows a separate input path with more possible bugs.
Apps expecting built-in multiplayer infrastructure: the collaboration guide adds Yjs, slate-yjs, and either a hosted or self-run provider.
Contributors who require a green fresh-container suite: our tests failed in 4 seconds on a CommonJS named-export error.

Setup reality

Our sandbox installed 14 Yarn packages in 35 seconds and used 187 MB at commit b0951d8. The monorepo build succeeded in 54 seconds. Tests failed with exit code 1 after 4 seconds because the runner requested the named export BaseEditor from a CommonJS build of slate; the log suggests a default import but does not explain why the module formats differed.

A consumer installs slate, slate-react, react, and react-dom. TypeScript projects also augment Slate's CustomTypes for their editor, elements, and text. Collaboration adds Yjs, slate-yjs, and a communication provider. Rich HTML paste needs an application-defined deserializer because the default path inserts plain text.

The 7.6 MB checkout contained 1,580 files and about 62,671 source lines. It is a Yarn workspace with 4 CI workflow files, no Dockerfile, and no root tests directory in our scan. React 18.2 or newer is the current peer requirement; browser and mobile behavior still needs testing against the devices your users actually type on.

Slate supplies editor mechanics, not a finished editor

Slate's core models a document as nested elements and text nodes, close to the shape of the DOM. An application can define tables, captions, mentions, images, nested quotes, or its own domain objects without fitting them into a preset schema. Commands and transforms change that tree programmatically, while plugins extend the editor object. This is the reason to choose Slate: the product can decide what a document means instead of accepting a vendor's menu of node types.

That freedom moves work into your codebase. Slate does not know what bold text, a block quote, or an uploaded image means unless you teach it. The FAQ says pasted content becomes plain text by default because the core cannot infer how your schema should deserialize HTML. A toolbar, keyboard shortcuts, validation rules, serialization, and error handling are application features. The examples show how to build them, but they are examples rather than a finished editing product.

Four packages divide the core, React, history, and test helpers

The monorepo publishes slate, slate-react, slate-history, and slate-hyperscript, with slate-dom also present in the current workspace. A basic React setup installs the first 2 packages plus React and React DOM, creates an editor with createEditor(), wraps it with withReact(), and renders Slate above Editable. TypeScript users declare their own element and text types through module augmentation. That makes domain nodes typeable, but it is extra setup before the first custom block.

Core slate and slate-react reached version 0.129.0 on October 7, 2026. The React package currently accepts React 18.2 or newer as a peer. Its same-day release fixed Android input that could be dropped before a rerender and repaired editor replacement during fast refresh. Those changes are practical, low-level editing fixes. They also show why a contenteditable framework needs release testing around typing, selection, deletion, and composition rather than only rendered snapshots.

What happened when we ran it

Our sandbox cloned commit b0951d8 into an unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node 22, and no secrets. Yarn installed 14 packages in 35 seconds, consuming 187 MB on disk. The build completed successfully in 54 seconds. The checkout held 1,580 files, about 62,671 lines of source, and occupied 7.6 MB before installation.

Tests failed with exit code 1 after 4 seconds. Node reported that the named export BaseEditor was not found because the requested slate module was CommonJS. The message says CommonJS packages can be loaded through a default import, then the stack continues through Mocha's ESM import helper. That is the entire supported finding. The log does not tell us which configuration or packaging step produced the mismatch, so assigning blame to Node 22, Yarn, Mocha, or Slate would be guesswork.

Our scan found 4 CI workflow files, no Dockerfile, no root tests directory, and Yarn workspaces. A Dockerfile is not important for a browser library, while the failed suite is important for contributors. Installation and build passed cleanly, yet the normal test command did not reach assertions in our environment. If you plan to patch the editor, reproduce the package-format path in your own CI before relying on the repository as a green baseline.

Collaboration requires 3 extra moving parts

Slate's operation model was designed so collaboration can be layered on, but the server and synchronization protocol are outside core. The official walkthrough uses Yjs, @slate-yjs/core, and a communication provider. A hosted Liveblocks provider is one option; y-websocket is an example you run yourself. Remote cursors come from another slate-yjs React package. This is a workable recipe, though a product team still owns connection state, provider lifecycle, permissions, persistence, and recovery.

The distinction matters during selection. The README's collaboration-ready claim describes the data model, not a multiplayer service included with Slate. If live cursors, comments, and offline merges are primary requirements, prototype them before locking the document schema. Tiptap, Lexical, and direct ProseMirror use make different tradeoffs, but none removes the need to understand how collaborative state is stored and authorized.

Mobile and IME behavior need real-device checks

Slate's FAQ says desktop coverage targets recent Chrome, Edge, Firefox, and Safari. iOS is supported without regular testing, while Android uses compositions and mutations because its beforeInput behavior differs. Open issue 6118 reports a multi-line Chinese IME commit appearing twice in Chrome on macOS, even though the Slate model stores it once. That is a narrow reproduction, but it concerns exactly the sort of text path an English-only smoke test misses.

Recent release work fixed lost Android input and several void-element selection cases. Another open report, issue 6157, is limited to Pixel 5 emulation and explicitly says real-device impact is unconfirmed. That careful wording matters. It is evidence to test a fast select-all and delete flow, not evidence that every Android user will lose text. Build a matrix around the browsers, keyboards, languages, paste sources, and assistive technology your audience uses.

The beta label still governs the decision

GitHub listed 31,754 stars and 591 open issues and pull requests combined, and the repository was pushed on October 8, 2026. Package releases landed the previous day. Those dates show active maintenance; they do not cancel the README's beta warning. Slate says some APIs can still break, gives no schedule for 1.0, and describes maintenance as contributor-driven. A popular, active beta can still demand migration work from its users.

Choose Slate when the editor itself is part of your product's identity and a generic schema would fight the design. Its nested tree, transforms, and React rendering give a capable team room to build unusual interactions. The bill is ownership: our 4-second module failure, external collaboration stack, plain-text default paste, and device-specific input paths all require engineering attention. If your roadmap mostly says headings, lists, links, and comments, start by comparing the amount of code a more packaged option removes.

Alternatives

ProjectWhat it isPick it when
Tiptap gh↗A headless editor framework built on ProseMirror with a large extension system.pick this instead when packaged extensions and a ProseMirror base reduce the amount of editor behavior you must write.
Lexical gh↗Meta's extensible text editor framework with React bindings and plugin packages.pick this instead when Lexical's node and plugin model fits your React product and you prefer its release posture.
ProseMirrorA lower-level toolkit for schema-driven rich text editing in the browser.pick this instead when a strict document schema and ProseMirror's transaction model are the desired foundation.

What people are saying

  1. [velocity-scout] ianstormtaylor/slate

Sources

  1. Slate README
  2. Installing Slate
  3. Slate collaboration walkthrough
  4. Slate FAQ
  5. Slate 0.129.0 release
  6. Slate IME issue 6118
  7. Slate repository metadata

More web reviews

dioramas · elpis · deepseek-whale-girl · floorplan-3d · taro · driver.js · the whole board →