I think the combination of these "ideals" makes a lot of sense. If you want the combination of a web app but with native-like performance, you kind of get to many items on the list automatically.<p>The web app we're building now is kind of like an IDE (but for tasks/planning, <a href="https://thymer.com" rel="nofollow">https://thymer.com</a>), and obviously waiting for round-trips in an editor is no good. We thought we'd just do "some optimistic rendering" but in the end found out that the combination of many of these "ideals" is actually really powerful:<p>If every millisecond counts when rendering, you want some sort of optimistic rendering and you can't wait for round-trips. Because of that it makes sense to have all data available locally, and have the client sync back changes when there's time. CRDTs are great for this, and then multiplayer support is kind of easy too. And now that you have data locally available anyway, you might as well cache it in IndexedDB, so it works offline too. And because now you want features to work offline (e.g. search), you need to do them on the client anyway, which means you can also have end-to-end-encryption.<p>With techniques like CRDTs becoming more popular, and web APIs becoming more stable (like for local storage, offline workers and built-in crypto), we'll probably see a lot more true "local-first" web apps. It's obviously not all perfect on the web yet though. Support for PWAs is still really limited, IndexedDB is quite a mess (slow, clunky API, and and too many different policies with regards to what gets deleted when by the browser), but it's getting much easier.