JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 21
  • Score
    100M100P100Q82559F
  • License MIT

Self-hosted, white-labeled rich-text editor for the web. Accepts legacy editor config strings for easy migration — no external CDN, no GPL contagion.

Package Exports

  • @waveeditor/core
  • @waveeditor/core/dist/stats.html
  • @waveeditor/core/dist/waveeditor.classic.min.css
  • @waveeditor/core/dist/waveeditor.dark.min.css
  • @waveeditor/core/dist/waveeditor.esm.js
  • @waveeditor/core/dist/waveeditor.esm.js.map
  • @waveeditor/core/dist/waveeditor.min.css
  • @waveeditor/core/dist/waveeditor.min.js
  • @waveeditor/core/dist/waveeditor.min.js.map
  • @waveeditor/core/package.json

Readme

🌊 WaveEditor

A self-hosted, white-labeled rich-text editor for modern web apps. No external CDN, no surprise bills, free license keys.

Status License Tests Bundle


🔑 v0.11.0 introduces license keys. All keys are free for now — paste WE-FREE-ANY-PUBLIC2026 into your WaveEditor.init({ license: ... }) call and you're set. Local dev (localhost, .test, .local, .localhost) is exempt and mounts without a key. See Licensing below.

What WaveEditor is

WaveEditor gives web developers a rich-text editor that is owned by the people who use it:

  • Self-hosted — single JS + CSS pair, no external CDN, works offline and behind firewalls
  • Legacy migration aid — accepts the config-string shape used by older WYSIWYG editors, so existing init() calls parse without changes
  • MIT-licensed open core — no GPL contagion, no recurring fees
  • Brandable — full white-label support via CSS variables; ship it under your own product name
  • Commercial-ready — clean separation between free core (Phases 0–3) and future paid tier (Phase 4)

Package

Published on npm as @waveeditor/core.

The unscoped waveeditor name is blocked by npm's anti-typosquatting policy (similarity to the unrelated wangeditor package), so we use the @waveeditor org scope — same convention as TipTap (@tiptap/core), Lexical (@lexical/core), CKEditor 5 (@ckeditor/*). Brand identity stays "WaveEditor" everywhere except the install command.

Licensing

WaveEditor uses a license-key model so we can identify legitimate installs and revoke individual keys if needed. Every key for v0.11 is free.

WaveEditor.init({
  selector: '#editor',
  license: 'WE-FREE-ANY-PUBLIC2026', // free, works on any domain
  plugins: 'bold italic | link image',
  toolbar: 'bold italic | link image',
});

Exempt hosts — local development is never blocked. The following hostnames mount without a license:

localhost · 127.0.0.1 · 0.0.0.0 · *.local · *.test · *.localhost

That covers Laragon, Valet, mDNS, and the typical dev stack. Production domains require a key.

Failure mode is strict. Without a valid key on a non-exempt host, WaveEditor.init() returns null and the target element is replaced by an inline error panel — no silent fallback. This is by design.

Need a key for your own domain or want to ask about the paid tier? Visit waveeditor.co.in.

Quick start

Via npm

npm install @waveeditor/core
import { WaveEditor } from '@waveeditor/core';
import '@waveeditor/core/dist/waveeditor.min.css';

WaveEditor.init({
  selector: '#editor',
  license: 'WE-FREE-ANY-PUBLIC2026',
  plugins:
    'undo redo bold italic underline strikethrough subscript superscript ' +
    'heading blockquote bullet-list ordered-list indent outdent ' +
    'align-left align-center align-right align-justify ' +
    'link unlink image clear-formatting horizontal-rule ' +
    'source-view fullscreen word-count clipboard',
  toolbar:
    'undo redo | bold italic underline strikethrough | ' +
    'heading blockquote | bullet-list ordered-list indent outdent | ' +
    'align-left align-center align-right align-justify | ' +
    'link unlink image | source-view fullscreen',
});

Via CDN (drop-in, no build step)

<link rel="stylesheet" href="https://unpkg.com/@waveeditor/core/dist/waveeditor.min.css">
<script src="https://unpkg.com/@waveeditor/core/dist/waveeditor.min.js"></script>

For a more compact, cool-blue look (smaller buttons, lighter toolbar), swap the stylesheet — JS is unchanged:

<link rel="stylesheet" href="https://unpkg.com/@waveeditor/core/dist/waveeditor.classic.min.css">

<div id="editor"></div>
<script>
  WaveEditor.init({
    selector: '#editor',
    license: 'WE-FREE-ANY-PUBLIC2026',
    plugins: 'bold italic link image bullet-list',
    toolbar: 'bold italic | link image | bullet-list',
  });
</script>

The config-string shape is shared with older WYSIWYG editors, so migrating an existing init() block is usually a find-and-replace.

Currently shipped (through v0.9.0)

