{"id":13437025,"url":"https://github.com/ritzyed/ritzy","last_synced_at":"2026-01-14T20:35:48.545Z","repository":{"id":33672499,"uuid":"37325153","full_name":"ritzyed/ritzy","owner":"ritzyed","description":"Collaborative web-based rich text editor","archived":false,"fork":false,"pushed_at":"2017-10-10T06:48:23.000Z","size":1005,"stargazers_count":896,"open_issues_count":16,"forks_count":53,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-10-05T16:13:23.266Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://ritzyed.github.io/ritzy/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"undertheseanlp/sentiment","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ritzyed.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":"docs/CONTRIBUTING.adoc","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-12T14:01:58.000Z","updated_at":"2025-08-11T16:04:50.000Z","dependencies_parsed_at":"2022-07-12T09:51:54.193Z","dependency_job_id":null,"html_url":"https://github.com/ritzyed/ritzy","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/ritzyed/ritzy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ritzyed%2Fritzy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ritzyed%2Fritzy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ritzyed%2Fritzy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ritzyed%2Fritzy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ritzyed","download_url":"https://codeload.github.com/ritzyed/ritzy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ritzyed%2Fritzy/sbom","scorecard":{"id":777533,"data":{"date":"2025-08-11","repo":{"name":"github.com/ritzyed/ritzy","commit":"39e28033cbd4808d90a821a95e9c32aba3195a2c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}}]},"last_synced_at":"2025-08-23T03:58:44.756Z","repository_id":33672499,"created_at":"2025-08-23T03:58:44.756Z","updated_at":"2025-08-23T03:58:44.756Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28434482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T18:57:19.464Z","status":"ssl_error","status_checked_at":"2026-01-14T18:52:48.501Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T03:00:53.824Z","updated_at":"2026-01-14T20:35:48.518Z","avatar_url":"https://github.com/ritzyed.png","language":"JavaScript","readme":"= Ritzy Editor\n:toc:\n:sectanchors:\n\nimage:https://badges.gitter.im/Join%20Chat.svg[link=\"https://gitter.im/ritzyed/ritzy?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge\"]\nimage:https://img.shields.io/badge/license-Apache-blue.svg[link=\"http://opensource.org/licenses/Apache-2.0\"]\nimage:https://img.shields.io/npm/v/ritzy.svg[link=\"https://www.npmjs.com/package/ritzy\"]\nimage:https://travis-ci.org/ritzyed/ritzy.svg[link=\"https://travis-ci.org/ritzyed/ritzy\"]\n\n[[about]]\n== About\n\n=== Demo / Short Introduction (TL;DR)\n\nFinally, a good, open source, cross-browser [1], rich text, real-time,\nembeddable, collaborative editor for the web! Here is a demo:\n\nhttp://demo-ritzy.rhcloud.com/  (https://github.com/ritzyed/ritzy-demo[source])\n\n[1] IE10+ and evergreen browsers supported, perhaps earlier browsers will work\ntoo.\n\nNote that the code is alpha quality.\n\n=== Longer Introduction\n\nThe Ritzy editor is a rich text, real-time character-by-character collaborative\nembeddable browser-based editor. It shuns use of the\nhttps://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable[contentEditable]\nattribute in favor of a custom editor surface and layout engine, exactly like\nthe approach\nhttp://googledrive.blogspot.ca/2010/05/whats-different-about-new-google-docs.html[implemented\nby] Google Docs.\n\nIn addition, and also like Google Docs, Ritzy is built with real-time\ncollaborative editing support from the ground up, unlike most browser-based\neditors that require third-party plugins or that do not support it at all. The\nunderlying mechanism for this is a\nhttps://github.com/ritzyed/ritzy/blob/master/docs/DESIGN.adoc[causal tree CRDT].\n\nRitzy implements all the basic expected text editing functionality, such as\nbold, underline, strikethrough, superscript, subscript, selection via keyboard\nand mouse, cut, copy, and paste. More capabilities will be added as needed or as\nthird-party contributions are received.\n\n[[about_other]]\n=== Features\n\n* Real-time collaborative text editing just like Google Docs, with all the basic\nstandard editing features and shortcuts.\n\n* Multiple author colored/labeled cursor and selection tracking in real-time.\n\n* Paragraph flow control, including wrapping support for long words/URLs.\n\n* Selection and keyboard navigation behavior mimicking common platforms like\nMicrosoft Word and Google Docs.\n\n* Cursor decorations such as blinking with focus and idle, slant when traversing\nitalic text, and invisible when there is no focus.\n\n* Selection decorations such as gray-out when editor does not have focus.\n\n* Automatically scrolling the document window horizontally and vertically to\nkeep the cursor visible.\n\n* Cut/copy/paste of clipboard data, including conversion between rich text and\nHTML, including support for copy/paste to/from Microsoft Word.\n\n* API to control the editor and to obtain selections as rich text, HTML, or\nplain text.\n\n* Input handling and support for non-english languages.\n\n* Offline simultaneous editing.\n\n=== Limitations and Target Audience\n\nUnlike Google Docs, Ritzy does not (currently) support complex page-based layout\nneeded to build a word processor. It will be most useful for those developers\nwho wish to add collaborative rich-text data entry fields to their browser\napplications. However, some layout capabilities are planned to be added over\ntime, such as bulleted and numbered lists, styles, and other such features.\n\n==== Mobile Support\n\nMobile is partially supported. On a Nexus 5 and Nexus 7 with a recent Chrome,\nthe following seem to work:\n\n* basic text entry (though there are some quirks – for some reason the phone\nwants to capitalize every word and not enter spaces automatically),\n* cursor positioning, and\n* real-time view of other people's cursors, selections, and typing.\n\nRitzy has not yet been tested on any iOS devices, but it is likely with some\ntweaking similar capabilities as noted above will be possible on any recent\nmodel.\n\nSelections do **not** work at all. It is possible that this is an intractable\nproblem with the editor as it exists today, given how selections on mobile work.\nOne possible solution is to take the same approach that Google appears to have\ntaken with Docs – for editing, create a native component that talks the same\nunderlying data exchange language for collaboration, but with native rendering\nof the editor and interaction with the user. There are no immediate plans to\nwork on this.\n\nAs an aside, similar integration could be done for native desktop editors.\n\n==== Production Readiness\n\n*The code is alpha quality*. Lots of real-world testing is needed. While the\nclient side is pretty performant once the editor is loaded, lots of optimization\nwork remains to be done, especially on the underlying CRDT data structures.\n\n== Supported Data Formats\n\nRitzy can import and export data in JSON, HTML, and text. See\nhttps://github.com/ritzyed/ritzy/blob/master/docs/API.adoc#contents[API Content]\nand https://github.com/ritzyed/ritzy/blob/master/docs/API.adoc#selection[API\nSelection].\n\n=== Rich Text JSON\n\nRitzy can import and export a JSON structure containing an array of text chunks\nwith associated attributes. These attributes are currently boolean values for\nbold, italics, and so forth, but could in the future include other values such\nas style names.\n\nTIP: This format is \"full fidelity\" i.e. exported rich text data is guaranteed to be\nimported exactly. Here is an example:\n\n[source,javascript]\n----\nlet content = [\n  { 'text': 'This is some ', 'attrs': null },\n  { 'text': 'bold', 'attrs': {'bold': true} },\n  { 'text': ' text.', 'attrs': null }\n]\n----\n\n=== HTML\n\nRitzy can import and export HTML. This is used internally by the editor when\ncopying/pasting rich text to external applications such as Word or Google Docs.\n\n=== Plain Text\n\nRitzy can import and export plain text. This is used internally by the editor\nwhen copying/pasting plain text to external applications such as text editors.\n\n=== Native Causal Tree CRDT\n\nThe internal data model for the editor is a causal tree CRDT described in the\nhttps://github.com/ritzyed/ritzy/blob/master/docs/DESIGN.adoc[DESIGN].\n\nIn addition to the formats described above which will be used most often, this\ndata is also accessible via the\nhttps://github.com/ritzyed/ritzy/blob/master/docs/API.adoc[API].\n\nWARNING: This format is not final, and is subject to change in future versions.\n\n[[usage]]\n== Usage\n\nRitzy is an ES6 React component with an optional API wrapper. Currently, it does\nrequire a server-side implementation to support collaborative editing. In the\nfuture, this will be optional.\n\nSee the\nhttps://github.com/ritzyed/ritzy/blob/master/docs/INSTALLATION.adoc[INSTALLATION]\ndocument for information about how to integrate Ritzy into your client and\nserver-side infrastructure.\n\n[[roadmap]]\n== Roadmap\n\nThe following is a tentative list of features and capabilities that will be\nadded over time.\nhttps://github.com/ritzyed/ritzy/blob/master/docs/CONTRIBUTING.adoc[Contributions]\nare welcome.\n\n* Tests (many, see GitHub issue xx) (hard!).\n\n* Once tests are in place, refactoring to make the editor code more modular /\neasier to understand (hard).\n\n* Undo/redo (hard).\n\n* Make Ritzy work without a shared replica and server implementation -- create\na local-only replica with the same API (medium).\n\n* Performance improvements. Performance is pretty good right now, but much can\nbe done to improve it further. Some ideas:\n** Use immutable collections as much as possible e.g.\nhttp://facebook.github.io/immutable-js/\n** Implement some type of compression and/or indexing for characters within the\ncausal tree CRDT.\n** Clear stale data from the causal tree CRDT, such as deletions (but keep\nenough for revision history).\n** Cache frequently used / slow operations where possible.\n** Server-side performance improvements. Currently the initial load can become\nvery slow as the replica continues to grow.\n\n* Styles for content e.g. headings, lists, etc. (medium).\n\n* Add to the API (easy):\n** Insert HTML at a particular position specified by the native data model\n** Command and status support for text attributes e.g. to support a toolbar\n** See http://w3c.github.io/editing/historic-editing-apis.html[Historic Editing\nAPIs] for comparison/implementation with contentEditable-based APIs.\n\n* A skinnable and/or replaceable toolbar that leverages the editor API (medium).\n\n* Test and support editor fonts other than OpenSans (easy to medium?).\n\n* Handle font size as a character attribute (medium to hard).\n\n* Reduce the number of dependencies and lower download size as much as is\npossible without sacrificing clarity and maintainability.\n\n* Search/replace (TODO).\n\n* Figures and tables (TODO).\n\n* Bullets and numbering (TODO).\n\n* Inline images (TODO).\n\n* Right-click menu support (medium).\n\n* Color-coded authoring display (medium).\n\n* Text highlighting (easy to medium?).\n\n* History/timeline/revision view (hard).\n\n* Drag and drop support (medium).\n\n[[commercial_features]]\n== Commercial Features (Future)\n\nIn addition to the editor which will remain free and open source,\nhttp://vivosys.com[VIVO Systems], the organization behind Ritzy, is considering\noffering the Ritzy editor as a service. A server-side component is required for\nreal-time collaboration.\n\nNOTE: A simple but working server-side component is bundled. See the\nhttps://github.com/ritzyed/ritzy/blob/master/docs/INSTALLATION.adoc[INSTALLATION]\ndocumentation.\n\nThe commercial server-side solution will handle storage, communications,\nsecurity, availability, and provide a simple but powerful server-side API for\ndevelopers to interact with the editors under their control, and the data they\ncontain. Some of the features of this API may include:\n\n* Create, archive, and destroy text replicas.\n\n* User identification and specification of authoring labels.\n\n* Set and modify access control.\n\n* Get editor contents (snapshot + real-time bidirectional push).\n** Integration with various server-side libraries e.g. Akka, Vert.X, RxJava,\nKafka, etc.\n\n* Set or modify editor contents.\n\n* Show server feedback on editor surface e.g. comments/errors/word highlights.\n\n* Get revision history.\n\n* Get editing statistics e.g. authors, character count overall and by author,\nword count overall and by author, time spent editing overall and by author, and\nso forth.\n\n* Isomorphic rendering of editor's server-side and client-side for performance.\n\nPlease\nmailto:sales@vivosys.com?subject=Interested%20in%20the%20Ritzy%20Service[let us\nknow] if your company or startup may be interested in such a service.\n\n[[developers]]\n== Developers\n\nSee\nhttps://github.com/ritzyed/ritzy/blob/master/docs/CONTRIBUTING.adoc[CONTRIBUTING]\nand\nhttps://github.com/ritzyed/ritzy/blob/master/docs/DEVELOPMENT.adoc[DEVELOPMENT].\n\n== Support\n\nSupport is provided on an as-available basis via\nhttps://github.com/ritzyed/ritzy/issues[GitHub issues].\n\nContact mailto:raman@vivosys.com[raman@vivosys.com] @\nhttp://vivosys.com[VIVO Systems] for paid support or enhancements.\n","funding_links":[],"categories":["Uncategorized","UI Components","Demos","\u003csummary\u003eUI Components\u003c/summary\u003e","JavaScript","Rich-text editors using contenteditable"],"sub_categories":["Uncategorized","Form Components"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fritzyed%2Fritzy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fritzyed%2Fritzy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fritzyed%2Fritzy/lists"}