<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: jdvh</title><link>https://news.ycombinator.com/user?id=jdvh</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 16 May 2026 17:42:34 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jdvh" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jdvh in "Lessons learned from building a sync-engine and reactivity system with SQLite"]]></title><description><![CDATA[
<p>We've spend the last couple of years building a local-first end-to-end encrypted multiplayer notes app (Thymer). We also explored running sqlite in the browser but ultimately concluded that we didn't really sqlite or a real database at all in the browser.<p>What does a document system need? A few simple indexes that track links and backlinks, mentions, and hashtags. You’re broadcasting change notifications anyway (for reactive DOM updates), so updating the indexes for those manually isn’t much extra work. You apply updates eagerly and then notify other users so they can apply the same updates, with some rules to guarantee that all users end up with the same state regardless of the order in which they receive the updates. But a relational database doesn’t help with any of this. Document systems tend to be versioned, so every user action turns into another entry in a transaction log. Even queries like “last Monday’s version of my document” don’t map naturally to SQL. You can query for transactions in a given time period, but unless you have snapshots, you’re still forced to re-apply transactions all the way from t=0 if you want to re-create the document state at a given date.</p>
]]></description><pubDate>Sun, 17 Aug 2025 12:49:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=44931223</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=44931223</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44931223</guid></item><item><title><![CDATA[New comment by jdvh in "Tell HN: Notion Desktop is monitoring your audio and network"]]></title><description><![CDATA[
<p>Hey thanks for mentioning us!<p>With Thymer we really care about performance, but Thymer is also end-to-end encrypted because we don't want to compromise on privacy. And it's real-time collaborative and offline first.<p>Thymer has optional self-hosting. Then you can upgrade (or not) at your own leisure, or intentionally stick to an older version you like better. Enshittification is a big problem in our industry. We've all been burned by it -- we certainly have -- and being able to opt out of a "new and improved!" version is a real feature.<p>Thymer will also be very extensible. Today we launched our plugin SDK: <a href="https://thymer.com/plugins" rel="nofollow">https://thymer.com/plugins</a> and <a href="https://github.com/thymerapp/thymer-plugin-sdk/">https://github.com/thymerapp/thymer-plugin-sdk/</a> with a bunch of examples. With Thymer you will be able to "vibe code" the very simple plugins and with VSCode/Cursor you can make more complex plugins with hot-reload.</p>
]]></description><pubDate>Thu, 17 Jul 2025 19:55:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=44597472</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=44597472</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44597472</guid></item><item><title><![CDATA[New comment by jdvh in "First-Class Models: The Missing Productivity Revolution"]]></title><description><![CDATA[
<p>In theory you can have these "zero cost abstractions" but in practice I don't think so. The user manual gets thicker. Concepts like 'delete permanently' and backup/restore get more complicated. Users will get confronted by scary "advanced users only" warnings in the interface. Some enthusiast blogger or youtuber will create content highlighting those advanced features and then regular users will get themselves in trouble. Customer support gets way more complicated because you always have to consider the possibility that the user has (unknowingly) used these advanced features. If you put buttons in the interface users will press those buttons. That's just a fact of life. Advanced features always come at a cost. Sometimes that cost is worth it, but only sometimes.</p>
]]></description><pubDate>Wed, 02 Jul 2025 10:07:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=44441881</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=44441881</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44441881</guid></item><item><title><![CDATA[New comment by jdvh in "First-Class Models: The Missing Productivity Revolution"]]></title><description><![CDATA[
<p>Rule of thumb: every 10% increase in complexity cuts your potential user base in half.<p>This is why people make backups by copy-pasting files. This is why Excel is so dominant. This is why systems like hypercard and git are not mainstream and never will be.<p>There is a large universe of tools people would love if only they would bother to learn how they worked. If only. Most people will just stick to whatever tools they know.<p>For most people the ability to go back and forward in time (linear history) is something they grasp immediately. Being able to go back in time and make a copy also requires no explanation. But having a version tree, forking and merging, having to deal multiple timelines and the graphs that represent them -- that's where you lose people.</p>
]]></description><pubDate>Tue, 01 Jul 2025 14:35:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=44434301</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=44434301</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44434301</guid></item><item><title><![CDATA[New comment by jdvh in "Sync Engines Are the Future"]]></title><description><![CDATA[
<p>You're free to argue that this isn't "pure" CRDT, but the CRDT algorithm still runs normally, just a bit later than it otherwise would.</p>
]]></description><pubDate>Fri, 21 Mar 2025 16:44:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=43437900</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43437900</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43437900</guid></item><item><title><![CDATA[New comment by jdvh in "Sync Engines Are the Future"]]></title><description><![CDATA[
<p>I don't think that's required, unless you definitionally believe otherwise.<p>When clients disagree about the the order of events and a conflict results then clients can be required to roll back (apply the inverse of each change) to the last point in time where all clients were in agreement about the world state. Then, all clients re-apply all changes in the new now-agreed-upon order. Now all changes have been applied and there is agreement about the world state and the process starts anew.<p>This way multiple clients can work offline for extended periods of time and then reconcile with other clients.</p>
]]></description><pubDate>Fri, 21 Mar 2025 15:04:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=43436548</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43436548</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43436548</guid></item><item><title><![CDATA[New comment by jdvh in "Sync Engines Are the Future"]]></title><description><![CDATA[
<p>It's still early, but we have a checkpointing system that works very well for us. And once you have checkpoints you can start dropping inconsequential transactions in between checkpoints, which you're right, can be considered GC. However, checkpointing is desirable anyway otherwise new users have to replay the transaction log from T=0 when they join, and that's impractical.</p>
]]></description><pubDate>Fri, 21 Mar 2025 14:04:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43435847</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43435847</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43435847</guid></item><item><title><![CDATA[New comment by jdvh in "Sync Engines Are the Future"]]></title><description><![CDATA[
<p>As long as all clients agree on the order of CRDT operations then cycles are no problem. It's just an invalid transaction that can be dropped. Invalid or contradictory updates can always happen (regardless of sync mechanism) and the resolution is a UX issue. In some cases you might want to inform the user, in other cases the user can choose how to resolve the conflict, in other cases quiet failure is fine.</p>
]]></description><pubDate>Fri, 21 Mar 2025 13:59:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=43435796</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43435796</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43435796</guid></item><item><title><![CDATA[New comment by jdvh in "Sync Engines Are the Future"]]></title><description><![CDATA[
<p>Completely decentralized is cool, but I think there are two key problems with it.<p>1) in a decentralized system who is responsible for backups? What happens when you restore from a backup?<p>2) in a decentralized system who sends push notifications and syncs with mobile devices?<p>I think that in an age of $5/mo cloud vms and free SSL having a single coordination server has all the advantages and none of the downsides.</p>
]]></description><pubDate>Fri, 21 Mar 2025 13:34:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=43435500</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43435500</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43435500</guid></item><item><title><![CDATA[New comment by jdvh in "Local-First and Ejectable"]]></title><description><![CDATA[
<p>You can think of ejectable as the opposite of being locked-in.</p>
]]></description><pubDate>Sun, 16 Mar 2025 20:19:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=43381917</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43381917</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43381917</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>1. Planned, but our first focus is the web app (plus desktop Electron)<p>2. Yes. We have a bunch of default views like table, kanban, photo gallery, and calendar. You can also create your own views with a JS plugin, like this silly example of spinning globe view: <a href="https://x.com/wcools/status/1898828593255346287" rel="nofollow">https://x.com/wcools/status/1898828593255346287</a><p>3. Our aim is a full feature todo app. But we won't have every feature on day 1.</p>
]]></description><pubDate>Sun, 16 Mar 2025 15:31:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379812</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379812</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>In exchange for perpetual development and maintenance costs. Total cost of ownership doesn't go down by rolling your own in-house.</p>
]]></description><pubDate>Sun, 16 Mar 2025 15:25:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379767</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379767</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379767</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>Absolutely. There is no phone-home of any kind.</p>
]]></description><pubDate>Sun, 16 Mar 2025 14:56:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379538</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379538</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379538</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>I think the main problem is lock-in. If you can't get your data out you can't leave. This is true for open source and for commercial products alike.<p>If you own your data and if you have the option to self-host you can always opt out of updates you don't like.</p>
]]></description><pubDate>Sun, 16 Mar 2025 14:50:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379491</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379491</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379491</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>Certainly not. I don't believe progress is always good. But subsidies should be reserved for ambitious projects that push the state of the art forward. For those projects that realistically will not get funded commercially. CERN, for instance.</p>
]]></description><pubDate>Sun, 16 Mar 2025 14:42:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379433</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379433</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379433</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>Because when innovative software isn't made inside the EU then Europeans will simply use the best products made elsewhere.</p>
]]></description><pubDate>Sun, 16 Mar 2025 14:39:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379419</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379419</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379419</guid></item><item><title><![CDATA[New comment by jdvh in "Docs – Open source alternative to Notion or Outline"]]></title><description><![CDATA[
<p>In the short term a free open source govt alternative may be a net positive for society. I don't think it is in the long run. Government projects like these are not likely to really push the state-of-the-art forward. This project even advertises itself as a FOSS Notion alternative. Do government-sponsored clones encourage or stymie innovation? I think the latter.<p>Every week we read in the news that the EU struggles with entrepreneurship. That our tech industry is languishing. That the EU gets out-competed by the US on software and by China on everything else. Europe should be making industry-leading apps. Europe should produce software startups that make products that get used worldwide. EU subsidized clones of popular American products feels like admitting defeat.<p>I'm obviously biased because I'm also working on a product in this space. But if Notion developers must become farmers because innovation no longer pays that is a loss to the world in my book.</p>
]]></description><pubDate>Sun, 16 Mar 2025 14:19:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=43379258</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=43379258</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43379258</guid></item><item><title><![CDATA[New comment by jdvh in "Faster CRDTs (2021)"]]></title><description><![CDATA[
<p>Thymer[1] uses CRDTs for everything. It's an IDE for tasks and planning. It's a multiplayer app, end-to-end encrypted and offline first, optionally self-hosted, and an entire workspace is a single graph. So CRDTs were the logical choice.<p>All operations in Thymer get reduced to a handful of CRDT transformations. It doesn't matter whether you are moving or copying text, changing "frontmatter" attributes, dragging cards, uploading files, or adding tags. It's all done with the same handful of CRDT operations. Although this was a lot of extra work up front (we're not using any libraries) the benefits make it totally worth it. When your application state is a single graph you can move text between pages, link between pages (with backlinks), have transclusions, and do all sorts of cool stuff without having to worry about synchronization. CRDTs guarantee that all clients converge to the same state. And because CRDTs are by their nature append-only you get point-in-time versioning for free! We did end up having to make a couple of compromises for performance, though. Version history is not available offline (too much data) and in some cases we resort to last-writer-wins conflict resolution. On balance I think CRDTs are very much worth it, especially if you design an app with CRDTs in mind from day one. I probably wouldn't use CRDTs if I had to retrofit multiplayer in a more conventional AJAX app. Mutations in CRDTs are first applied optimistically, and then when the authoritative sequence of events is determined all clients need to revert their state to the last shared state and then re-apply all events in the correct order (thereby guaranteeing that all clients end up in the same state). Sometimes your app might need to revert and re-apply days worth of changes if you've been offline for a while. This all happens behind the scenes and the user doesn't know how many tree transformations are happening in the background but I guess my point is that CRDTs affect the design of the entire application. Most apps that are popular today were designed back when CRDT transformations were not yet well understood.<p>[1] <a href="https://thymer.com" rel="nofollow">https://thymer.com</a> (almost ready for beta)</p>
]]></description><pubDate>Tue, 27 Aug 2024 23:34:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=41374429</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=41374429</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41374429</guid></item><item><title><![CDATA[New comment by jdvh in "Local First, Forever"]]></title><description><![CDATA[
<p>Both "everything in the cloud" and "everything local" have their obvious technical advantages, and I think they are mostly well understood. What really drives the swing of the pendulum are the business incentives.<p>Is the goal to sell mainframes? Then tell customers than thin clients powered by a mainframe allow for easy collaboration, centralized backups and administration, and lower total cost of ownership.<p>Do you want recurring SaaS revenue? Then tell customers that they don't want the hassle of maintaining a complicated server architecture, that security updates mean servers need constant maintenance, and that integrating with many 3rd party SaaS apps makes cloud hosting the logical choice.<p>We're currently working on an Local First (and E2EE) app that syncs with CRDTs. The server has been reduced to a single go executable that more or less broadcasts the mutation messages to the different clients when they come online. The tech is very cool and it's what we think makes the most sense for the user. But what we've also realized is that by architecting our software like this we have torpedoed our business model. Nobody is going to pay $25 per user per seat per month when it's obvious that the app runs locally and not that much is happening on the server side.<p>Local First, Forever is good for the user. Open data formats are good for the user. Being able to self-host is good for the user. But I suspect it will be very difficult to make software like this profitably. Adobe's stock went 20x after they adopted a per seat subscription model. This Local First trend, if it is here to stay (and I hope it will be) might destroy a lot of SaaS business models.</p>
]]></description><pubDate>Tue, 25 Jun 2024 11:26:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=40787115</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=40787115</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40787115</guid></item><item><title><![CDATA[New comment by jdvh in "Reconstructing Obsidian Features in Vim and Bash"]]></title><description><![CDATA[
<p>Thymer has real-time multiplayer with CRDT based synchronization. With org-mode you can collaborate, but you'd have to DIY with git or something similar. Thymer is also end-to-end encrypted. With org-mode you'd have to self-host something to sync with your phone.<p>Org-mode is text based, Thymer has a document graph. Advantages of the graph approach is you can nest as much as you want and zoom in on any part of the graph. You can transclude sections and have references and backlinks. With text based approaches you have to sprinkle location identifiers (guids or relative paths typically) into your document so you can track the location as files gets edited. But guids are awkward and paths can result in broken (back)links. We built Thymer as a document graph from the ground up. Tree mutations don't break (back)links.<p>With Thymer every node in the graph has metadata. Who last edited it? When? Where did it move from? Previous versions? For text paragraphs this isn't super useful, but when you have tasks this metadata is very useful.<p>org-mode on a phone? I'm sure there are apps for that, but I think it's designed with a keyboard in mind. Thymer uses the (subjectively) more modern command palette approach where you don't have to remember as many shortcuts, and it also translates more easily to touchscreen devices.</p>
]]></description><pubDate>Tue, 06 Jun 2023 22:17:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=36219823</link><dc:creator>jdvh</dc:creator><comments>https://news.ycombinator.com/item?id=36219823</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36219823</guid></item></channel></rss>