<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: kevinjahns</title><link>https://news.ycombinator.com/user?id=kevinjahns</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 27 Apr 2026 18:14:06 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=kevinjahns" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by kevinjahns in "Any Open Source projects in need of documentation writer?"]]></title><description><![CDATA[
<p>docs.yjs.dev<p>I'm currently working on a major rewrite and it would be great to start off with great documentation!<p>It might be interesting to explain new concepts in the field of collaborative editing (e.g. how to attribute content).<p>Feel free to pm me at: hi@kevinjahns.de</p>
]]></description><pubDate>Fri, 10 Apr 2026 02:06:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47712750</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47712750</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47712750</guid></item><item><title><![CDATA[New comment by kevinjahns in "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"]]></title><description><![CDATA[
<p>Yjs is about making things easy. It is a good abstraction to make anything collaborative (not everyone can implement something like prosemirror-collab).<p>I'd take the slight performance overhead any day if I get guaranteed syncs. Network protocols are not as reliable as you think they are. Detecting random drops of messages is hard. At scale, you are going to appreciate the sync guarantees.<p>prosemirror-collab doesn't give you offline editing either. Because, guess what - if there is no central server you can't edit the same doc from multiple tabs.<p>I once had a customer that accidentally deleted part of their database containing Yjs docs. Few of his users noticed, because their docs synced through y-indexeddb.<p>And it's fun. You can Yjs on anything. There is a company that syncs Ydocs through QR codes.<p>As a generic collab library, it does a very good job. CRDTs really are a fun thing to use. A lot of people feel that way.<p>If you want to use something else, that's totally fine! Write an article about how great prosemirror-collab is.</p>
]]></description><pubDate>Wed, 18 Mar 2026 19:32:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47430369</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47430369</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47430369</guid></item><item><title><![CDATA[New comment by kevinjahns in "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"]]></title><description><![CDATA[
<p>This is not a fundamental issue. Node splitting can be represented in CRDTs. It's just really hard to map correctly to ProseMirror as the merge logic is complex and bound to a schema.<p>I don't blame you for ProseMirror for being how it is. I'm just offering my feedback for your next editor library.</p>
]]></description><pubDate>Wed, 18 Mar 2026 10:48:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47423967</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47423967</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47423967</guid></item><item><title><![CDATA[New comment by kevinjahns in "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"]]></title><description><![CDATA[
<p>I believe that node-splitting in y-prosemirror can be solved.<p>But I hope that you also can appreciate that mapping prosemirror to a CRDT structure is a very complex thing to do. Your schema implementation and node-splitting behaviors are extremely hard to map to existing conflict resolution libraries.<p>Other editors, like Quill, map better to CRDT structures.<p>This is, of course, not your problem. But if you - or any editor author for that matter - ever end up creating another editor library, I'd love to work with you on adaptability to existing conflict resolution libraries. There is a lot to gain from being compatible to the wider ecosystem.<p>After all, we shouldn't expect our users to set up a tailor made backend for each single collaborative component.<p>Encrypted editing apps like Proton Mail Docs wouldn't be possible with your solution.</p>
]]></description><pubDate>Tue, 17 Mar 2026 21:44:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=47418745</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47418745</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47418745</guid></item><item><title><![CDATA[New comment by kevinjahns in "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"]]></title><description><![CDATA[
<p>You misunderstand how the "document replacement" in y-prosemirror works. It's like arguing that React is bad because it performs a complete document replacement on every change. The diffing part makes it fast.<p>That said, it's not without problems - I acknowledge that. But it's not as bad as you make it sound. You didn't list one concrete case when you had issues with it.<p>I'm very happy that Nick and I finally found funding to make a rewrite happen. It really did take 6 years to make this happen, because it's hard to find funding for open source projects.</p>
]]></description><pubDate>Tue, 17 Mar 2026 13:55:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47412750</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47412750</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47412750</guid></item><item><title><![CDATA[New comment by kevinjahns in "Lies I was told about collaborative editing, Part 2: Why we don't use Yjs"]]></title><description><![CDATA[
<p>Hi, the author of Yjs here. Thanks, Nick, for chiming in!<p>As this article is blowing up now, I want to address a few points.<p>I, too, feel the need for simplicity over overly complex solutions - and I found it in CRDTs. They beautifully allow me to reason about conflicts - so that my users don't have to. Very few people can design a custom conflict resolution algorithm for an application. Yjs is a general-purpose framework that enables you to make EVERYTHING collaborative. That's the goal.<p>It's fine if you want to explore different solutions. I don't understand the need to put down one framework in favor of another. It doesn't have to be "OT vs CRDT". Hey, if you found something that works for you - great! But let me tell you that neither solution magically makes everything simpler. There is still a lot to learn.<p>Different solutions to conflict resolution have different tradeoffs. It's unfortunate that the author of the article attributes all complexity to Yjs. It's just that collaborative editing is a very complex problem and requires a lot of attention to detail. In many regards, Yjs has done very well for the larger ecosystem. In other regards there is room for improvement.<p>The only thing I acknowledge from the article is the criticism about y-prosemirror "replacing the whole document". Unfortunately, the author extrapolated some false assumptions. This is not a performance issue. y-prosemirror runs at 60 fps even on large documents. It's like arguing React is slow because it replaces the whole document with every edit. We leverage ProseMirror's behavior to do identity checks on the nodes before updating the DOM. However, it's true that this breaks positions for some plugins (e.g. a comment plugin).<p>Instead of Prosemirror positions, we encourage plugins to use Yjs-based positions, which are more accurate in case of conflicts. Marijn talks about this as well [1]. The collab implementation in Prosemirror does not guarantee that positions always converge. That means, comments could end up in different places for different collaborators. This works in most cases, but in some it doesn't - which is one of the reasons why I prefer CRDTs as a framework to think about conflicts.<p>But as Nick said, we are currently working on a new y-prosemirror binding that works better with existing plugins.<p>I'm curious about the section "CRDTs are much, much harder to debug" which ironically talks about how hard prosemirror-collab is to debug. You won't find any such bugs in Yjs. The conflict-resolution algorithm is quite simple and has been battle tested. Before every release, Yjs undergoes extensive fuzz testing for hours in simulated scenarios. I'm very happy to show anyone how to debug a CRDT. It requires some background information, but it ultimately is easier.<p>To address another unfounded claim by the author: I bet OP $1000 that the GC algorithm in Yjs is correct even in offline-editing scenarios. He won't be able to reproduce the issues he is talking about.<p>[1]: <a href="https://marijnhaverbeke.nl/blog/collaborative-editing-cm.html" rel="nofollow">https://marijnhaverbeke.nl/blog/collaborative-editing-cm.htm...</a></p>
]]></description><pubDate>Tue, 17 Mar 2026 11:29:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47411237</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=47411237</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47411237</guid></item><item><title><![CDATA[New comment by kevinjahns in "CRDT Benchmarks"]]></title><description><![CDATA[
<p>Author of Yjs here. I'm all for faster data structures. But only benchmarking one dimension looks quite fishy to me. A CRDT needs to be adequate at multiple dimensions. At least you should describe the tradeoffs in your article.<p>The time to insert characters is the least interesting property of a CRDT. It doesn't matter to the user whether a character is inserted within .1ms or .000000001ms. No human can type that fast.<p>It would be much more interesting to benchmark the time it takes to load a document containing X operations. Yjs & Yrs are pretty performant and conservative on memory here because they don't have to build an index (it's a tradeoff that we took consciously).<p>When benchmarking it is important to measure the right things and interpret the results somehow so that you can give recommendations when to use your algorithm / implementation. Some things can't be fast/low enough (e.g. time to load a document, time to apply updates, memory consumption, ..) other things only need to be adequate (e.g. time to insert a character into a document).<p>Unfortunately, a lot of academic papers set a bad trend of only measuring one dimension. Yeah, it's really easy to succeed in one dimension (e.g. memory or insertion-time) and it is very nice click-bait. But that doesn't make your CRDT a viable option in practice.<p>I maintain a set of benchmarks that tests multiple dimensions [1]. I'd love to receive a PR from you.<p>[1]: <a href="https://github.com/dmonad/crdt-benchmarks">https://github.com/dmonad/crdt-benchmarks</a></p>
]]></description><pubDate>Tue, 23 May 2023 17:15:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=36047481</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=36047481</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36047481</guid></item><item><title><![CDATA[Evernote enables real-time collaborative editing (using CRDTs)]]></title><description><![CDATA[
<p>Article URL: <a href="https://evernote.com/blog/evernote-pricing-upcoming-features-update/">https://evernote.com/blog/evernote-pricing-upcoming-features-update/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=35902557">https://news.ycombinator.com/item?id=35902557</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 11 May 2023 14:25:42 +0000</pubDate><link>https://evernote.com/blog/evernote-pricing-upcoming-features-update/</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=35902557</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35902557</guid></item><item><title><![CDATA[New comment by kevinjahns in "Funding decentralised/local-first applications for GNOME"]]></title><description><![CDATA[
<p>Work with us! The y-collective [1] is building the foundational technologies for local-first, collaborative applications based on CRDTs.<p>[1]: <a href="https://opencollective.com/y-collective" rel="nofollow">https://opencollective.com/y-collective</a></p>
]]></description><pubDate>Sat, 23 Apr 2022 12:29:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=31133698</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=31133698</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31133698</guid></item><item><title><![CDATA[New comment by kevinjahns in "Conflict-Free Replicated Data Types (CRDT)"]]></title><description><![CDATA[
<p>It's interesting to me that people still doubt that CRDTs can be used in practice. The fact is that they are already being used in practice by many companies with millions of users for applications like rich-text editing and state management in 3d applications. See <a href="https://github.com/yjs/yjs#who-is-using-yjs" rel="nofollow">https://github.com/yjs/yjs#who-is-using-yjs</a><p>In fact, Yjs - a CRDT implementation- is the most downloaded solution for collaborative applications. Even more than ShareDB (the most popular OT-based solution).<p>Yjs ~90k/week - <a href="https://www.npmjs.com/package/yjs" rel="nofollow">https://www.npmjs.com/package/yjs</a><p>ShareDB ~13k/week - <a href="https://www.npmjs.com/package/yjs" rel="nofollow">https://www.npmjs.com/package/yjs</a></p>
]]></description><pubDate>Mon, 11 Apr 2022 12:54:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=30988003</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=30988003</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30988003</guid></item><item><title><![CDATA[New comment by kevinjahns in "Show HN: Matrix-CRDT – real-time collaborative apps using Matrix as backend"]]></title><description><![CDATA[
<p>Instead of building another shared-editing solution specialized for Matrix, there could be an API that can be used to store and distribute real-time updates efficiently (probably in the Matrix DAG).<p>The matrix-crdt works really well. To reduce overloading the Matrix server with many small messages (each single keystroke produces an update message), it stores merged updates in the DAG after a short debounce. The optional WebRTC extension allows you to distribute messages immediately "of the chain", so you don't notice the debounce.<p>After a time the message-log gets pretty huge. So in matrix-crdt, a random client will eventually store a "snapshots" of the current state in the DAG and removes old entries. This way, new clients don't need to download the huge message-log.<p>It would be nice if there was a possibility to create a server-component that does the merging.<p>(Btw, all credit to the above approach goes to Yousef)<p>Now, there might be a better solution to store CRDT data in the Matrix DAG - the developers probably know best and might be able to expose some hidden API that would make everything even more efficient.<p>I'm just asking that instead of creating yet another CRDT and integrating it into Matrix, open up this space, provide better APIs, and let others integrate their CRDTs.<p>> Would it be able to abstract any of the underlying CRDT logic?<p>Modern shared-editing frameworks don't require you to think about internal logic. They just set some requirements on the ordering of update messages. CRDTs in particular don't care in which order you transmit data, which makes them a very interesting choice in practice.</p>
]]></description><pubDate>Tue, 18 Jan 2022 19:48:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=29984708</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29984708</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29984708</guid></item><item><title><![CDATA[New comment by kevinjahns in "Show HN: Matrix-CRDT – real-time collaborative apps using Matrix as backend"]]></title><description><![CDATA[
<p>What I dislike about these attempts is that you will just end up with yet another CRDT implementation that is incompatible with the existing ecosystem (editors, drawing apps, state management, ...).<p>Instead, I want to encourage you to build an API that others can use to 
efficiently store shared data. Feel free to ping me if you need input.<p>- Kevin (Author of Yjs)</p>
]]></description><pubDate>Tue, 18 Jan 2022 17:26:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=29982457</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29982457</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29982457</guid></item><item><title><![CDATA[New comment by kevinjahns in "Show HN: Matrix-CRDT – real-time collaborative apps using Matrix as backend"]]></title><description><![CDATA[
<p>I can only answer to the last question. Yjs uses several performance optimizations to produce small documents (both in memory and in the encoded state). Since humans type relatively slow (<60 actions per minute), it is impossible for humans to create a document that has performance problems. I showed this in [1].<p>Relm [2] even models a 3d world using Yjs. I don't necessarily recommend doing this as 3d applications usually produce a lot more actions per minute than text applications. This required some workarounds and deep knowledge of how Yjs' optimizations work. But it's definitely possible.<p>[1]: <a href="https://blog.kevinjahns.de/are-crdts-suitable-for-shared-editing/" rel="nofollow">https://blog.kevinjahns.de/are-crdts-suitable-for-shared-edi...</a>
[2]: <a href="https://www.relm.us/" rel="nofollow">https://www.relm.us/</a></p>
]]></description><pubDate>Tue, 18 Jan 2022 15:53:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=29980963</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29980963</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29980963</guid></item><item><title><![CDATA[New comment by kevinjahns in "A state syncing framework based on Vuex and rollback netcode"]]></title><description><![CDATA[
<p>This looks similar to SyncedStore which was posted just yesterday: 
<a href="https://news.ycombinator.com/item?id=29483913" rel="nofollow">https://news.ycombinator.com/item?id=29483913</a></p>
]]></description><pubDate>Thu, 09 Dec 2021 13:23:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=29497028</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29497028</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29497028</guid></item><item><title><![CDATA[New comment by kevinjahns in "Show HN: SyncedStore CRDT – build multiplayer collaborative apps for React / Vue"]]></title><description><![CDATA[
<p>Yjs author here. On network failure, the client will automatically reconnect and synchronize with the backend. And yes, you can get an event that notifies you about the current connection status. When syncing with the server, you will only exchange the differences that were created while offline.</p>
]]></description><pubDate>Wed, 08 Dec 2021 17:52:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=29487993</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29487993</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29487993</guid></item><item><title><![CDATA[New comment by kevinjahns in "Show HN: SyncedStore CRDT – build multiplayer collaborative apps for React / Vue"]]></title><description><![CDATA[
<p>Yjs author here. Yjs ships a flexible selective undo-redo manager. You can define one (or several) undo managers that listen to changes that you want to be able to undo&redo.<p><a href="https://docs.yjs.dev/api/undo-manager" rel="nofollow">https://docs.yjs.dev/api/undo-manager</a></p>
]]></description><pubDate>Wed, 08 Dec 2021 17:49:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=29487940</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=29487940</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29487940</guid></item><item><title><![CDATA[New comment by kevinjahns in "Faster CRDTs: An Adventure in Optimization"]]></title><description><![CDATA[
<p>I know that it is hard to comprehend why modern CRDT implementations are fast. But the data confirms that they work great. OT seems to be much simpler, but there are real advantages in using CRDTs. The performance problems have been solved through an efficient representation of the CRDT model.<p>The gist of the below [1] read is that it is impossible for a human to create a document that Yjs can't handle (even in the worst case scenario). But yes, it handles real-world scenarios particularily well.<p>The concept of "hidden classes" is super old. It has first been implemented in a fork of smalltalk and then became foundational concept of runtime engines for scripting languages. It is implemented in V8, python, ruby, spidermonkey, ..<p>Yjs does not assume a "real-world scenario" and it is not optimized for any specific runtime engine. It runs fast in any browser. The benchmarks confirm this. [2]<p>Yjs is being used in practice by several companies (eg Nimbus Notes with >3 million users) for quite some time now. I'm not aware of any performance problems.<p>[1]: <a href="https://blog.kevinjahns.de/are-crdts-suitable-for-shared-editing/" rel="nofollow">https://blog.kevinjahns.de/are-crdts-suitable-for-shared-edi...</a>
[2]: <a href="https://github.com/dmonad/crdt-benchmarks" rel="nofollow">https://github.com/dmonad/crdt-benchmarks</a></p>
]]></description><pubDate>Sat, 31 Jul 2021 17:32:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=28020079</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=28020079</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28020079</guid></item><item><title><![CDATA[How we made Jupyter Notebooks collaborative with Yjs]]></title><description><![CDATA[
<p>Article URL: <a href="https://blog.jupyter.org/how-we-made-jupyter-notebooks-collaborative-with-yjs-b8dff6a9d8af">https://blog.jupyter.org/how-we-made-jupyter-notebooks-collaborative-with-yjs-b8dff6a9d8af</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=27475175">https://news.ycombinator.com/item?id=27475175</a></p>
<p>Points: 8</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 11 Jun 2021 16:13:50 +0000</pubDate><link>https://blog.jupyter.org/how-we-made-jupyter-notebooks-collaborative-with-yjs-b8dff6a9d8af</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=27475175</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=27475175</guid></item><item><title><![CDATA[New comment by kevinjahns in "Web Applications from the Future: A Database in the Browser"]]></title><description><![CDATA[
<p>Yjs is exactly that. It is a simple abstraction for building any kind of collaborative application. It has ready to use solutions for most problems related to this problem space. The selective UndoManager, for example, is generic&configurable and can be reused for all kinds of stuff. It supports many different editors. It supports many different (scalable) backends.<p>It is much more than state synchronization.<p>If there is anything missing, then let's work on it. Yjs is extensible and allows for custom features that others can reuse.</p>
]]></description><pubDate>Fri, 11 Jun 2021 09:22:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=27471011</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=27471011</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=27471011</guid></item><item><title><![CDATA[New comment by kevinjahns in "Local-First Software:You Own Your Data, in Spite of the Cloud (2019) [pdf]"]]></title><description><![CDATA[
<p>Neither of them says that. The xi CRDT was not about shared editing. The second paper just says that CRDTs are not superior per se. But CRDTs are being used in production for text editing and they are performant if implemented correctly (even in js).<p>The following article shows that:<p><a href="https://news.ycombinator.com/item?id=24176455" rel="nofollow">https://news.ycombinator.com/item?id=24176455</a></p>
]]></description><pubDate>Tue, 09 Mar 2021 02:18:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=26394631</link><dc:creator>kevinjahns</dc:creator><comments>https://news.ycombinator.com/item?id=26394631</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26394631</guid></item></channel></rss>