Category Features
Marks bold · italic · underline · strikethrough · subscript · superscript · code
Typography (v0.7.0) font-family · font-size · font-color · highlight · line-height
Blocks heading (paragraph / H1–H6 dropdown) · blockquote · preformatted · bullet-list · ordered-list · horizontal-rule
Code blocks (v0.7.0) code-block — Auto-detect + Plain + 12 languages (Bash / CSS / HTML / JS / JSON / Markdown / PHP / Python / SQL / TS / XML / YAML) via lowlight
Tables (v0.6.0) table · table-ops (row + col ops, merge / split, toggle header, delete) · column resize · table-cell-color (shared picker since v0.7.0) · table-cell-border
Alignment align-left · align-center · align-right · align-justify (paragraphs + headings)
Operations undo · redo · indent · outdent (lists) · clear-formatting · page-break · date-time (5 formats)
Editing aids (v0.8.0) anchor (named jump target) · search-replace (decoration highlights + prev / next / replace / replace-all + case / whole-word) · charmap (~115 special characters with live search) · emoji (8 categories + search + recents)
Workflow (v0.9.0) templates (config-driven snippet popover) · markdown-shortcuts (StarterKit input rules) · visual-blocks (debug-overlay toggle)
Dialogs link (insert / edit / autoprefix https:// / new-tab / autolink on type) · unlink · image (Upload / URL, drag-drop + paste, server upload via images_upload_url / images_upload_handler; v0.7.0 adds resize / align / caption / alt via a floating bubble) · media (YouTube / Vimeo auto-detect + configurable iframe allowlist)
Editor modes source-view (HTML edit) · fullscreen (ESC exits) · word-count (debounced status bar) · autosave (v0.8.0) (debounced localStorage save + restore prompt + "Saved · HH:MM" indicator)
Security clipboard (strips <script>, <iframe>, inline on*= handlers, javascript: URLs on paste) · paste-from-word (v0.8.0) (7-stage MSO scrub + pseudo-list recovery) · media_allowlist rejects clickjacking-prone iframe sources
Drag & drop image (file → upload pipeline) · drag-drop (v0.8.0) (text / html / .txt with drop-zone outline)
Legacy aliases numlistordered-list, bullistbullet-list, alignleftalign-left, etc. — accept the config-string shape used by older WYSIWYG editors

See docs/api.md for the full public API reference and docs/plugins.md for writing custom plugins.

Examples

HTML demos in examples/ that you can open via npm run dev:

Testing

npm test           # 790+ unit tests
npm run e2e        # Playwright e2e — 25 specs × chromium / firefox / webkit
npm run build      # produces dist/ — waveeditor.min.{js,css} (94 KB / 5 KB gz)
                   #              + waveeditor.classic.min.css (5.5 KB gz)
                   #              + waveeditor.dark.min.css
npm run license:audit  # fails on GPL/AGPL/SSPL

Roadmap

Phase Theme Status Plan
P0 Project bootstrap ✅ Done · v0.0.1 phase-0.md
P1 Core formatting (bold, italic, lists, links, images, …) ✅ Done · v0.5.0 phase-1.md
P2 Advanced editing (tables, fonts, colors, code blocks, …) 🚧 Soft-launch · v0.6.0 (tables) · v0.7.0 (typography + color + code + media) · v0.8.0 (editing aids + paste + autosave) · v0.9.0 (polish + classic theme) · v0.10.0 (drop-in shape) · v0.11.0 (licensing + brand) · v1.0.0 after one real production migration phase-2.md
P3 Power features (track changes, comments, mentions, slash commands, …) Planned phase-3.md
P4 Backend-dependent (real-time collab, AI, asset manager, …) Planned phase-4.md

Documentation

Doc Purpose
docs/usage.md Start here. Recipe-style developer guide: installation, licensing, configuration, image upload, theming, legacy-editor migration
docs/api.md Public API reference — WaveEditor.init, get, remove, use, plugin shapes
docs/plugins.md Plugin authoring guide with worked examples
docs/design.md Architecture, public API, mission & vision, licensing strategy
docs/visual-design.md Complete visual language: colors, typography, components, states, dark mode
docs/mockups/ Seven interactive HTML mockups capturing every visual decision
docs/phases/ Detailed implementation plans per phase
CLAUDE.md Project rules for AI agents working in this repo

Built on

Full third-party attributions: NOTICES.md.

Contributing

See CONTRIBUTING.md for the contribution workflow. The architecture rules and project conventions live in CLAUDE.md.

Security

Found a vulnerability? See SECURITY.md for the responsible disclosure process.

License

MIT — © 2026 Manish Patolia.

WaveEditor is built on MIT-licensed open-source components and is itself MIT-licensed. Commercial premium features (Phase 4+) may be offered under a dual-license model in the future; see docs/design.md §16.