Rune is now open source
The block editor that powers Zyler is public on npm under MPL-2.0 — a framework-agnostic engine any React app can drop in.
Overview
Rune is the editor engine we built for Zyler: a Notion-style block
editor with drag handles, a slash menu, tables, multi-column layouts, wiki-style
[[links]], and inline formatting. It's now open source on public npm under
the MPL-2.0 license — the same editor that ships inside our own product, free
for anyone to build on.
Two packages, one direction
Rune is published as two layers with a strict, one-way dependency (react → core),
so you pick the layer that fits your stack:
| Package | What it is |
|---|---|
@ocai/rune-core | Headless — the ProseMirror/Tiptap schema and extensions. No React, no DOM, no CSS. Runs in SSR, Workers, or a CLI. |
@ocai/rune-react | The default UI — hooks, components, Tailwind + Radix. Drop in <RuneEditor /> and go. |
Most apps only need the React package:
pnpm add @ocai/rune-react
import { RuneEditor } from "@ocai/rune-react";
import "@ocai/rune-react/style.css";
export function Editor() {
return <RuneEditor />;
}
What makes it different
Rune sits between "Tiptap is too low-level" and "BlockNote locks you into one
model." Its schema is deliberately flat — blocks are top-level siblings with a
depth attribute rather than nested container nodes — and it hands you the native
Tiptap Editor, not a wrapper class. Drag handles, side menus, and drop
indicators are all ProseMirror decorations, so there are no JS-positioned overlays
to fight with.
Editors are infrastructure. We'd rather share the engine and compete on the product built with it.
The road ahead
The public core stays open under MPL-2.0 as a developer-facing foundation and the engine behind Zyler. Browse the source and the live demo on GitHub, or see it in a finished product on the Rune page.