Notes on building and buying rich text editors
Technical write-ups and buying analysis from the team that builds RichTextEditor. Every cost figure is taken from the vendor’s own published pricing, and every technique is one we ship.
What rich text editors actually cost in 2026
Editor-load metering, per-seat AI credits, and collaboration add-ons stack in ways list prices hide. A worked three-year comparison using each vendor's own published pricing.
Read the article →How paginated page view works in a browser editor
Word shows you page boundaries. A contenteditable does not. Here is how to project a continuous DOM onto real paper geometry - and the measurement trap that silently overflows pages.
Read the article →Legal numbering (1, 1.1, 1.1.1) with CSS counters
Contracts and specifications need hierarchical clause numbering. Writing the numbers into the text guarantees they drift. CSS counters keep the markup clean and the numbering always correct.
Read the article →CRDT vs OT: how collaborative editors merge edits
Google Docs transforms operations. Yjs-based editors converge data structures. The choice barely shows in a demo and shows up all over your architecture - plus a five-step test for verifying any vendor's claim.
Read the article →Content-Security-Policy for rich text editors
Editors inject stylesheets, set inline style attributes, embed iframes, and sometimes fetch libraries mid-session. Here is how to work out the policy you actually need instead of reaching for unsafe-inline.
Read the article →Does your rich text editor phone home? How to check
Metered editors need to count you. If your editor bills per load, something is reporting those loads. A ten-minute method to find out exactly what your editor sends, and where.
Read the article →Why your format painter silently does nothing
Wrapping the target in a span with the captured styles looks obviously correct, and it fails on the most common case a user will try. The reason is one line of the CSS cascade that almost nobody thinks about.
Read the article →Footnotes that renumber themselves
A footnote is two things in two places that must always agree. Keep one source of truth - the order of the markers in the document - and derive everything else from it, including the numbers you write into the saved HTML.
Read the article →A contents block is content. An outline panel is not.
They look like the same feature and they belong to different halves of your editor. Getting the line wrong produces either chrome that leaks into published HTML, or a contents page that vanishes on save.
Read the article →“Nothing executes in the editor” is the wrong bar
We ran twenty XSS payloads through our own editor. None of them fired. Then we rendered what it saved, and one of them did. The gap between those two tests is where stored XSS lives.
Read the article →Writing a PDF by hand, so the text stays text
Most browser PDF export screenshots each page. The result is unselectable, unsearchable, invisible to screen readers, and enormous. Emitting the file format directly is far less work than it sounds — once you avoid the two traps that produce a file no reader will open.
Read the article →A searchable PDF and an accessible PDF are different features
Selectable text passes the copy-paste test and still fails a Section 508 audit. Structure — headings, list semantics, table header cells, reading order — is a separate thing you have to write, and the decorative parts have to be excluded on purpose.
Read the article →Equations that survive a round trip through Word
Word stores maths as a tree in its own XML namespace, sitting between the runs of a paragraph. A converter that walks runs never sees it — so the formula vanishes while the sentence around it imports perfectly.
Read the article →What is actually inside a .docx, and how to write one
A .docx is a ZIP of XML with a relationship graph bolted on. Building one in the browser is very doable — and there are about six specific ways to produce a file that Word refuses to open with no explanation.
Read the article →Auditing a rich text editor for accessibility in an afternoon
Four checks, no tooling, about twenty minutes. We ran them on our own editor and found a keyboard trap that had been shipping for years — while the accessibility statement said there wasn't one.
Read the article →The Tab key problem in contenteditable
Tab has to indent lists and move between table cells. It also has to let a keyboard user leave. Those requirements are in direct conflict, and picking either one alone produces a WCAG Level A failure or an editor writers hate.
Read the article →How to verify a WYSIWYG vendor's feature claims
Every editor's comparison page says “included”. A feature list is a marketing artifact until you can exercise it. Here is how to check any vendor's claims in an evaluation — including ours — in about half an hour.
Read the article →Should you build your own rich text editor?
Sometimes yes. The honest version of this question isn't “can you” — a usable toolbar is a weekend. It's whether you want to own the twelve problems that arrive in year two, and most of them are invisible from year one.
Read the article →HTML, JSON or Markdown: how should you store rich text?
The storage format you pick on day one decides what you can do in year three — search, diffing, migrating editors, rendering on a phone. Here is what each format actually costs, and the one mistake that is genuinely hard to undo.
Read the article →Image and file uploads in a rich text editor, done properly
Uploading the file is the easy part. The hard parts are what happens when the upload fails halfway, when the user pastes a 12 MB screenshot, and when someone deletes the image but not the blob.
Read the article →Cleaning HTML pasted from Word and Google Docs
A paste from Word can carry 40 KB of markup for one sentence. Strip too little and your database fills with mso styles; strip too much and you throw away the structure the author cared about.
Read the article →