summernote

A simple, jQuery-based WYSIWYG editor you can drop into any page with a single line of code.

Library
npm
v0.9.1
11,838stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.How we score it →
58/100Fair
Development Activity8
Maintenance32
Community92
Maturity60
Momentum40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation.How we score it →
65/100Good
Architecture68
Code Quality62
Innovation60
Learning Curve70

Summernote is a lightweight WYSIWYG rich-text editor built on top of jQuery and Bootstrap. Dropping it onto a page is as simple as including its JS/CSS bundle and calling .summernote() on a target div - no build step, bundler config, or framework adapter required. It ships with a full toolbar (bold/italic/underline, lists, tables, links, images, video embeds, fullscreen and codeview modes) and pastes images directly into the document as base64 data URIs, sidestepping the need for a separate upload endpoint for casual use.

Under the hood it’s organized around a Context object that wires together dozens of small, independently registered modules (Editor, Toolbar, LinkDialog, ImageDialog, Codeview, Handle, Placeholder, and more), each following the same module lifecycle. That architecture, plus a long-lived plugin ecosystem (summernote/awesome-summernote) and Bootstrap 3/4/5 theme variants, is what has kept it a common choice for admin panels, CMS-style content fields, and legacy jQuery-based apps that need an inline editor without adopting a full ProseMirror/Slate-based stack.

What You Get

  • Drop-in jQuery plugin - initialize any div as a rich-text editor with one $(...).summernote() call, no build tooling required.
  • Bootstrap 3/4/5 themed builds - separate summernote-bs3.js/bs4/bs5 bundles ship pre-styled toolbars matching each Bootstrap major version.
  • Base64 image pasting - dropped or pasted images are embedded inline as base64 data URIs, so basic use needs no upload endpoint.
  • Codeview + fullscreen modes - toggle to raw HTML editing or fullscreen distraction-free writing from the built-in toolbar.
  • Plugin ecosystem - the community-maintained awesome-summernote list adds emoji pickers, math input, and dozens of other extensions on the same module API.

Common Use Cases

  • Admin panel content fields - give a Rails/Django/PHP admin a rich-text field for blog posts or page content without adopting a JS framework.
  • Legacy jQuery apps - add inline rich-text editing to an existing jQuery/Bootstrap codebase without introducing React/ProseMirror as a new dependency.
  • CMS comment/description boxes - lightweight WYSIWYG input for product descriptions, comments, or email templates in server-rendered apps.
  • Quick prototypes and internal tools - fastest path to a working rich-text box in a static HTML page or an internal tool with no build step.

Under The Hood

Architecture Every editor instance is driven by a Context object (src/js/Context.js) constructed per $note element: it merges user options with defaults, builds $.summernote.ui_template into a layoutInfo, then initializes a registry of independently loaded modules (Editor, Toolbar, Buttons, Clipboard, Codeview, Handle, Placeholder, AutoLink, dialogs, and more) that each hook into the same lifecycle (initialize/destroy/reset) and communicate through Context.invoke() and triggerEvent() rather than direct references. External API calls (e.g. $('#note').summernote('code')) are routed through this same invoke mechanism defined in src/js/summernote.js, so the public jQuery API and the internal module wiring share one dispatch path. It’s a comprehensive plugin-module pattern rather than a layered MVC app, and swapping the core editing abstraction (the Editor module) would ripple into most of the other UI modules that depend on its selection/range handling.

Tech Stack The library targets plain jQuery (declared only as a devDependency/peer expectation, not a runtime dependencies entry - consumers must supply their own jQuery) and is built with Vite (vite.config.js, vite-plugin-banner) into UMD bundles per Bootstrap version (summernote-bs3/4/5.js), with Babel (preset-env) handling legacy-syntax transpilation and Sass/Less powering the bs3-bs5 and lite style variants compiled via postcss/cssnano. Icon fonts are generated from SVGs through a custom webfont-based build script. There is no TypeScript in the source; it is authored in plain ES6 classes and modules.

Code Quality Tests run under Vitest with the @vitest/browser runner driving real headless Chrome via chromedriver/webdriverio, covering core utilities (dom, func, range, lists, key), the Context class, editing behaviors (Typing, Table, Style), and several UI modules (Fullscreen, LinkDialog, Buttons, Placeholder, HintPopover, VideoDialog, Codeview, Editor) - a genuine browser-level test suite rather than pure unit stubs. CI (.github/workflows/build.yml) runs lint, build, and test across Node 18/20 on every push and PR, and ESLint (eslint-config-standard) enforces style. There is no static typing layer, so correctness for the module invoke/event-dispatch pattern relies on tests and convention rather than a type checker, and recent commit/release activity is comparatively low for a project of this age.

API Design The headline ergonomic win is genuinely minimal setup: include a script tag, place a div, call .summernote() - no config object is required to get a working editor. The tradeoff is a somewhat dated API surface: the public interface is a single overloaded jQuery method (.summernote('code'), .summernote('destroy'), etc.) rather than typed methods, there’s no first-party TypeScript definitions, and jQuery itself is an unlisted-but-required runtime dependency the consumer must bring. Documentation for options and the full API lives on an external docs site rather than in structured in-repo docs, though the example-heavy examples/ directory and community plugin catalog partially offset that.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers

Search