<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2023-01-09T21:57:31&#43;01:00</updated>
  <generator>https://nostr.ae</generator>

  <title>Nostr notes by Doug Hoyte</title>
  <author>
    <name>Doug Hoyte</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://nostr.ae/npub1yxprsscnjw2e6myxz73mmzvnqw5kvzd5ffjya9ecjypc5l0gvgksh8qud4.rss" />
  <link href="https://nostr.ae/npub1yxprsscnjw2e6myxz73mmzvnqw5kvzd5ffjya9ecjypc5l0gvgksh8qud4" />
  <id>https://nostr.ae/npub1yxprsscnjw2e6myxz73mmzvnqw5kvzd5ffjya9ecjypc5l0gvgksh8qud4</id>
  <icon></icon>
  <logo></logo>




  <entry>
    <id>https://nostr.ae/nevent1qqs9ezwukq4sr62wcx7jtz7tt3pumtswdyg4hryrfm0qyk3gnppj7ngzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6pps5fh</id>
    
      <title type="html">I&amp;#39;m still thinking about how to approach this. It&amp;#39;s more ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs9ezwukq4sr62wcx7jtz7tt3pumtswdyg4hryrfm0qyk3gnppj7ngzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6pps5fh" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8mmnclutqat60cs47v96tukhwyjlhjcxjdxq2z5m670zzguwjxtq046ekh&#39;&gt;nevent1q…6ekh&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I&amp;#39;m still thinking about how to approach this. It&amp;#39;s more difficult than the write policy because it has significant performance implications in the read-path.&lt;br/&gt;&lt;br/&gt;But now that we have the foundation of support for AUTH, we&amp;#39;ll probably come up with something useable soon.&lt;br/&gt;&lt;br/&gt;What is your use-case? Restricting DMs to only be read by their recipient? Something else?
    </content>
    <updated>2026-03-25T15:03:03&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsq24rt8ht4tvuc9pjxyde4fdatjv55gh853gpv9tnhrn8y9ahp87qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60nqne3</id>
    
      <title type="html">strfry has been invited to participate in the Summer of Bitcoin! ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsq24rt8ht4tvuc9pjxyde4fdatjv55gh853gpv9tnhrn8y9ahp87qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60nqne3" />
    <content type="html">
      strfry has been invited to participate in the Summer of Bitcoin!&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://www.summerofbitcoin.org/&#34;&gt;https://www.summerofbitcoin.org/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Anyone have any project ideas for a student to work on during the summer?
    </content>
    <updated>2026-03-25T14:26:22&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsp6re36afapee6cea5g0600xkj778my9gdunfe69lvjf45ntrs7sqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z699y0ez</id>
    
      <title type="html">Correct, yes, it should be the relay URL that external users use. ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsp6re36afapee6cea5g0600xkj778my9gdunfe69lvjf45ntrs7sqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z699y0ez" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqq822drxt07zmqspl75xkl0caat6lv9keex0jjynk8qferw85xsxt4m9l&#39;&gt;nevent1q…4m9l&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Correct, yes, it should be the relay URL that external users use. I believe no trailing slash.&lt;br/&gt;&lt;br/&gt;We should probably normalise the URL so it accepts both, I added a ticket for this: &lt;a href=&#34;https://github.com/hoytech/strfry/issues/182&#34;&gt;https://github.com/hoytech/strfry/issues/182&lt;/a&gt;
    </content>
    <updated>2026-03-24T20:31:14&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs89s3tpnva6axkpfhaawgu8slnrlhvmseknyg2wnvc76uq3fq5hxqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jnaen4</id>
    
      <title type="html">Great! Let me know if you hit any issues. Note that AUTH will ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs89s3tpnva6axkpfhaawgu8slnrlhvmseknyg2wnvc76uq3fq5hxqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jnaen4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsy844azhads5zugkkxdch49k6dwxzyma86nhe52sldtjlr0vw4drqlvmavf&#39;&gt;nevent1q…mavf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Great! Let me know if you hit any issues.&lt;br/&gt;&lt;br/&gt;Note that AUTH will currently only be triggered if you try to send a protected event to the relay. We&amp;#39;re trying to decide on the best way to extend this functionality (any comments/suggestions welcome).
    </content>
    <updated>2026-03-24T18:54:22&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2waus342g5t8m5ch9jrgdhg7qckqr4erfvl9vdm9wd6q2l5s3zegzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z67xgnkw</id>
    
      <title type="html">I think I found it. This note right? ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2waus342g5t8m5ch9jrgdhg7qckqr4erfvl9vdm9wd6q2l5s3zegzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z67xgnkw" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9rzzcutru78h6c8pv708cjwl0ylqpfnqs2qnxknsrxc627tkq7kqfhak26&#39;&gt;nevent1q…ak26&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I think I found it. This note right? note1wdacf6vhfxf5j2ff2ds2xkvq73en4dgx5ghw0s2z436c6fghgvmqacxgp3&lt;br/&gt;&lt;br/&gt;&amp;gt; Hah, always worth going again at least once with bug audits — another 9 were found.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; 1. **Negentropy DoS (HIGH)** — RelayNegentropy.cpp:208,250 — `filters.at(0)` throws `out_of_range` if a client sends a filter with all-empty arrays (e.g. `{&amp;#34;ids&amp;#34;:[]}`) which causes `NostrFilterGroup` to pop the filter, leaving `filters` empty, and the uncaught exception kills the negentropy thread.&lt;br/&gt;&amp;gt;&lt;br/&gt;&amp;gt; ---&lt;br/&gt;&amp;gt; *Edited by Claude Opus 4.6*&lt;br/&gt;&lt;br/&gt;Were you able to reproduce this report? The analysis doesn&amp;#39;t sound correct to me. This line isn&amp;#39;t accessing `ids` (for example), it&amp;#39;s accessing the first filter of the *filter group*, of which there is verified to be one when the filter is parsed at ingestion time.&lt;br/&gt;&lt;br/&gt;In my testing, both of these are handled correctly:&lt;br/&gt;&lt;br/&gt;    $ echo &amp;#39;[&amp;#34;NEG-OPEN&amp;#34;,&amp;#34;N&amp;#34;,{&amp;#34;ids&amp;#34;:[]},&amp;#34;6100000200&amp;#34;]&amp;#39; | websocat -n ws://127.0.0.1:7777&lt;br/&gt;    [&amp;#34;NEG-MSG&amp;#34;,&amp;#34;N&amp;#34;,&amp;#34;6100000200&amp;#34;]&lt;br/&gt;&lt;br/&gt;    $ echo &amp;#39;[&amp;#34;NEG-OPEN&amp;#34;,&amp;#34;N&amp;#34;,[],&amp;#34;6100000200&amp;#34;]&amp;#39; | websocat -n ws://127.0.0.1:7777&lt;br/&gt;    [&amp;#34;NOTICE&amp;#34;,&amp;#34;ERROR: negentropy error: too small&amp;#34;]&lt;br/&gt;&lt;br/&gt;I&amp;#39;m happy to investigate further if you have more details and/or a test case.
    </content>
    <updated>2026-03-19T20:44:52&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsynxff8znwrrdtacujkw5wenl0lneaujmznqzdvqxt7xm3qh4jgugzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6h4elf2</id>
    
      <title type="html">This is the first I&amp;#39;m hearing of it. Can you please point me ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsynxff8znwrrdtacujkw5wenl0lneaujmznqzdvqxt7xm3qh4jgugzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6h4elf2" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9rzzcutru78h6c8pv708cjwl0ylqpfnqs2qnxknsrxc627tkq7kqfhak26&#39;&gt;nevent1q…ak26&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This is the first I&amp;#39;m hearing of it. Can you please point me to any more details? I don&amp;#39;t see anything related to negentropy in the commits you referenced.
    </content>
    <updated>2026-03-19T18:43:52&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsff4a3ansvwmpdvj62lelrk46r3t6ys67294vwtlfx3grscu2y4fszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z697nlqn</id>
    
      <title type="html">strfry 1.1.0 release There are a lot of changes in this release. ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsff4a3ansvwmpdvj62lelrk46r3t6ys67294vwtlfx3grscu2y4fszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z697nlqn" />
    <content type="html">
      strfry 1.1.0 release&lt;br/&gt;&lt;br/&gt;There are a lot of changes in this release. Some highlights:&lt;br/&gt;&lt;br/&gt;* Preliminary support for AUTH (NIP-42)&lt;br/&gt;* Support for COUNT requests (NIP-45)&lt;br/&gt;* Prometheus monitoring end-point&lt;br/&gt;* REQ filter validation: restrict which filters your relay will service&lt;br/&gt;* Configure your relay.info with npubs instead of 32-byte hex (optional)&lt;br/&gt;* Timeout-support for plugins to detect and recover from plugin hangs/crashes&lt;br/&gt;* Deletion of parameterised replaceable events now follows NIP-09&lt;br/&gt;* upload/download convenience commands to transfer notes to/from remote relays&lt;br/&gt;* Improved error messages for both external users and admins&lt;br/&gt;* Many small bugfixes and convenience features&lt;br/&gt;&lt;br/&gt;See here for the full list: &lt;a href=&#34;https://github.com/hoytech/strfry/blob/master/CHANGES&#34;&gt;https://github.com/hoytech/strfry/blob/master/CHANGES&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Thank you to everyone who contributed!&lt;br/&gt;&lt;br/&gt;There are no backwards-incompatible DB changes, so it should be a drop-in replacement for the 1.0.0 series. However, we always recommend backing up your DB first just in case.&lt;br/&gt;&lt;br/&gt;One thing to note: We are deprecating the `strfry stream` command. `strfry router` does everything stream did and much more.
    </content>
    <updated>2026-03-19T15:29:58&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsyw9rxm9u7px0tm4g68crt4eq3wwqul9ecnjcammyl4auhvtvfr7gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6u7uae9</id>
    
      <title type="html">I believe they are working as per spec, but please let me know if ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsyw9rxm9u7px0tm4g68crt4eq3wwqul9ecnjcammyl4auhvtvfr7gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6u7uae9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxaa2xk9hadfym4xg6ksmu7j9nse4u9mmjt0txz072cs6538tehgqrt6sy5&#39;&gt;nevent1q…6sy5&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I believe they are working as per spec, but please let me know if not.&lt;br/&gt;&lt;br/&gt;The beta-series finally implements the deletion of parameterised replaceable events with a-tags: &lt;a href=&#34;https://github.com/hoytech/strfry/issues/168&#34;&gt;https://github.com/hoytech/strfry/issues/168&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Is there anything in particular you&amp;#39;re wondering about?
    </content>
    <updated>2026-03-15T23:35:10&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs03h7cnueyt0efxv67zhvwqggdqgknm8d6z8ejtdav6x6kdhxghcszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6s6xmxr</id>
    
      <title type="html">Yes! It&amp;#39;s already in the beta series. I&amp;#39;ll write this up ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs03h7cnueyt0efxv67zhvwqggdqgknm8d6z8ejtdav6x6kdhxghcszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6s6xmxr" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvualua4alc749dt4pngetekccd65wy8x9snm7mavfnnexx0rxf6sxzhk8k&#39;&gt;nevent1q…hk8k&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yes! It&amp;#39;s already in the beta series. I&amp;#39;ll write this up in a bit more detail soon.&lt;br/&gt;&lt;br/&gt;Note that the AUTH is a bit limited, and mostly is used to restrict the writing of protected events (NIP-70). Using AUTH for restricting which notes can be read is not currently implemented. We&amp;#39;re still trying to figure out the best approach for this.
    </content>
    <updated>2026-03-15T23:33:21&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0gtc7hxchp0fg52c38xgkdydhhhpggfmg88w7wu7f6shvm5nr9qszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69e9498</id>
    
      <title type="html">You&amp;#39;re welcome! Let me know if there&amp;#39;s anything you&amp;#39;d ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0gtc7hxchp0fg52c38xgkdydhhhpggfmg88w7wu7f6shvm5nr9qszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69e9498" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsre8vaxmwmd7sxz9ygq46um4crevyhuxy6kxfsaa5j3pmhn6zj4mcaw7lec&#39;&gt;nevent1q…7lec&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;You&amp;#39;re welcome! Let me know if there&amp;#39;s anything you&amp;#39;d like me to implement.
    </content>
    <updated>2026-03-15T23:31:28&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8yc2wp0rd2pxehw9mh5865uwxc45zay09hy9rn55w4upesaa8ujczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6xndd5n</id>
    
      <title type="html">Thanks, good to be back!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8yc2wp0rd2pxehw9mh5865uwxc45zay09hy9rn55w4upesaa8ujczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6xndd5n" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsq85ps8vhqmvs58mz0xxq6ju7mhs5mszt68yy6fygaxq4tn8vyycqd37epk&#39;&gt;nevent1q…7epk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks, good to be back!
    </content>
    <updated>2026-03-15T23:30:49&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqspqekzel8ex5vj0fyfws6wfs858cgphfjsesd47223r22kd3puu7qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6smzmmr</id>
    
      <title type="html">strfry 1.1.0 beta series: I&amp;#39;m working on a new release of ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqspqekzel8ex5vj0fyfws6wfs858cgphfjsesd47223r22kd3puu7qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6smzmmr" />
    <content type="html">
      strfry 1.1.0 beta series:&lt;br/&gt;&lt;br/&gt;I&amp;#39;m working on a new release of strfry and there are some beta releases tagged in case anyone wants to give them a try. There are lots of changes in the queue. I&amp;#39;ll write them up in more detail soon.&lt;br/&gt;&lt;br/&gt;For now here&amp;#39;s a small new feature in 1.1.0-beta4: --range option for sync. Basically it&amp;#39;s a convenience feature for specifying since/until in your filter. Examples:&lt;br/&gt;&lt;br/&gt;strfry sync wss://blah.com --range 1h-&lt;br/&gt;&lt;br/&gt;^^ sync just last hour of notes&lt;br/&gt;&lt;br/&gt;strfry sync wss://blah.com --filter &amp;#39;{&amp;#34;kinds&amp;#34;:[0]}&amp;#39; --range 1Y-6M&lt;br/&gt;&lt;br/&gt;^^ sync kind 0 events between 1Y and 6M old&lt;br/&gt;&lt;br/&gt;This is especially useful for &amp;#34;paginating&amp;#34; big syncs. You can first do 2M-1M, then do 3M-2M, then 4M-3M, etc.
    </content>
    <updated>2026-03-15T15:33:10&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2lre37ew0e0mtsdjfa0yc7etuyg684ejtps9cectuhyz2vh3lhzszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ghhwq6</id>
    
      <title type="html">Thank you! LMK if you have any feature requests! I&amp;#39;m going to ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2lre37ew0e0mtsdjfa0yc7etuyg684ejtps9cectuhyz2vh3lhzszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ghhwq6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0cqgacfkpgf5947tlyafps7vuaelrxxfdzlu5cwv6gufqnhwkc8c04lhsz&#39;&gt;nevent1q…lhsz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thank you! LMK if you have any feature requests!&lt;br/&gt;&lt;br/&gt;I&amp;#39;m going to be rolling out support for custom feeds soon and a few other neat things, like support for long-form notes.
    </content>
    <updated>2025-01-03T19:37:15&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsd9g8hnq3fd8xvt3d80p6nlp4pf2jgugc4dd26ca6439sgndh77uczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6f8ddel</id>
    
      <title type="html">I&amp;#39;m in, please bridge me. You are doing great work Alex, ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsd9g8hnq3fd8xvt3d80p6nlp4pf2jgugc4dd26ca6439sgndh77uczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6f8ddel" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszm28c5yll6afd6rj3uhxgclyxnv8mrp9ac4eh4pvp63fumc6xccsf889ua&#39;&gt;nevent1q…89ua&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I&amp;#39;m in, please bridge me. You are doing great work Alex, thank you!
    </content>
    <updated>2024-12-29T06:45:05&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqspmraxsvv2a784nan0vwryud4m98fy44lf3s8p02c66wnvz9vgkdczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z63epsu7</id>
    
      <title type="html">Here&amp;#39;s the video of it in action, it&amp;#39;s awesome! ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqspmraxsvv2a784nan0vwryud4m98fy44lf3s8p02c66wnvz9vgkdczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z63epsu7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfvc3rlzph2s96znms8eqrdh5uhgpfrk3yjh9z36wrpedd6lt6y0cnhfxrq&#39;&gt;nevent1q…fxrq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Here&amp;#39;s the video of it in action, it&amp;#39;s awesome!&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=rN7HYXmgxzk&#34;&gt;https://www.youtube.com/watch?v=rN7HYXmgxzk&lt;/a&gt;
    </content>
    <updated>2024-12-24T18:49:57&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsq5ecg76enyhksqcy9je33xv0sv38seqdf83vejz9k7l6t5emc7dgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jur6z6</id>
    
      <title type="html">It depends on what you want to print. For me, I did FDM printing ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsq5ecg76enyhksqcy9je33xv0sv38seqdf83vejz9k7l6t5emc7dgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jur6z6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2t3a04g3utf9auwqaksatsywdg27ecxlqrmafkttwnh40lmwml7q0dumel&#39;&gt;nevent1q…umel&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It depends on what you want to print. For me, I did FDM printing (the regular &amp;#34;melt plastic filament using a motorised hot end&amp;#34;) for years and was never totally happy with the results or the process. Calibrating and maintaining the machines is a ton of work (some more than others of course). There&amp;#39;s always a compromise between speed and quality, and even with the slowest/best settings you&amp;#39;re always going to have visible layer lines and other small defects.&lt;br/&gt;&lt;br/&gt;Last year I bought a resin printer (Elegoo Saturn 3 Ultra) and this has completely changed the hobby for me:&lt;br/&gt;&lt;br/&gt;* Almost no maintenance. Once you&amp;#39;ve got it setup it pretty much just works. There are some exceptions naturally, but in general they need a lot less babysitting than FDM machines.&lt;br/&gt;* Quality is incredible.  The detail can be absolutely stunning -- way beyond what even the best FDMs are capable of. I&amp;#39;ve printed stuff for people and they literally did not believe me that I printed them (&amp;#39;you just ordered this on Amazon bro, this is clearly injection molded&amp;#39;).&lt;br/&gt;* Much better options for materials. There&amp;#39;s somewhat more variety of resins than there are filaments, plus you can mix them: Want a red tinted plastic with a bit of flex to it that glows in the dark? No problem, just needs some experimentation with the proportions.&lt;br/&gt;* Speed. If you&amp;#39;re just printing one thing then FDM is probably faster (though the Saturn 3 Ultra can actually go quite fast). BUT resin printers really shine when you&amp;#39;re printing lots of things at the same time. Once you have your model perfected, suppose you want to print 10 copies. With an FDM printer that&amp;#39;s roughly 10x the time. For resin, assuming you can fit all of them on the bed, it takes the same time as printing 1, since each layer has a constant exposure time.&lt;br/&gt;&lt;br/&gt;There are some downsides to resin though:&lt;br/&gt;&lt;br/&gt;* You need to buy and store extra devices, like washing and curing stations.&lt;br/&gt;* My garage is now filled with dangerous chemicals and I had to install a ventilation system to expel toxic fumes (how toxic they are is actually debatable, but I&amp;#39;m playing it safe).&lt;br/&gt;* I have to periodically drive to a sketchy Chinese warehouse to buy 99% pure isopropyl alcohol in bulk. And getting rid of the waste is complicated/annoying. Look into your options for chemical disposal. Don&amp;#39;t even bother trying the water washable resins, you&amp;#39;ll just go alcohol eventually.&lt;br/&gt;&lt;br/&gt;Anyway, I had fun with FDM for years but at this point I&amp;#39;m much much happier with resin printing. Everyone&amp;#39;s situation and goals are going to be different, I just wanted to give you my perspective. You&amp;#39;ll have a blast with whatever you choose. Good luck!
    </content>
    <updated>2024-12-24T16:32:23&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsw7jrj6m3xqgv8s77jw7458ack6zcggqderqzucuzu34zejjzg44czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tuppkn</id>
    
      <title type="html">This is one thing I really wish you could do in C&#43;&#43;. noexcept ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsw7jrj6m3xqgv8s77jw7458ack6zcggqderqzucuzu34zejjzg44czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tuppkn" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswl32djjjdvc2vxrmpn5h4vc036c38ns07fwsnp7kks7wvwy6tdtq2vn8ej&#39;&gt;nevent1q…n8ej&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This is one thing I really wish you could do in C&#43;&#43;. noexcept is... not this.
    </content>
    <updated>2024-12-23T19:18:47&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0d7f3pnp8g4208vsmew59zkwascxw4n7h5nacn340j4mvfx8a29szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6dhykaj</id>
    
      <title type="html">Should I block AI web crawlers on Oddbean? On oddbean.com I see a ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0d7f3pnp8g4208vsmew59zkwascxw4n7h5nacn340j4mvfx8a29szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6dhykaj" />
    <content type="html">
      Should I block AI web crawlers on Oddbean?&lt;br/&gt;&lt;br/&gt;On oddbean.com I see a *lot* of web crawling traffic from AI bots like GPTBot hoovering up nostr notes presumably for training purposes. I guess it&amp;#39;s probably one of the easiest nostr sites to crawl since everything is rendered as plain HTML and they don&amp;#39;t need to execute JS code to query relays.&lt;br/&gt;&lt;br/&gt;To avoid wasting bandwidth I decided to use the following method to soft-block them (honour-system robots.txt): &lt;a href=&#34;https://coryd.dev/posts/2024/go-ahead-and-block-ai-web-crawlers&#34;&gt;https://coryd.dev/posts/2024/go-ahead-and-block-ai-web-crawlers&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;You could argue they&amp;#39;re just wasting my resources and won&amp;#39;t bring any visitors or benefit the nostr community in any way. On the other hand, I guess they can/will access this data in some other way, and maybe the world-at-large gets some modicum of benefit from better AI models (?).&lt;br/&gt;&lt;br/&gt;Thoughts? #asknostr
    </content>
    <updated>2024-12-23T19:16:24&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsg3f6n0p9emlxjww7ptns4ucy72d2rp76wvk20sdcz5jnpydu385czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6qlzqwj</id>
    
      <title type="html">Hey sorry just saw this. Yep like fiatjaf said, these are the ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsg3f6n0p9emlxjww7ptns4ucy72d2rp76wvk20sdcz5jnpydu385czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6qlzqwj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8kyyyze69c37y0mmqudxgue8wwhkejatt9azzys3vrh7cefct7hg5sf29y&#39;&gt;nevent1q…f29y&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hey sorry just saw this. Yep like fiatjaf said, these are the index definitions:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/strfry/blob/master/golpe.yaml#L24-L47&#34;&gt;https://github.com/hoytech/strfry/blob/master/golpe.yaml#L24-L47&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Just below is the indexPrelude, which is the code that actually populates those indices.&lt;br/&gt;&lt;br/&gt;The querying is most in the DBQuery file here: &lt;a href=&#34;https://github.com/hoytech/strfry/blob/master/src/DBQuery.h&#34;&gt;https://github.com/hoytech/strfry/blob/master/src/DBQuery.h&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;But it&amp;#39;s not really well document or obvious. In general, there are some rough heuristics about which index to use, and then does a scan of that, only loading the actual event data if needed (sometimes it can satisfy the query with index-only). Here are some basic docs in the README:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/strfry?tab=readme-ov-file#database&#34;&gt;https://github.com/hoytech/strfry?tab=readme-ov-file#database&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Happy to try to answer any specific questions if you have them.
    </content>
    <updated>2024-12-22T22:32:13&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqstmlasmlmc8qujh4jvap9ls99d8w5guzm2wyth5203yvjvkwv75gszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6nc376n</id>
    
      <title type="html">&amp;gt; sig-chains - you know if you&amp;#39;re missing content in PZP ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqstmlasmlmc8qujh4jvap9ls99d8w5guzm2wyth5203yvjvkwv75gszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6nc376n" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqq3hjk09pc3hsx8n3tu70nvjzvs4g7gdcg6umt9q3j5ck70umq2cahen&#39;&gt;nevent1q…ahen&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&amp;gt; sig-chains - you know if you&amp;#39;re missing content in PZP&lt;br/&gt;&lt;br/&gt;You could do the same on nostr if anybody actually cared about this. Just include a &amp;#34;prev&amp;#34; tag with the ID of the previous message in the chain you&amp;#39;re building. You could also have a &amp;#34;last&amp;#34; tag or something to indicate the chain is complete. Clients could render it as &amp;#34;message 3/9&amp;#34; or whatever, like people do manually on Twitter.&lt;br/&gt;&lt;br/&gt;In fact, PZP&amp;#39;s replication appears to *rely* on these hash chains, since it uses hash graph replication: &lt;a href=&#34;https://codeberg.org/pzp/pzp-sync&#34;&gt;https://codeberg.org/pzp/pzp-sync&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I did some analysis of this sync method and if you tried to use it for non-linked data you can easily cause it to degrade into a worst-case behaviour: &lt;a href=&#34;https://github.com/hoytech/automerge-poison&#34;&gt;https://github.com/hoytech/automerge-poison&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;IMO RBSR/negentropy is better, one of the reasons being you can sync arbitrary collections of (unlinked) data, for example all kind 0 notes, or all notes with a certain hash tag.
    </content>
    <updated>2024-12-22T18:50:18&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgn64g50qd374glmufznwnehgmdwgd3w5u02377rs0qnuxh0j377qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z62xd6dy</id>
    
      <title type="html">Yep looks like the same approach to me.</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgn64g50qd374glmufznwnehgmdwgd3w5u02377rs0qnuxh0j377qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z62xd6dy" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszmt7ccaxrhltx8z0kwp3u5ldqlvwv85yyk7f3n227x5ugfclelvc986tse&#39;&gt;nevent1q…6tse&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yep looks like the same approach to me.
    </content>
    <updated>2024-12-20T20:44:48&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0pndnzt5ug4dmmupa2u4pxwx2gjugyq6wtrgqrln0p92dsm3gqjqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rfpvur</id>
    
      <title type="html">&amp;gt; It might help you find a better alternative by searching for ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0pndnzt5ug4dmmupa2u4pxwx2gjugyq6wtrgqrln0p92dsm3gqjqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rfpvur" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrwh9u9grdpueyxycwmzq7dsmfr4qqatmgghwjlv3twgvr7q8grpqx8s8qw&#39;&gt;nevent1q…s8qw&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&amp;gt; It might help you find a better alternative by searching for his recommendation for C/C&#43;&#43; projects needing to do this&lt;br/&gt;&lt;br/&gt;Thanks, I will look into this. Go has much better Unicode support than C&#43;&#43;, which basically doesn&amp;#39;t have it at all, or rather, you need to pull in a library to do even basic things. This is why I&amp;#39;m doing the hack I mentioned above: I don&amp;#39;t want to add a dependency on a library like ICU (also it is very efficient).&lt;br/&gt;&lt;br/&gt;OTOH, Perl has outstanding Unicode support. If you don&amp;#39;t care about byte length, then you can simply pick out the first 100 grapheme clusters with a regexp like this: /^\X{0,100}/. This will handle the segmentation according the the TR-29 rules.&lt;br/&gt;&lt;br/&gt;Although you&amp;#39;re probably right for this use-case, in my experience byte-length limits are quite common and you have to deal with them somehow, ideally without causing weird artifacts. For example in nostr you have byte-size limits on note length, tag values, etc. Another tricky aspect is that theoretically grapheme clusters are unbounded in length. So a single &amp;#34;character&amp;#34; could take up gigabytes of encoded space -- worth keeping in mind due to the DoS risk.
    </content>
    <updated>2024-12-20T20:18:47&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2kvpnahfd8us3qn5vuf57la6pq50v89hwj3gpynftz6570mulegqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z690v425</id>
    
      <title type="html">Is there an easy way to truncate to a max byte-length using the ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2kvpnahfd8us3qn5vuf57la6pq50v89hwj3gpynftz6570mulegqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z690v425" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9qqxmyrgqjpq52ujje8ag23hlaunmul3wveqxwl98agw49np0apg3720mt&#39;&gt;nevent1q…20mt&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Is there an easy way to truncate to a max byte-length using the Go standard library? This is the best answer I could find (after only 1 minute of searching though):&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://stackoverflow.com/questions/46415894/golang-truncate-strings-with-special-characters-without-corrupting-data/76502408#76502408&#34;&gt;https://stackoverflow.com/questions/46415894/golang-truncate-strings-with-special-characters-without-corrupting-data/76502408#76502408&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Note that as the answer says, this doesn&amp;#39;t understand grapheme clusters, meaning that café can become cafe (depending on normalisation form). Also it involves another pass over the data which, if already known to be UTF-8, is redundant.&lt;br/&gt;&lt;br/&gt;This 3rd party package looks to be the rough equivalent of my Perl module: &lt;a href=&#34;https://github.com/rivo/uniseg&#34;&gt;https://github.com/rivo/uniseg&lt;/a&gt;
    </content>
    <updated>2024-12-20T19:13:07&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0lj5s6tx5t5kdjtt47q8jamaq3296wsj2ptdaxqkxp6j5nvgld5szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z690ejs9</id>
    
      <title type="html">Truncating text is complicated. Today I spent some time fixing ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0lj5s6tx5t5kdjtt47q8jamaq3296wsj2ptdaxqkxp6j5nvgld5szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z690ejs9" />
    <content type="html">
      Truncating text is complicated.&lt;br/&gt;&lt;br/&gt;Today I spent some time fixing some bugs on oddbean.com that I&amp;#39;ve been putting off for a while. Most just involved some uninteresting grunt work, but there&amp;#39;s one that is a huge rabbit hole and, if you&amp;#39;ve never thought about it before you may be surprised at how deep it goes.&lt;br/&gt;&lt;br/&gt;On Oddbean, we only show the first ~100 characters of a nostr note and then cut it off (&amp;#34;truncate&amp;#34; it). This is all well and good, except some titles got an unexpected weird character at the end:&lt;br/&gt;&lt;br/&gt;    Nostr Advent Calendar 2024 の 11 日目の記事を書きました。 2024年のNostrリレ�…&lt;br/&gt;&lt;br/&gt;Now, I&amp;#39;m no expert on Japanese script but I&amp;#39;m pretty sure that diamond question mark character is not supposed to be there. What gives?&lt;br/&gt;&lt;br/&gt;The answer is that almost all text on the web is encoded in UTF-8, which is a multi-byte Unicode encoding. That means that these Japanese characters actually take up 3 bytes, unlike Latin letters which take up 1. Oddbean was taking the first 100 bytes and cutting it off there. Unfortunately, that left an incomplete UTF-8 encoded code point which the browser replaces with a special replacement character (U&#43;FFFD, the diamond question mark).&lt;br/&gt;&lt;br/&gt;OK, easy fix right? Just do substr() on the code-points (not the UTF-8 encoding). Sure, but that is quite inefficient, requiring a pass over the data. Fortunately there is a more efficient way to fix this that relies on the fact that UTF-8 is a self-synchronising code, meaning you can always find nearest code point boundaries no matter where in the string you jump to. So that is what I did:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/strfry/blob/863edcff17834af5f51654b546e34de965382756/src/apps/web/WebUtils.h#L120-L127&#34;&gt;https://github.com/hoytech/strfry/blob/863edcff17834af5f51654b546e34de965382756/src/apps/web/WebUtils.h#L120-L127&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Problem solved right? Well, that depends on your definition of &amp;#34;solved&amp;#34;. Notice above I&amp;#39;ve been referring to &amp;#34;code points&amp;#34; instead of characters? In many languages such as English we can pretty much get away with considering these the same. However in other scripts this is not the case.&lt;br/&gt;&lt;br/&gt;Sometimes what we think of as a character can actually require multiple code-points. For example, the character &amp;#39;â&amp;#39; can be represented as &amp;#39;a&amp;#39; followed by a special &amp;#39; ̂&amp;#39; combining character. Most common characters such as â *also* have dedicated code-points, and which representation is used depends on the Unicode Normal Form. You may also have seen country flags represented by two composite characters, or emoji alterations such as skin tone -- it&amp;#39;s the same principle. Cutting in between such characters will cause truncation artifacts.&lt;br/&gt;&lt;br/&gt;So rather than &amp;#34;character&amp;#34; (which is an imprecise notion), Unicode refers to Extended Grapheme Clusters, which correspond as closely as possible with what we think of as individual atoms of text. You can read more than you ever wanted to know about this here: &lt;a href=&#34;https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries&#34;&gt;https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Note that many langauges need special consideration when cutting on graphemes (or indeed words, lines etc). Especially Korean Hangul script is interesting, having been designed rather than evolved like most writing systems -- in fact it&amp;#39;s quite elegant!&lt;br/&gt;&lt;br/&gt;So my hack for Oddbean doesn&amp;#39;t do all this fancy grapheme truncation, and that&amp;#39;s because I know if I tried I would end up in a seriously deep rabbit hole. I know because I have and I did! 10 years ago I published the following Perl module: &lt;a href=&#34;https://metacpan.org/pod/Unicode::Truncate&#34;&gt;https://metacpan.org/pod/Unicode::Truncate&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I&amp;#39;m pretty proud of this yak shave, because of the implementation. I was able to adapt the regular expressions from Unicode TR29, compose them with a UTF-8 regular expression, and compile it all with the Ragel state machine compiler ( &lt;a href=&#34;https://www.colm.net/open-source/ragel/&#34;&gt;https://www.colm.net/open-source/ragel/&lt;/a&gt; ). As a result, it can both validate UTF-8 and (correctly!) truncate in a single-pass.&lt;br/&gt;&lt;br/&gt;If you want (a lot) more Unicode trivia, I also made a presentation on this topic: &lt;a href=&#34;https://hoytech.github.io/truncate-presentation/&#34;&gt;https://hoytech.github.io/truncate-presentation/&lt;/a&gt;
    </content>
    <updated>2024-12-20T08:32:55&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgg3nv2wqkprx72mvtkz6pwehd9nne65x5y4fd7vtr0zs5s8aksuczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ju56z2</id>
    
      <title type="html">Yeah this was a pretty interesting article. Reminds me how deep ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgg3nv2wqkprx72mvtkz6pwehd9nne65x5y4fd7vtr0zs5s8aksuczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ju56z2" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswmfj9tz7c8w8uxaqqvdjk0ccz63zd3ah4xdvyygptnl9va527rysrk9eaz&#39;&gt;nevent1q…9eaz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yeah this was a pretty interesting article. Reminds me how deep the hash-table rabbit hole can go!
    </content>
    <updated>2024-12-16T05:28:57&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs0y74t7uu6uxm6c8zvmqltass8lwjd7qj62543v76csecj6wgugugzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69cn3ah</id>
    
      <title type="html">If I had more time to play around with radios I&amp;#39;d snap this ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs0y74t7uu6uxm6c8zvmqltass8lwjd7qj62543v76csecj6wgugugzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69cn3ah" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw6eruj7l4h7pf9yp4q965glwc9x47x4gaaj6yjrkjxhakyjrhwss4sxmrs&#39;&gt;nevent1q…xmrs&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;If I had more time to play around with radios I&amp;#39;d snap this up.&lt;br/&gt;&lt;br/&gt;25W output, built-in FT-8, open source, reasonable price.
    </content>
    <updated>2024-12-11T04:40:46&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs9y5dlj834vdukkn0uz4skq8jtmtpanxhkda9w73f7stahcnamdqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6znpnd4</id>
    
      <title type="html">Interesting perspective. We could debate what decentralised ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs9y5dlj834vdukkn0uz4skq8jtmtpanxhkda9w73f7stahcnamdqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6znpnd4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgk4c59xjhk053h72gz9tgmssugyr0ccu5m70vsw07pv696mel7yqs656sz&#39;&gt;nevent1q…56sz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Interesting perspective. We could debate what decentralised means, but I doubt we&amp;#39;d ever be able to find a universal definition -- it is too much of a spectrum. If your definition of decentralised is that there are no servers at all, then I guess you&amp;#39;d think only purely P2P protocols are, and not even nostr would qualify. From a total purity perspective, probably anything using DNS would be disqualified too.&lt;br/&gt;&lt;br/&gt;My view on these protocols is as follows:&lt;br/&gt;&lt;br/&gt;Usenet has essentially the same model as nostr. Yes, there are servers (relays), but people are free to choose which ones they use. They can post their messages to any of them, and those messages may get propagated to other servers. Each server can have its own message acceptance/forwarding policies, and choose which other servers to connect with.&lt;br/&gt;&lt;br/&gt;IRC is also a decentralised network (the R stands for relay). An IRC network consists of many different servers relaying messages. Each server agrees roughly with the rules of the wider network, but is generally free to administer its server as it sees fit (including user bans, preventing relaying certain channels, etc). Sometimes server operators disagree, and this results in them leaving the network and establishing their own. That&amp;#39;s why there are many different IRC networks, EFnet, IRCnet, DALnet, etc.&lt;br/&gt;&lt;br/&gt;HTTP and email are both decentralised in the sense that you don&amp;#39;t need to get anybody&amp;#39;s permission to connect to the network, and there are no single points of failure.
    </content>
    <updated>2024-09-25T20:33:33&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqswt9xla2fhqrdm3txzede06upt6kuqdl927s2cqupt9y06fuchd8gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6q3syc9</id>
    
      <title type="html">&amp;gt; is there a historical business model, or models, that we ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqswt9xla2fhqrdm3txzede06upt6kuqdl927s2cqupt9y06fuchd8gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6q3syc9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstkmh9xplc25vy05dsm20qqxry9v9nxzxc7pew4hs6f7wmz77w6gg23euqe&#39;&gt;nevent1q…euqe&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&amp;gt; is there a historical business model, or models, that we could mimic?&lt;br/&gt;&lt;br/&gt;Good question! Usenet and IRC were often hosted by ISPs, which users paid for indirectly with their internet subscriptions. People also paid for access to Usenet. DejaNews was a popular archive/provider service before it was bought by Google. On IRC people pay for service providers to keep them constantly connected (bouncers) and provide vanity DNS names. Also, people pay to run bots like Eggdrop to manage/moderate their channels.&lt;br/&gt;&lt;br/&gt;For email and HTTP there are the obvious hosting and other service providers, but I suppose the biggest value they support is the things built on top of them, which is maybe fitting for a general-purpose protocol.
    </content>
    <updated>2024-09-25T20:15:49&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszq47dgyfsaszxhx4yz63lhnz65eeldhmeztgsau27cevvp9s7unqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6f5mhtk</id>
    
      <title type="html">nostr has no global source of truth, and that is a good thing Out ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszq47dgyfsaszxhx4yz63lhnz65eeldhmeztgsau27cevvp9s7unqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6f5mhtk" />
    <content type="html">
      nostr has no global source of truth, and that is a good thing&lt;br/&gt;&lt;br/&gt;Out of interest, I follow the progress of a lot of other projects similar to nostr, and a couple links surfaced today:&lt;br/&gt;&lt;br/&gt;BlueSky has a big &amp;#34;firehose&amp;#34; connection that streams all updates (new posts, reactions, etc) to subscribers. Unsurprisingly, this is difficult to process except on beefy servers with lots of bandwidth. So, one proposed solution is to strip out all that pesky cryptography (signatures, merkle tree data, etc): &lt;a href=&#34;https://jazco.dev/2024/09/24/jetstream/&#34;&gt;https://jazco.dev/2024/09/24/jetstream/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;And over on Farcaster, keeping their hubs in sync is too difficult, so they want to make all posts globally sequenced, like a blockchain. The details are still being worked out, but I think it&amp;#39;s safe to assume there will be a privileged global sequencer who decides on this ordering (and possibly which posts are included at all): &lt;a href=&#34;https://github.com/farcasterxyz/protocol/discussions/193&#34;&gt;https://github.com/farcasterxyz/protocol/discussions/193&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;In my opinion, both of these issues are symptoms of an underlying errant philosophy. These projects both want there to be a global source of truth: A single place you can go to guarantee you&amp;#39;re seeing all the posts on a thread, from a particular user, etc. On BlueSky that is &lt;a href=&#34;https://bluesky.app&#34;&gt;https://bluesky.app&lt;/a&gt; and on Farcaster that is &lt;a href=&#34;https://warpcast.com&#34;&gt;https://warpcast.com&lt;/a&gt; .&lt;br/&gt;&lt;br/&gt;Advocates of each of these projects of course would dispute this, pointing out that you could always self-host, or somehow avoid depending on their semi-official infrastructure, but the truth is that if you&amp;#39;re not on bluesky.app or warpcast.com, you don&amp;#39;t exist, and nobody cares that you don&amp;#39;t exist.&lt;br/&gt;&lt;br/&gt;nostr has eschewed the concept of global source of truth. You can&amp;#39;t necessarily be sure you are seeing everything. Conversations may sometimes get fragmented, posts may disappear, and there may be the occasional bout of confusion and chaos. There is no official or semi-official nostr website, app, or relay, and this is a good thing. It means we are actually building a decentralised protocol, not just acting out decentralisation theatre, or pretending we&amp;#39;ll get there eventually and that the ends justify the means.&lt;br/&gt;&lt;br/&gt;Back when computers were primitive and professional data-centres didn&amp;#39;t exist, it was impossible to build mega-apps like Twitter. Protocols had to be decentralised by default -- there was simply no other way. We can learn a lot by looking back to protocols of yesteryear, like Usenet and IRC, and still-popular protocols like email and HTTP. None of these assume global sources of truth, and they are stronger and better for it, as is nostr.
    </content>
    <updated>2024-09-24T20:45:11&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs89ytycyu5cffc2r2dm2p9eqhhhv0eakvu9kn5mwsm5q2he9dptxczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6netsc7</id>
    
      <title type="html">LMK if there&amp;#39;s any bug on the strfry side and I will look ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs89ytycyu5cffc2r2dm2p9eqhhhv0eakvu9kn5mwsm5q2he9dptxczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6netsc7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2sz6te2tew6epczzyu6zkqfstl954sxjjwap3z5fcvhcudx0tdrge5g06t&#39;&gt;nevent1q…g06t&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;LMK if there&amp;#39;s any bug on the strfry side and I will look into it!
    </content>
    <updated>2024-09-14T15:33:45&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs9qg87nuxr9ce457vgz8xcg8are9spkn96hc9uhgcrxuy03kctghgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6evm2n9</id>
    
      <title type="html">I haven&amp;#39;t heard about any, please drop by the telegram ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs9qg87nuxr9ce457vgz8xcg8are9spkn96hc9uhgcrxuy03kctghgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6evm2n9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg6862vhm095me9tg9aku9mjmcsr5nhgmjftd4nzrz009vj20kwpsyptuth&#39;&gt;nevent1q…tuth&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I haven&amp;#39;t heard about any, please drop by the telegram channel and let us know if you notice any!
    </content>
    <updated>2024-09-14T15:31:59&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2l8z8d0hr0h8de687p55klpa386649urqkkrxgch9cg9l282d4aczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6hlxspm</id>
    
      <title type="html">The answer to this is surprisingly complicated. TLS can ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2l8z8d0hr0h8de687p55klpa386649urqkkrxgch9cg9l282d4aczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6hlxspm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9307ld60jj7h8sqyf73za54jjcvk504ls0vcu3aw8u26jnq6h7uc0lrp3h&#39;&gt;nevent1q…rp3h&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;The answer to this is surprisingly complicated.&lt;br/&gt;&lt;br/&gt;TLS can optionally support compression which would most likely have universally worked for all wss:// connections. However, this was disabled in OpenSSL and other TLS libraries because of a critical information leakage that arises when secret and non-secret information are combined in the same compression context: &lt;a href=&#34;https://blog.qualys.com/product-tech/2012/09/14/crime-information-leakage-attack-against-ssltls&#34;&gt;https://blog.qualys.com/product-tech/2012/09/14/crime-information-leakage-attack-against-ssltls&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;HTTP-level compression does not apply to websockets (since its framing replaces/upgrades the HTTP framing) so instead compression is specified by the websocket RFCs. It is optional, so not all clients support this.&lt;br/&gt;&lt;br/&gt;Websocket compression happens per message, and can use an empty window for each message, or can have a &amp;#34;sliding compression&amp;#34; window where messages are effectively compressed with previous messages. Some implementations will support both of those modes, some only one, and some neither. Even if an implementation supports compression, it may choose not to use it, and/or may use it only for particular messages (and not others). Furthermore, in the websocket compression handshake, bi-directional window sizes need to be negotiated and sometimes windows cannot be negotiated in one or both directions.&lt;br/&gt;&lt;br/&gt;Almost all browser websocket clients support full compression with sliding windows in both directions, and so does strfry. The sliding window has a relatively large memory overhead per connection, so it can optionally be disabled. The compression ratios can be seen in the strfry logs.&lt;br/&gt;&lt;br/&gt;Although strfry &amp;lt;&amp;gt; browser connections are almost always compressed both ways, different clients and relays have different levels of support and often can&amp;#39;t negotiate optimal compression.
    </content>
    <updated>2024-09-14T02:22:34&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsfntyl2gqz8dh30z4mes2qy25j2msw9cre0weclgufdy9z7wl5qjszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ma7unk</id>
    
      <title type="html">Hehe in fact my original attempt at sync in strfry was a protocol ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsfntyl2gqz8dh30z4mes2qy25j2msw9cre0weclgufdy9z7wl5qjszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6ma7unk" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfhu62f5ucgclll0xhe4w8t7r73k4szkk7ml59jcuyalqpzpwjzhsrgvy0q&#39;&gt;nevent1q…vy0q&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hehe in fact my original attempt at sync in strfry was a protocol called &amp;#34;yesstr&amp;#34; using my Quadrable library: &lt;a href=&#34;https://github.com/hoytech/quadrable&#34;&gt;https://github.com/hoytech/quadrable&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;It used binary flatbuffers over websockets. It caused a lot of problems since binary websocket messages require a distinct message type from text ones. Since nothing else in nostr uses these, of client libraries were having trouble integrating with it. Using a structured binary format like CBOR or flatbuffers also means clients would have to pull in a (probably heavy) serialisation library.&lt;br/&gt;&lt;br/&gt;The nice thing about the current approach is that any existing nostr client already must support websocket text messages containing JSON containing hex data.
    </content>
    <updated>2024-09-14T00:30:29&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8wkse4lcxx8g300qzmwjk3092udng4f30hzpfjjd6kjuzfeykh3czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6kd4kxm</id>
    
      <title type="html">&amp;gt; If you’re sending binary, base64 only inflates by 33% ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8wkse4lcxx8g300qzmwjk3092udng4f30hzpfjjd6kjuzfeykh3czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6kd4kxm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsr4uuejxs54ws6dxy77yklg4xkxvlqygnp4uwxqhnru3fac4jsk5gftqjk7&#39;&gt;nevent1q…qjk7&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&amp;gt; If you’re sending binary, base64 only inflates by 33% compared to hex strings’ 100%.&lt;br/&gt;&lt;br/&gt;On purely random data, after compression hex is usually only ~10% bigger than base64. For example:&lt;br/&gt;&lt;br/&gt;    $ head -c 1000000 /dev/urandom &amp;gt; rand&lt;br/&gt;    $ alias hex=&amp;#39;od -A n -t x1 | sed &amp;#34;s/ *//g&amp;#34;&amp;#39;&lt;br/&gt;    $ cat rand |hex|zstd -c|wc -c&lt;br/&gt;    1086970&lt;br/&gt;    $ cat rand |base64|zstd -c|wc -c&lt;br/&gt;    1018226&lt;br/&gt;    $ wcalc 1086970/1018226&lt;br/&gt;     = 1.06751&lt;br/&gt;&lt;br/&gt;So only ~7% bigger in this case. When data is not purely random, hex often compresses *better* than base64. This is because hex preserves patterns on byte boundaries but base64 does not. For example, look at these two strings post-base64:&lt;br/&gt;&lt;br/&gt;    $ echo &amp;#39;hello world&amp;#39; | base64&lt;br/&gt;    aGVsbG8gd29ybGQK&lt;br/&gt;    $ echo &amp;#39; hello world&amp;#39; | base64&lt;br/&gt;    IGhlbGxvIHdvcmxkCg==&lt;br/&gt;&lt;br/&gt;They have nothing in common. Compare to the hex encoded versions:&lt;br/&gt;&lt;br/&gt;    $ echo &amp;#39;hello world&amp;#39; | hex&lt;br/&gt;    68656c6c6f20776f726c640a&lt;br/&gt;    $ echo &amp;#39; hello world&amp;#39; | hex&lt;br/&gt;    2068656c6c6f20776f726c640a&lt;br/&gt;&lt;br/&gt;The pattern is preserved, it is just shifted by 2 characters. This means that if &amp;#34;hello world&amp;#34; appears multiple times in the input, there may be two different patterns for it in Base64, but only one in hex (meaning hex effectively has a 2x larger compression dictionary).&lt;br/&gt;&lt;br/&gt;Since negentropy is mostly (but not entirely) random data like hashes and fingerprints, it&amp;#39;s probably a wash. However, hex is typically faster to encode/decode and furthermore is used for almost all other fields in the nostr protocol, so on the whole seems like the best choice.&lt;br/&gt;&lt;br/&gt;&amp;gt; Personally, I’d prefer to see the message format specified explicitly as debuggable JSON, if feasible.&lt;br/&gt;&lt;br/&gt;This is theoretically possible, but it would be very difficult to interpret/debug it anyway, and it would add a lot of bandwidth/CPU overhead.
    </content>
    <updated>2024-09-13T23:23:19&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxh79s8kqrqp25tsa5cjhslt4zllrs23549cqvk362lrmzykvgtuszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6s6u267</id>
    
      <title type="html">Probably our telegram channel is best currently: ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxh79s8kqrqp25tsa5cjhslt4zllrs23549cqvk362lrmzykvgtuszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6s6u267" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsykkv8jkhyhlkrfn7evkncjp7a63k64pqxj20utdhdgelu5lgmpysjsmdgv&#39;&gt;nevent1q…mdgv&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Probably our telegram channel is best currently: &lt;a href=&#34;https://t.me/strfry_users&#34;&gt;https://t.me/strfry_users&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Hopefully some day we&amp;#39;ll migrate fully to nostr!
    </content>
    <updated>2024-09-13T22:47:52&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqst0djjq5yx6wfpum3hu0wluzxhgfls6c220f2x5yjytn6prhemenszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6v2c0yl</id>
    
      <title type="html">Good question! Right now the implementation is pretty simple, but ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqst0djjq5yx6wfpum3hu0wluzxhgfls6c220f2x5yjytn6prhemenszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6v2c0yl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs28yfuzu3xd57q846z3lcukeqrjnvqje5msmxrkehervtk8d8dn2smsqs6k&#39;&gt;nevent1q…qs6k&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Good question! Right now the implementation is pretty simple, but I think will work well in most cases: It always splits a range into 16 equal-sized ranges unless the range has 32 or fewer IDs, in which case it just sends the whole list of IDs. I think there is probably some low-hanging fruit on tuning that threshold.&lt;br/&gt;&lt;br/&gt;The nice thing is that nothing in the protocol needs to change to tune this. In fact, the protocol theoretically supports dynamic adjustment of those parameters to target a particular point in the latency/bandwidth tradeoff space.&lt;br/&gt;&lt;br/&gt;There are also some other reasons you might want to customise the range selection, which I described here: &lt;a href=&#34;https://logperiodic.com/rbsr.html#range-choice&#34;&gt;https://logperiodic.com/rbsr.html#range-choice&lt;/a&gt;
    </content>
    <updated>2024-09-13T22:05:18&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsrcqckereeyzve8rhl6g5s5as0hwv8lnajl3l6ptaylmcgffp777czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rcmc5r</id>
    
      <title type="html">No, both of those versions use DB version 2, so their DBs are ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsrcqckereeyzve8rhl6g5s5as0hwv8lnajl3l6ptaylmcgffp777czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rcmc5r" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszn8zzh636jrc04rwlwmvmq9c4w8ed2y865fvlcwmucq346n4suwqur4rcj&#39;&gt;nevent1q…4rcj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;No, both of those versions use DB version 2, so their DBs are compatible.
    </content>
    <updated>2024-09-13T21:49:16&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsylffc9whpup0ryvzhaje7czkxa5p4fk6ccvctjrt8t9e2wh82keqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6pqxmnt</id>
    
      <title type="html">The best way is to first upgrade to 0.9.7, which is the latest ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsylffc9whpup0ryvzhaje7czkxa5p4fk6ccvctjrt8t9e2wh82keqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6pqxmnt" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswtzpzlmqjenzjjw4udx8ft6eax3awvpduhlpspc3r6ulyknvdfwg0sukg6&#39;&gt;nevent1q…ukg6&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;The best way is to first upgrade to 0.9.7, which is the latest release in the 0.9 series. This has the &amp;#34;--fried&amp;#34; option for export (but not import).&lt;br/&gt;&lt;br/&gt;After you have the fried export, upgrade to 1.0.0 and import with &amp;#34;--fried&amp;#34; too.&lt;br/&gt;&lt;br/&gt;Sorry for the trouble, but it will save a *lot* of time versus normal import!
    </content>
    <updated>2024-09-13T21:36:02&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsff0hau7guqc6dpaeplajqm652yzyldnax52lxu5vswlmff2vg9nczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6htnpup</id>
    
      <title type="html">NIP-77 I believe is still a draft/work-in-progress, so I ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsff0hau7guqc6dpaeplajqm652yzyldnax52lxu5vswlmff2vg9nczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6htnpup" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvpafepk9n3jxw95zk5dnu8ymaddx3kp93tundmu273jlh9dmnz9gqj2h7n&#39;&gt;nevent1q…2h7n&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;NIP-77 I believe is still a draft/work-in-progress, so I don&amp;#39;t know the final form yet.&lt;br/&gt;&lt;br/&gt;I think fiatjaf&amp;#39;s intent was just to standardise the nostr integration, rather than negentropy as a whole. I guess this is similar to how JSON/SHA256/secp256k/etc are not themselves specified in NIPs, but instead external specifications are referred to. That said, the negentropy spec is relatively straightforward and there are already at least 5 implementations (and I know of some more in development too): &lt;a href=&#34;https://github.com/hoytech/negentropy/tree/master?tab=readme-ov-file#definitions&#34;&gt;https://github.com/hoytech/negentropy/tree/master?tab=readme-ov-file#definitions&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&amp;gt; It also doesn’t seem to cover the actual sending of events in either direction (after the sets have been reconciled).&lt;br/&gt;&lt;br/&gt;True, but by design this is out-of-scope of the negentropy protocol. Negentropy just performs a set reconciliation so the client knows which IDs it has and/or needs. It is then up to it to decide what to do. Currently `strfry sync` will post events it has with regular EVENT messages, and/or download events it needs with regular REQ messages.&lt;br/&gt;&lt;br/&gt;However, there are a lot of other possibilities. If a client is only interested in uploading (or downloading), it may only do one of those actions. In fact it may just store those IDs and fetch them later, or through some other relay or mechanism. Alternatively, if a client doesn&amp;#39;t actually care about the event contents and is only trying to compute an aggregate &amp;#34;reaction count&amp;#34; across relays, it may never actually download the events, and purely use negentropy for de-duplication purposes.
    </content>
    <updated>2024-09-13T21:33:28&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsqps5agsdrrysm7a6ajkud8wqwdamuep34p3pmzurly29sy73a9nqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6cyetye</id>
    
      <title type="html">Good question! Appending at the end (or near the end) is actually ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsqps5agsdrrysm7a6ajkud8wqwdamuep34p3pmzurly29sy73a9nqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6cyetye" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgnaep63te872qed6980nk54j072sa8w3u6vd6pdgpctpce0yr6rcvwcqqg&#39;&gt;nevent1q…cqqg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Good question! Appending at the end (or near the end) is actually the best-case scenario in my B-tree implementation, because it leaves the right-most leaf fully packed, unlike a classic B-tree which keeps it at half-capacity. More info here: &lt;a href=&#34;https://github.com/hoytech/negentropy/blob/master/cpp/negentropy/storage/btree/core.h#L15-L31&#34;&gt;https://github.com/hoytech/negentropy/blob/master/cpp/negentropy/storage/btree/core.h#L15-L31&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Making multiple updates to the B-tree in the same transaction is also highly optimised: The modified nodes are edited in-place in memory, and only committed to the DB at the end of the transaction. So on average, inserting 40 or fewer records at the right edge of the tree in one transaction will require only 1 DB read and 1 DB write (in addition to the metadata page).
    </content>
    <updated>2024-09-13T21:24:01&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsw9jgskkm3x73vgmc7raamnnaea06yf6pvstm4utjyq29gymx495czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6q8tvwp</id>
    
      <title type="html">I appreciate you letting me know -- I&amp;#39;m glad you like it!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsw9jgskkm3x73vgmc7raamnnaea06yf6pvstm4utjyq29gymx495czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6q8tvwp" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsy06z4gugl5c99rjzcccgj6dw2qrjzydxurpd6j5ymmy0tgz42c2cxk5xa8&#39;&gt;nevent1q…5xa8&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I appreciate you letting me know -- I&amp;#39;m glad you like it!
    </content>
    <updated>2024-09-13T21:17:46&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqspdtx43t6kvtw5rgwe2e0c0egxhhcgpza25tys88gyph4v7p642eqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6h5yuh9</id>
    
      <title type="html">Oh no, I missed this one, thanks for linking! This is a really ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqspdtx43t6kvtw5rgwe2e0c0egxhhcgpza25tys88gyph4v7p642eqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6h5yuh9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsx772kxjrtp7luzwmmkcr0ay0c7d2l5dmagheycef2xpt29c7askgxfe0yf&#39;&gt;nevent1q…e0yf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Oh no, I missed this one, thanks for linking! This is a really good write-up and there are a lot of similarities with what I&amp;#39;m designing for strfry proxy. Like some of the comments, I&amp;#39;m not sure if partitioning on ID will be optimal in all cases. I can also imagine variations on pubkey and created_at.&lt;br/&gt;&lt;br/&gt;Some variant of consistent hashing will also be necessary I think, for failure recovery, rebalancing, changing the number of backend relays, etc.
    </content>
    <updated>2024-09-13T21:17:08&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsy0wuppmpw6usyfq9t2zyxnsr5ynyypjrtudda0ql7w9laltqy68czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6af4qlh</id>
    
      <title type="html">https://github.com/nostr-protocol/nips/pull/1494</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsy0wuppmpw6usyfq9t2zyxnsr5ynyypjrtudda0ql7w9laltqy68czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6af4qlh" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs286v8409je5cgdtny8lvds6gcrxhxlq3ytldspplrmr6tzq9quzc9ywy6p&#39;&gt;nevent1q…wy6p&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/nostr-protocol/nips/pull/1494&#34;&gt;https://github.com/nostr-protocol/nips/pull/1494&lt;/a&gt;
    </content>
    <updated>2024-09-13T14:29:17&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgvga7qd3jhhu9u9qvya0a7leekg8p8y7rsyty7ke9vcnjge3stzszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tlmt0t</id>
    
      <title type="html">I just tagged strfry 1.0.0. Here are some of the highlights: * ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgvga7qd3jhhu9u9qvya0a7leekg8p8y7rsyty7ke9vcnjge3stzszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tlmt0t" />
    <content type="html">
      I just tagged strfry 1.0.0. Here are some of the highlights:&lt;br/&gt;&lt;br/&gt;* negentropy protocol 1: This is the result of a lot of R&amp;amp;D on different syncing protocols, trying to find the best fit for nostr. I&amp;#39;m pretty excited about the result. Negentropy sync has now been allocated NIP 77.&lt;br/&gt;* Better error messages for users and operators.&lt;br/&gt;* Docs have been updated and refreshed.&lt;br/&gt;* Lots of optimisations: Better CPU/memory usage, smaller DBs.&lt;br/&gt;&lt;br/&gt;Export/import has been sped up a lot: 10x faster or more. This should help reduce the pain of DB upgrades (which is required for this release). Instructions on upgrading are available here:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/strfry?tab=readme-ov-file#db-upgrade&#34;&gt;https://github.com/hoytech/strfry?tab=readme-ov-file#db-upgrade&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Thanks to everyone who has helped develop/debug/test strfry over the past 2 years, and for all the kind words and encouragement. The nostr community rocks!&lt;br/&gt;&lt;br/&gt;We&amp;#39;ve got a few things in the pipeline for strfry:&lt;br/&gt;&lt;br/&gt;* strfry proxy: This will be a new feature for the router that enables intelligent reverse proxying for the nostr protocol. This will help scale up mega-sized relays by allowing the storage and processing workload to be split across multiple independent machines. Various partitioning schemes will be supported depending on performance and redundancy requirements. The front-end router instances will perform multiple concurrent nostr queries to the backend relays, and merge their results into a single stream for the original client.&lt;br/&gt;* As well as scaling up, reverse proxying can also help scale down. By dynamically incorporating relay list settings (NIP-65), nostr queries can be satisfied by proxying requests to external relays on behalf of a client and merging the results together along with any matching cached local events. Negentropy will be used where possible to avoid wasting bandwidth on duplicate events.&lt;br/&gt;* Archival mode: Currently strfry stores all events fully indexed in its main DB, along with their full JSON representations (optionally zstd dictionary compressed). For old events that are queried infrequently, space usage can be reduced considerably. As well as deindexing, we are planning on taking advantage of columnar storage, aggregation of reaction events, and other tricks. This will play nicely with strfry proxy, and events can gradually migrate to the archival relays.&lt;br/&gt;* Last but not least, our website &lt;a href=&#34;https://oddbean.com&#34;&gt;https://oddbean.com&lt;/a&gt; is going to get some love. Custom algorithms, search, bugfixes, better relay coverage, and more!
    </content>
    <updated>2024-09-13T07:54:31&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs262xdw4f95jcdgr9hm3wcxp7nyj5zhpx903nn86h0y5m6gadxgmqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60k7dhd</id>
    
      <title type="html">It waits forever, so plugins should ensure they do any timing out ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs262xdw4f95jcdgr9hm3wcxp7nyj5zhpx903nn86h0y5m6gadxgmqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60k7dhd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszh03m2s0srhs32rdn5q4s3afpuz83hv5tvtsdr4fvrzqgvmshtdcvs35da&#39;&gt;nevent1q…35da&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It waits forever, so plugins should ensure they do any timing out on their side. I have a debugging script that can be used to detect a stalled/missing response. More info in this issue: &lt;a href=&#34;https://github.com/hoytech/strfry/issues/112&#34;&gt;https://github.com/hoytech/strfry/issues/112&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Currently strfry always waits until it gets a response about the previous event before sending another request, so the order is not applicable. Eventually I might make the implementation asynchronous in which case yes, mixed order would be acceptable. This is why the event ID must be included in a plugin reply even though technically it&amp;#39;s not needed today. I clarified this in the docs: &lt;a href=&#34;https://github.com/hoytech/strfry/commit/d2d8dc7572e63d74caf1810673981add47c9f328&#34;&gt;https://github.com/hoytech/strfry/commit/d2d8dc7572e63d74caf1810673981add47c9f328&lt;/a&gt;
    </content>
    <updated>2024-09-12T21:22:01&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsvs5chva4605a4lp9gfduzdru3whkwlngykmrrn82dz88h9sq5ygszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6v9tvg9</id>
    
      <title type="html">Thanks, I&amp;#39;ll give it a try! I should mention that the ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsvs5chva4605a4lp9gfduzdru3whkwlngykmrrn82dz88h9sq5ygszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6v9tvg9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdxrapshywjgjx6ycduhauhcnxzgk82hjwsp2japx2lhse2nxethqxkxnjl&#39;&gt;nevent1q…xnjl&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks, I&amp;#39;ll give it a try!&lt;br/&gt;&lt;br/&gt;I should mention that the existing tests and the differential fuzzing described in the strfry README pass on the 1.0 series, naturally.
    </content>
    <updated>2024-09-09T23:17:21&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsx7fn3kxtlfm54azk37ck67amdvqm74tm8gr48ymez37t8l5v2t8czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6mmjk9v</id>
    
      <title type="html">Glad to hear! Thanks for letting me know, I appreciate it!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsx7fn3kxtlfm54azk37ck67amdvqm74tm8gr48ymez37t8l5v2t8czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6mmjk9v" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxczzcynq2nqey2zn37wc3qqvfwr5vk23wyjvp54adnuunz9tmnrslejzmd&#39;&gt;nevent1q…jzmd&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Glad to hear! Thanks for letting me know, I appreciate it!
    </content>
    <updated>2024-09-07T01:41:50&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsdakww6gmlxeq0q4exfjc2esly6pjvlez0vrqzd0vmjj9k8zq8ljczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z62w2sv6</id>
    
      <title type="html">Heh yeah that is a pretty cool use-case actually. But this ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsdakww6gmlxeq0q4exfjc2esly6pjvlez0vrqzd0vmjj9k8zq8ljczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z62w2sv6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9nm63zq5f3gh5ql9678wt9jc0sdcxgns2cndjn2sdd6vvk0qyqwq9k6le4&#39;&gt;nevent1q…6le4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Heh yeah that is a pretty cool use-case actually.&lt;br/&gt;&lt;br/&gt;But this feature was removed from NIP-01 and strfry tries to follow the spec as close as possible, so take it up with the nostr CEO. ;)
    </content>
    <updated>2024-09-06T21:05:05&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8xd4ykclcwjr8jhsx3f96k04xxp6nmqmq6l25hn6unvnnl2qa93czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6fvvz53</id>
    
      <title type="html">Thanks! This change shouldn&amp;#39;t make much difference in ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8xd4ykclcwjr8jhsx3f96k04xxp6nmqmq6l25hn6unvnnl2qa93czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6fvvz53" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0ud6pjj8cw87ehctxs06luqzkneq69ul8res6z6pj4n2fhdw7vncm45dpu&#39;&gt;nevent1q…5dpu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks!&lt;br/&gt;&lt;br/&gt;This change shouldn&amp;#39;t make much difference in import&amp;#39;s behaviour. Because import pretty much constantly has a writer lock, relay *write* operations will be blocked/delayed (and may timeout), but *read* operations should continue as normal.&lt;br/&gt;&lt;br/&gt;We could make import release its lock for a few milliseconds periodically so that write operations can go through. I&amp;#39;ll look into doing that.
    </content>
    <updated>2024-09-06T05:47:57&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8vx9y325lnlv3zyqrq75al27rsdpkg04kfy06awmdjsl3acvqx3szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6dee0nl</id>
    
      <title type="html">I just tagged 2 strfry releases: 0.9.7 and 1.0.0-beta1 ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8vx9y325lnlv3zyqrq75al27rsdpkg04kfy06awmdjsl3acvqx3szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6dee0nl" />
    <content type="html">
      I just tagged 2 strfry releases: 0.9.7 and 1.0.0-beta1&lt;br/&gt;&lt;br/&gt;1.0.0-beta1 is a candidate release of strfry 1.0.0 -- help is needed testing!&lt;br/&gt;&lt;br/&gt;The internal strfry DB version has been increased to 3, which means that you will need to rebuild your DBs to use this new version.&lt;br/&gt;&lt;br/&gt;0.9.7 has some bugfixes and changes that accumulated in master, and has a &amp;#34;strfry export --fried&amp;#34; feature that can be used to create DB exports that can be rapidly imported by 1.0.0 series releases.&lt;br/&gt;&lt;br/&gt;The full changelogs are available here: &lt;a href=&#34;https://github.com/hoytech/strfry/blob/1f34794945cf380035822278c46070a9923129f3/CHANGES&#34;&gt;https://github.com/hoytech/strfry/blob/1f34794945cf380035822278c46070a9923129f3/CHANGES&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Thank you to everyone who contributed and helps testing! If you need help or run into any issues, reply on nostr or stop by our telegram channel.
    </content>
    <updated>2024-09-06T00:17:26&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxvvc6ksg4rz9mpfxdmuggvekty565lg2her9f684nmckqyc0xw2czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68cx86s</id>
    
      <title type="html">Yes, I saw -- it means a lot, especially coming from jb55. ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxvvc6ksg4rz9mpfxdmuggvekty565lg2her9f684nmckqyc0xw2czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68cx86s" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxjkg7hw95n2m7jx26dltw9z02akhy2l7ry0q9d3pfrhd5a87fj3quur6az&#39;&gt;nevent1q…r6az&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yes, I saw -- it means a lot, especially coming from jb55. Thanks!
    </content>
    <updated>2024-09-01T20:32:26&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsv8faxe7fsq0lsly89l94ztc55cvpll3702h7lsm6t73xx9n3fhxczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jjqntq</id>
    
      <title type="html">Exporting and importing events into a new strfry instance (which ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsv8faxe7fsq0lsly89l94ztc55cvpll3702h7lsm6t73xx9n3fhxczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jjqntq" />
    <content type="html">
      Exporting and importing events into a new strfry instance (which you need to do when the DB version changes) takes too long. Here&amp;#39;s a feature I just added that speeds this up a lot:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/strfry/blob/next/docs/fried.md&#34;&gt;https://github.com/hoytech/strfry/blob/next/docs/fried.md&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Going forward, there is a release-0.9 branch. I&amp;#39;m going to tag one more release on that branch soon (after back-porting a couple fixes). It will have strfry export --fried but not import. I&amp;#39;m planning on this being the last release of the 0.9 series.&lt;br/&gt;&lt;br/&gt;I&amp;#39;m working on a 1.0 release in the next branch. I just did a big refactor of the DB format that I&amp;#39;ve wanted to do for some time. I also removed prefix matching on id/pubkey (this was removed from NIP-01) and fixed a bunch of bugs. This release will also have the latest negentropy protocol version and BTree code.
    </content>
    <updated>2024-09-01T20:09:29&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsyazdcuyjfy3pya25ha8750uxpf4d3cap252kv6vs4w8dtatvwv9czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6x75qyh</id>
    
      <title type="html">Hi all! I have just pushed a major update to the negentropy ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsyazdcuyjfy3pya25ha8750uxpf4d3cap252kv6vs4w8dtatvwv9czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6x75qyh" />
    <content type="html">
      &lt;br/&gt;Hi all! I have just pushed a major update to the negentropy project. It implements protocol version 1 (previous was version 0).&lt;br/&gt;&lt;br/&gt;The protocol has been simplified: ID size is no longer configurable, there are no more continuation ranges, and the output can be constructed in the same input-scan pass.&lt;br/&gt;&lt;br/&gt;There is a new fingerprint function, based on an incremental hash. This allows fingerprints to be pre-computed and stored in a tree structure. The C&#43;&#43; implementation includes a B&#43;Tree implementation that allows fingerprints to be computed without collecting IDs from the entire DB.&lt;br/&gt;&lt;br/&gt;I have written a comprehensive article that goes over the theory of RBSR and the negentropy implementation:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://logperiodic.com/rbsr.html&#34;&gt;https://logperiodic.com/rbsr.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Comments are appreciated!&lt;br/&gt;&lt;br/&gt;Finally, I have integrated the new version of negentropy and the B&#43;Tree with strfry. It&amp;#39;s in a development branch and not quite ready for production, but my testing indicates this will be a massive improvement for full-DB syncs, especially on relays with very large DBs. In-sync or nearly in-sync relays should sync almost instantly with negligible resource usage. Relays will also use the B&#43;Tree for filters that contain only until and/or since, meaning that date-range full-DB syncs are also efficient. Syncing arbitrary filters works as before (but I have begun work to make these more efficient as well).&lt;br/&gt;&lt;br/&gt;Unfortunately, this is a breaking change for the negentropy protocol (this really should be the last one!) and will also require a new DB version.&lt;br/&gt;&lt;br/&gt;I&amp;#39;m going to take this opportunity to make a few more breaking DB changes, and plan to release strfry 1.0 after a beta testing period.
    </content>
    <updated>2023-12-07T06:05:27&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsf5xc55g2k0htzux43d67hgya0gc5asjly0c4ggu8k8t2wyrwgk7qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6n9dscy</id>
    
      <title type="html">This is a bit challenging, but I will look into it. Another ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsf5xc55g2k0htzux43d67hgya0gc5asjly0c4ggu8k8t2wyrwgk7qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6n9dscy" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszwnudhk2dynaudc2ls45wn8lu68xpet2jsjjuyhrpgq9ze4sq82gvkllqy&#39;&gt;nevent1q…llqy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This is a bit challenging, but I will look into it. Another possibility is we could try to optimise the import flow. Right now it&amp;#39;s single-threaded and there are a bunch of other things that could be tuned also.
    </content>
    <updated>2023-11-20T20:38:35&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgr43k8jw6pyf2r2plq3ysz05k54mrfpuheqafgr3u8h2vqylhgdczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6msm0rv</id>
    
      <title type="html">Hah, nice rant! Yeah sorry, my code is a bit unconventional. ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgr43k8jw6pyf2r2plq3ysz05k54mrfpuheqafgr3u8h2vqylhgdczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6msm0rv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs08e5z4p49vkh8xw05evp49tp85z8pwd8q2p8zxtm0w3fh8yrt2ksu0gs4g&#39;&gt;nevent1q…gs4g&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hah, nice rant! Yeah sorry, my code is a bit unconventional. I&amp;#39;m happy to offer you a full refund. :)&lt;br/&gt;&lt;br/&gt;FWIW there are 2 `Dockerfile`s in the repo: One for alpine and one for Ubuntu. If you get it working on another platform, I&amp;#39;d be happy to merge a pull request.
    </content>
    <updated>2023-11-06T19:18:12&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszhlls60aerhaaygve8cej69pksrky58jd0xj70ar9hyjhnc56y8qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6m9ehc8</id>
    
      <title type="html">Thanks for letting me know, glad you enjoyed it!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszhlls60aerhaaygve8cej69pksrky58jd0xj70ar9hyjhnc56y8qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6m9ehc8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsr3md5g7h6zrhlsnn0465reddncp3kl0hmua6jgs5uwfmylgp9zhsy379n2&#39;&gt;nevent1q…79n2&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks for letting me know, glad you enjoyed it!
    </content>
    <updated>2023-11-06T18:14:57&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsd7nj66kaf6gmh5s2k9xyauwxsj3yuxrg7w9cev9s6ndt9uvyk9jgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6yuhp9p</id>
    
      <title type="html">FWIW I agree with you. Right now the front page is really boring. ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsd7nj66kaf6gmh5s2k9xyauwxsj3yuxrg7w9cev9s6ndt9uvyk9jgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6yuhp9p" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs86fc3ucugxg6m0p2zyy46prynav9kej6v2d32n8zm4lx6usshsqcwyhhk4&#39;&gt;nevent1q…hhk4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;FWIW I agree with you. Right now the front page is really boring. I have some ideas and I&amp;#39;m working on it!
    </content>
    <updated>2023-09-29T15:19:39&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgauz8sm9c02k58ena9c6sqmc75h8dmn4mzysme2c0566uupyhv3gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6suavxj</id>
    
      <title type="html">It&amp;#39;s based on kind 7 &amp;#34;reactions&amp;#34;, roughly. It gets ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgauz8sm9c02k58ena9c6sqmc75h8dmn4mzysme2c0566uupyhv3gzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6suavxj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgmt96ul7c9xwgswfh908t4a2gfwsfjl2s67zeujzdtf35agszh0gv87gft&#39;&gt;nevent1q…7gft&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It&amp;#39;s based on kind 7 &amp;#34;reactions&amp;#34;, roughly. It gets adjusted by the community&amp;#39;s algorithm, and not everyone&amp;#39;s reactions count (otherwise it would be trivially gameable by making a bunch of random pubkeys). I&amp;#39;ll have more info on this soon, once community algorithms are ready.
    </content>
    <updated>2023-09-28T17:48:55&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8eqt4kvhjamk6wrvwnf6e62z3lzewwa5m6r02vgv8yahp4fmj6kqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6gdkpka</id>
    
      <title type="html">Yes, it&amp;#39;s actually embedded into strfry executable as an ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8eqt4kvhjamk6wrvwnf6e62z3lzewwa5m6r02vgv8yahp4fmj6kqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6gdkpka" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrss62m836fql8yyvlfwp3m7yhne7jn0m99pkauxhczat8282zq2c9v34fg&#39;&gt;nevent1q…34fg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yes, it&amp;#39;s actually embedded into strfry executable as an &amp;#34;app&amp;#34;. WIP code is in the web branch of the strfry repo: &lt;a href=&#34;https://github.com/hoytech/strfry/tree/web/src/apps/web&#34;&gt;https://github.com/hoytech/strfry/tree/web/src/apps/web&lt;/a&gt;
    </content>
    <updated>2023-09-28T15:10:00&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszsx062fucpet0gd8aqudzugnldzgluc8qwv2yuqgtznxwrxm63fczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6w8mtv9</id>
    
      <title type="html">Yeah it&amp;#39;s not great right now, sorry. Work in progress, stay ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszsx062fucpet0gd8aqudzugnldzgluc8qwv2yuqgtznxwrxm63fczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6w8mtv9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsyesq3sn47eclcdw6gefgr4ktjukqhgln7zye62cyvahc977l2csqgtmdwh&#39;&gt;nevent1q…mdwh&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yeah it&amp;#39;s not great right now, sorry. Work in progress, stay tuned :)
    </content>
    <updated>2023-09-28T08:30:11&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsfnrqf99356s9n73gf95l8qzx8pa2phgg4x6dahrdhg7ml4pv7fwqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6fwx49c</id>
    
      <title type="html">Thanks all! I wasn&amp;#39;t quite ready to launch this thing, but I ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsfnrqf99356s9n73gf95l8qzx8pa2phgg4x6dahrdhg7ml4pv7fwqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6fwx49c" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdp323d4knfd7a3et3kaxp2ud2nkqanjngqr62jdg43wlzu05vm8s4yvm0s&#39;&gt;nevent1q…vm0s&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks all! I wasn&amp;#39;t quite ready to launch this thing, but I really appreciate the feedback, cheers!&lt;br/&gt;&lt;br/&gt;I was having some stability issues which was why the site was down for a while earlier today. It should be fixed now.
    </content>
    <updated>2023-09-28T08:28:11&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsqqh8kjfg298k5fg84qqcym0kpvvwcwfx55tmdv3mwa5yhahushqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tu2kpp</id>
    
      <title type="html">Thank you!!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsqqh8kjfg298k5fg84qqcym0kpvvwcwfx55tmdv3mwa5yhahushqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tu2kpp" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg9x3v0r408tpftsxnts5vmupgmgyd2hskyf4atqv5r55xz924p0qd6plva&#39;&gt;nevent1q…plva&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thank you!!
    </content>
    <updated>2023-09-28T08:25:18&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgjha7hg3676hzc3uyfs6k6wfejujnxpsr36gq6uspzt047u3gdkszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68t3naa</id>
    
      <title type="html">Hi! I wasn&amp;#39;t really ready for a launch yet but I&amp;#39;m glad ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgjha7hg3676hzc3uyfs6k6wfejujnxpsr36gq6uspzt047u3gdkszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68t3naa" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqcyfqut6lx9ct2a3ngfafd8hrrvw8ppalfaux05kwt5evf69xmhsu6pwwa&#39;&gt;nevent1q…pwwa&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hi! I wasn&amp;#39;t really ready for a launch yet but I&amp;#39;m glad people are enjoying it :)&lt;br/&gt;&lt;br/&gt;Actually it&amp;#39;s already open-source, it&amp;#39;s in a branch of the strfry repo: &lt;a href=&#34;https://github.com/hoytech/strfry/tree/web/src/apps/web&#34;&gt;https://github.com/hoytech/strfry/tree/web/src/apps/web&lt;/a&gt;
    </content>
    <updated>2023-09-28T08:23:03&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs249sz89y9tr42zef20yzwvdljksmz0rfp8300468l7trpyzcsj9qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69fp4fm</id>
    
      <title type="html">Yes, I have seen nostrdb. I think it&amp;#39;s a great idea, and that ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs249sz89y9tr42zef20yzwvdljksmz0rfp8300468l7trpyzcsj9qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69fp4fm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvyuw2uvjnlevvfxw94vktu9qrslul57dqdgk3g5y03mvp932k7dstxmpha&#39;&gt;nevent1q…mpha&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yes, I have seen nostrdb. I think it&amp;#39;s a great idea, and that it will be a big benefit for native clients. Let me know if I can help in any way!&lt;br/&gt;&lt;br/&gt;I was thinking about it a bit and maybe flatbuffers is a bit overkill for the indexed nostr events in strfry, and I&amp;#39;m working on a branch that uses a custom event representation similar to nostrdb. I usually use flatbuffers by default because the generated code is convenient and it&amp;#39;s easy to evolve the schema in a backwards compatible way. Also it comes with some nice utilities for debugging and securely parsing untrusted data (not needed here).&lt;br/&gt;&lt;br/&gt;BUT the core nostr event layout is pretty much fixed and saving some space here is important not least because it will let us pack more records into the page cache. I&amp;#39;ll keep you posted on how that goes. Cheers!
    </content>
    <updated>2023-09-13T02:10:43&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszycgq9fc6kwnwqx6hlhwvm7eusph7f4g9c4yfxwrm34d0nsnhztczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z63z2vem</id>
    
      <title type="html">Awesome! I made a bit of progress on connecting the test harness, ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszycgq9fc6kwnwqx6hlhwvm7eusph7f4g9c4yfxwrm34d0nsnhztczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z63z2vem" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswhnlx0yneznx5zj3kuvr7pxxsadyepct5c3rkgnqrp8e3rq6hq5c3zk7wd&#39;&gt;nevent1q…k7wd&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Awesome! I made a bit of progress on connecting the test harness, but I found an area where the implementations differ. I&amp;#39;m going to keep looking into it, but I wrote up what I&amp;#39;ve found so far here:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/yukibtc/rust-negentropy/issues/1&#34;&gt;https://github.com/yukibtc/rust-negentropy/issues/1&lt;/a&gt;
    </content>
    <updated>2023-09-12T22:28:50&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs25vze6wfylvjajf67taw7e0pqray6xclyy2ec0g9a0ckm7e822kczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68m69hu</id>
    
      <title type="html">600ms seems too long for that set size. I will take a look at the ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs25vze6wfylvjajf67taw7e0pqray6xclyy2ec0g9a0ckm7e822kczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68m69hu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8vvlj3hen6znnxdshv79yq4pc0n7wklwkfz256le4wdfqylyqnes9dd4ly&#39;&gt;nevent1q…d4ly&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;600ms seems too long for that set size. I will take a look at the performance when I have my Rust harness working. Let&amp;#39;s make sure it&amp;#39;s working the same way as the C&#43;&#43;/JS impls first, and then we can see if there any speed-ups.&lt;br/&gt;&lt;br/&gt;One optimisation I did in the C&#43;&#43; was to ensure that the XORing is always done word-wise, instead of byte-for-byte. In fact, with attention to the alignment, I got the compiler to emit PXOR SIMD instructions to do multiple words in a single instruction.&lt;br/&gt;&lt;br/&gt;That&amp;#39;s very cool about the UniFFI bindings, I&amp;#39;m looking forward to it!
    </content>
    <updated>2023-09-12T09:13:09&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs9k45rsh4pdnvc7cty80r3n68j38esvp2uszkk390m58v7tzz4ytqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68menuf</id>
    
      <title type="html">I only have a very rough understanding of how minisketch works, ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs9k45rsh4pdnvc7cty80r3n68j38esvp2uszkk390m58v7tzz4ytqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68menuf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0dw57mm5a72jtzsc2crxsmpzem2lhw8a0xjm0kxfggqv6lp8f4rcazhlgz&#39;&gt;nevent1q…hlgz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I only have a very rough understanding of how minisketch works, but from what I know it is the opposite.&lt;br/&gt;&lt;br/&gt;Minisketch is very good with small set sizes -- so good that it approaches the information-theoretic bounds of what is possible, bandwidth-wise. However, look at the first graph on the minisketch site:  &lt;img src=&#34;https://raw.githubusercontent.com/sipa/minisketch/master/doc/plot_capacity.png&#34;&gt; &lt;br/&gt;&lt;br/&gt;Here you can see that the CPU time required is exponential in its &amp;#34;capacity&amp;#34; parameter (note the Y axis is log-scale), and will become impractical in the low thousands. The text hints at this too: &amp;#34;For the largest sizes currently of interest to the authors, such as a set of capacity 4096 with 1024 differences&amp;#34;.&lt;br/&gt;&lt;br/&gt;OTOH, negentropy works predictably well into the millions or tens of millions of events. By pre-computing fingerprints as described in Aljoscha Meyer&amp;#39;s paper, this will scale to arbitrarily large sizes.&lt;br/&gt;&lt;br/&gt;Some other downsides that I see with minisketch are that you need to choose an appropriate capacity before you begin the reconcilliation, otherwise it will fail (?). How do you choose that? Also, minisketch&amp;#39;s performance depends on the field-size, which I believe is basically how large the IDs being reconciled can be. The largest example shown is 64 bits, which is uncomfortably small if trying to avoid collisions. negentropy by default uses 128 bits, but can scale this arbitrarily high with only linear overhead in bandwidth and CPU.&lt;br/&gt;&lt;br/&gt;By contrast, negentropy requires almost no tuning. The default parameters I have selected seem to work well for both small and large set sizes, and with small and large symmetric differences between the two sides.&lt;br/&gt;&lt;br/&gt;I am in the process of adding negentropy support to gensync, which is a general benchmarking framework for set reconcilliation protocols. I&amp;#39;ll post any updates about my progress here: &lt;a href=&#34;https://github.com/nislab/gensync/issues/9&#34;&gt;https://github.com/nislab/gensync/issues/9&lt;/a&gt;
    </content>
    <updated>2023-09-12T08:59:13&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs84nd9qpq6t84f3ju4gv8et64l3hqpyll9z9n5ktkkghrn2ux5qkczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6w89aws</id>
    
      <title type="html">This is awesome, thank you! I&amp;#39;m trying to create a harness ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs84nd9qpq6t84f3ju4gv8et64l3hqpyll9z9n5ktkkghrn2ux5qkczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6w89aws" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsq4s2gj56k2y0w0pk7r7cvyrxhcv63lgskvc7urxv73q4hmvptj5cupzcc7&#39;&gt;nevent1q…zcc7&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This is awesome, thank you!&lt;br/&gt;&lt;br/&gt;I&amp;#39;m trying to create a harness for this so we can run it against the test-suite used by the C&#43;&#43; and JS implementations. For example, here&amp;#39;s the C&#43;&#43; harness:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/hoytech/negentropy/blob/master/test/cpp/harness.cpp&#34;&gt;https://github.com/hoytech/negentropy/blob/master/test/cpp/harness.cpp&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;This is as far as I got:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://gist.github.com/hoytech/96e65fc488fc39c2e782830f38727391&#34;&gt;https://gist.github.com/hoytech/96e65fc488fc39c2e782830f38727391&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;This is pretty much the first Rust code I&amp;#39;ve ever written, sorry about the bad quality. The problem I&amp;#39;m running into is that the reconcile() and reconcile_with_ids() methods seem to return String. If I understand rightly, Rust strings must be utf-8 encoded right?&lt;br/&gt;&lt;br/&gt;In the current implementations, the reconcile messages must be in an 8-bit clean medium (or hex encoded). Same with the IDs (since they are typically hash function outputs). In C&#43;&#43; I use std::string because this allows any u8 values (and doesn&amp;#39;t care anywhere about utf-8). In JS I allow Uint8Array values *or* hex-encoded strings.&lt;br/&gt;&lt;br/&gt;Can we make the rust interface standardise on something 8-bit clean? Vec&amp;lt;u8&amp;gt; or some such? Or it&amp;#39;s very possible I&amp;#39;m misinterpreting the code here. Any pointers are very much appreciated.
    </content>
    <updated>2023-09-11T22:24:08&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2hq8n6hx05jl7x2ype0jghs52ekahp0z4z9fmn3fj6a0qw6jvn3qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69y8wt2</id>
    
      <title type="html">I just landed a new feature in strfry: &amp;#34;strfry router&amp;#34; ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2hq8n6hx05jl7x2ype0jghs52ekahp0z4z9fmn3fj6a0qw6jvn3qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z69y8wt2" />
    <content type="html">
      I just landed a new feature in strfry: &amp;#34;strfry router&amp;#34;&lt;br/&gt;&lt;br/&gt;Docs: &lt;a href=&#34;https://github.com/hoytech/strfry/blob/master/docs/router.md&#34;&gt;https://github.com/hoytech/strfry/blob/master/docs/router.md&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I kind of think of this like &amp;#34;nginx for nostr&amp;#34;. It lets you manage many up/down/both streams to remote relays using a single process and config file, and you can edit that config file without interrupting existing streams (mostly).&lt;br/&gt;&lt;br/&gt;You can also use nostr filters and/or plugins to filter the traffic in both up and down directions, independently.
    </content>
    <updated>2023-09-09T00:04:43&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxaeuhttt387sr6f86t2kuet5xtumjsapsf5wmx04wpzgc6sszvtszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rwuzpm</id>
    
      <title type="html">You&amp;#39;re welcome, I&amp;#39;m glad you like it!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxaeuhttt387sr6f86t2kuet5xtumjsapsf5wmx04wpzgc6sszvtszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6rwuzpm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs952896wdtxjdzceyp0c7n89xneuszusy9zksrla9kyhf9fnjcvls4nxn50&#39;&gt;nevent1q…xn50&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;You&amp;#39;re welcome, I&amp;#39;m glad you like it!
    </content>
    <updated>2023-07-14T18:47:36&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxkckk26uv40ks7garxh3qjlk9m9899j3v0kn24r4zfd8rfauyuqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6n98wp4</id>
    
      <title type="html">Hehe thank you!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxkckk26uv40ks7garxh3qjlk9m9899j3v0kn24r4zfd8rfauyuqgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6n98wp4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9rwu7dgn7qhwhmjv22vyg8jzvxzhz656spwl8jl59x3ypddltz5gemk73c&#39;&gt;nevent1q…k73c&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hehe thank you!
    </content>
    <updated>2023-07-14T18:47:15&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs8l6y8mee9hprzm0mgdw788gkj7sac0q6k5fc62qq2e92gahy3e9szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z67e8z8m</id>
    
      <title type="html">Hey all! I&amp;#39;m going to be doing a talk on nostr and the ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs8l6y8mee9hprzm0mgdw788gkj7sac0q6k5fc62qq2e92gahy3e9szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z67e8z8m" />
    <content type="html">
      Hey all! I&amp;#39;m going to be doing a talk on nostr and the architecture of the strfry relay. It&amp;#39;s next week at the CppNorth conference in Toronto, Canada:&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://cppnorth.ca/speaker-doug-hoyte.html&#34;&gt;https://cppnorth.ca/speaker-doug-hoyte.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;If anyone&amp;#39;s around, it&amp;#39;ll be a pretty fun conference! You can enter NOSTR in the checkout to get a discount on the ticket.
    </content>
    <updated>2023-07-13T14:10:04&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsrqwjp30v85r3aypaj03j0ehu450td9rett5nmgtfxx47cvxq444szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z609msr5</id>
    
      <title type="html">Hi! Yeah, sorry, the sync support has been broken for a little ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsrqwjp30v85r3aypaj03j0ehu450td9rett5nmgtfxx47cvxq444szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z609msr5" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvutf3wsv65mc8j04cp0gsls6a4fwsx258dzezjv03ar9ugalq57s9w8gl5&#39;&gt;nevent1q…8gl5&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hi! Yeah, sorry, the sync support has been broken for a little while. However, this is now fixed in the `next` branch and very soon there will be a 1.0.0 release with this included.
    </content>
    <updated>2023-06-09T21:03:00&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsgz2t3mwlpetd43uk2txqd4jpj2na9wj6xshzp9eszg3n7jzv6l6szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68yd99p</id>
    
      <title type="html">Hi!</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsgz2t3mwlpetd43uk2txqd4jpj2na9wj6xshzp9eszg3n7jzv6l6szyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z68yd99p" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstl0gt4vy6430zrefelde4ec6slgd0d6ss7s0r75ap8asm5wwak2q3uwfxg&#39;&gt;nevent1q…wfxg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hi!
    </content>
    <updated>2023-06-09T21:00:06&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszp78zpnm2wykxq0xqa838l9p94e432wkhnhf4xa4gf3wmdh2d2lczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6kde0sl</id>
    
      <title type="html">Got it, makes sense. I think if you make sure the event is ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszp78zpnm2wykxq0xqa838l9p94e432wkhnhf4xa4gf3wmdh2d2lczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6kde0sl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqqg5xv8d7rw398nf72d3d2w8qur54ren79hqlumpmtu2j2uzzqjqrxfj&#39;&gt;nevent1q…rxfj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Got it, makes sense. I think if you make sure the event is written before updating the DB then that would be safe, as you describe. It still might be worthwhile to check if there is any performance difference between the parallel file and storing the validated event JSON in sled DB along with the indices. If it works like LMDB then retrieving it will be functionally identical (an offset into an mmap), and an event write will require only one fsync, not two. It also might save you a lot of trouble later on, when it comes to backups and periodic rewrites you mention.&lt;br/&gt;&lt;br/&gt;About the indices: No, I don&amp;#39;t think it&amp;#39;s a dumb algorithm. It&amp;#39;s actually a really difficult problem, to figure out which index or indices to use in a scan. strfry has all the indices you mention, also composite with created_at. Additionally, there is a (pubkey,kind,created_at) index, which I think is useful because I believe queries like &amp;#34;get contact list of user X&amp;#34; are quite common.&lt;br/&gt;&lt;br/&gt;strfry currently never joins two indices together or does a set intersection as you describe -- its algorithm is even dumber. It only ever uses 1 index. If the query can be fully satisfied by the index then it doesn&amp;#39;t need to load the flatbuffers (most queries are like this). But if it does need to load the flatbuffers this is when it&amp;#39;s important that accessing them and applying filters are fast. Optimisations for this code path are also beneficial for the live events filtering (ie post EOSE).&lt;br/&gt;&lt;br/&gt;Your approach sounds like it might be quite effective. The only thing I&amp;#39;d watch out for is if your IO patterns are excessively random. The nice thing about working on one index at once is that the access is largely contiguous data. Even several contiguous streams is probably OK, but some queries have like hundreds of pubkeys in them (for instance).
    </content>
    <updated>2023-05-08T18:19:54&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsxyw3ld6zhgz9e67getneev340ky4napjavyfw2ngwrhvttepr37czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z64wqq99</id>
    
      <title type="html">In strfry there&amp;#39;s currently no way to do read-time filtering, ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsxyw3ld6zhgz9e67getneev340ky4napjavyfw2ngwrhvttepr37czyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z64wqq99" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqq8jw3xvnpv6f8pvmume6lxzrccjvvd7d43zgwdalfmw5d8e7qu5jdgr&#39;&gt;nevent1q…jdgr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;In strfry there&amp;#39;s currently no way to do read-time filtering, but I&amp;#39;m going to put some thought in how to do this flexibly (see my sibling reply). Your ruleset description will be quite helpful as a solid use-case - thanks!&lt;br/&gt;&lt;br/&gt;Also, that&amp;#39;s very cool with your new relay design, I&amp;#39;m looking forward to seeing it.&lt;br/&gt;&lt;br/&gt;About using a parallel mmap&amp;#39;ed file to store the event data, I have some experience with this approach and frankly I would not do that except as a last resort.&lt;br/&gt;&lt;br/&gt;The biggest downside IMO is that you won&amp;#39;t be guaranteeing transactional consistency between the event data and the indices. For instance, what if a write update to the sled DB succeeds, but writing the event to the mmap fails? This could happen when you&amp;#39;re in low-diskspace conditions, or maybe there&amp;#39;s an application bug or server failure and you crash at a bad time. In this case, you&amp;#39;d have a corrupted DB, because there would be pointers into invalid offsets in the mmap. Similarly, deleting an event and recovering the space will become much harder without transactional consistency.&lt;br/&gt;&lt;br/&gt;OTOH, one really great thing you can do is directly `pwritev()` from the mmap to the socket. I have had success with this in the past, because the data doesn&amp;#39;t even need to be copied to userspace and userspace page-tables don&amp;#39;t need updating. In fact, with `sendfile()` and good enough network card drivers, it can actually be copied directly from the kernel&amp;#39;s page cache to the network card&amp;#39;s memory.&lt;br/&gt;&lt;br/&gt;Although possible, I don&amp;#39;t actually do this in strfry for a bunch of reasons. First of all, nostr events are usually too small to really make this worthwhile. Also, I don&amp;#39;t want to deal with the complexity of long-running transactions in the case of a slow-reading client. Lastly, this usually isn&amp;#39;t possible anyway because of websocket compression and strfry&amp;#39;s feature where events can be stored zstd compressed on disk.&lt;br/&gt;&lt;br/&gt;Anyway, on balance I think it&amp;#39;s preferable to store the event data in the same DB as the indices. With LMDB you get pretty much all the benefits (and downsides) of a mmap() anyway. I don&amp;#39;t know about sled, I haven&amp;#39;t looked into that before.&lt;br/&gt;&lt;br/&gt;About serialisation, I quickly looked at speedy and from what I can tell it seems like it&amp;#39;s pretty simple and concatenates the struct&amp;#39;s fields directly in-order (?). That may work pretty well in some cases, but let me elaborate a bit on my choice of flatbuffers.&lt;br/&gt;&lt;br/&gt;flatbuffers have an offsets table (like a &amp;#34;vtable&amp;#34; if you&amp;#39;re familiar with the C&#43;&#43; terminology). This lets you directly access a single field from the struct without having to touch the rest of the struct. For instance, if you wanted to extract a single string from a large object, you look up its offset in the vtable and directly access that memory. This has the advantage that none of the rest of the memory of the struct needs to be touched. If you&amp;#39;re using a mmap like LMDB, then some of the record may not even need to be paged in.&lt;br/&gt;&lt;br/&gt;Typically you will never fully &amp;#34;deserialise&amp;#34; the record - that doesn&amp;#39;t even really make sense in flatbuffers because there is no deserialised format (or rather, the encoded format is the same as the &amp;#34;deserialised&amp;#34; one). This means that getting some information out of a flatbuffer does not require any heap memory allocations. Additionally, small fixed-size fields are typically stored together (even if there is some long string &amp;#34;in between&amp;#34; them), so loading one will often as a side-effect cause the others to be paged in/loaded as well, and live in the same CPU cache line.&lt;br/&gt;&lt;br/&gt;I may be wrong, but speedy looks more like protobufs where you have to traverse and decode the entire struct, and allocate memory for each field before you can access a single field in the record. In the case where you wanted to read just a couple fields (pretty common for a DB record), this could be pretty wasteful. Again, the data required for indexing nostr events is fairly small so this may not be a big deal -- my choice of default is from experience with much larger records.&lt;br/&gt;&lt;br/&gt;One more thing: flatbuffers is quite interesting (and I think unique?) in that it allows you to separate the error checking from the access/deserialisation. For example, when you deserialise you typically assume this input is untrusted, so you&amp;#39;ll be doing bounds-checking, field validation, etc. However, in the case where the records are purely created and consumed internally, these checks are unnecessary. This is one reason flatbuffers is so effective for the use-case of database records.&lt;br/&gt;&lt;br/&gt;Sorry for this big wall of text!
    </content>
    <updated>2023-05-07T17:45:51&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs96srdm8j9mkld8vf27gy77e3e00gny9h9fg2e4jtth97kaq3y3tczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jn5d59</id>
    
      <title type="html">Got it! I will try to think of the best way to do read-level ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs96srdm8j9mkld8vf27gy77e3e00gny9h9fg2e4jtth97kaq3y3tczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6jn5d59" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg2uxfusjnl8h59qcp0786rlmkacdywseg87486r68e228rujxfncks6fvw&#39;&gt;nevent1q…6fvw&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Got it! I will try to think of the best way to do read-level authorisation, which I think is the building block we need for this. I&amp;#39;m thinking something like a &amp;#34;virtual filter&amp;#34; that is applied to all queries and has the ability to remove disallowed events from the output. I think this would be integrated at the DB querying level, so that (ie) you don&amp;#39;t get fewer results than your limit, as might happen if it was done at a post-processing stage.
    </content>
    <updated>2023-05-07T16:47:37&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqs2znw2j4juumhv6cn2ahm879kse3ja6ytr2tg652zx7stgsyfnreszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60qvx2s</id>
    
      <title type="html">Hey guys, sorry for the delay! Just to clarify: You&amp;#39;d like it ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqs2znw2j4juumhv6cn2ahm879kse3ja6ytr2tg652zx7stgsyfnreszyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z60qvx2s" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsquznnhjtewp2cd0ggdyah02qqq3w2t4jye6nrazxqa6uhg2sfyase93l3s&#39;&gt;nevent1q…3l3s&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hey guys, sorry for the delay!&lt;br/&gt;&lt;br/&gt;Just to clarify: You&amp;#39;d like it so a particular user (authenticated in some way, maybe NIP-42?) can only access a subset of the keys in the DB?&lt;br/&gt;&lt;br/&gt;I think that would be possible (assuming authentication is implemented of course). As Mike sas, it wouldn&amp;#39;t be quite as easy as with SQL, where you could add a WHERE clause to all the required queries. However, I think you could do it in a way that wouldn&amp;#39;t affect performance drastically.&lt;br/&gt;&lt;br/&gt;If the sets of events for each user are mostly disjoint (not too many duplicated), then you could possibly run a strfry instance for each user. A running instance has a relatively low overhead, especially if you scale down the various thread counts.
    </content>
    <updated>2023-05-05T19:41:38&#43;02:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsyvh8mdud07upyaq6ul5x4246pvlzr7ly5y3sa8x8j2d6vy5d673qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6vzqe4e</id>
    
      <title type="html">Actually strfry *does* compress relay-&amp;gt;client messages by ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsyvh8mdud07upyaq6ul5x4246pvlzr7ly5y3sa8x8j2d6vy5d673qzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6vzqe4e" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsv6rrpy9hhplz0e5ekzjskn3w9zjwnl3eddxtf78xm078s6z5lqlss4fx7n&#39;&gt;nevent1q…fx7n&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Actually strfry *does* compress relay-&amp;gt;client messages by default, using websocket per-message compression with sliding window (if supported by client).&lt;br/&gt;&lt;br/&gt;This is configurable with the relay.compression.enabled and relay.compression.slidingWindow parameters in the beta branch.&lt;br/&gt;&lt;br/&gt;The strfry logs also include the compression negotation parameters on client connect, and the total compression ratios on disconnect (up and down).
    </content>
    <updated>2023-02-17T23:53:17&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsz9q37v3vuvv7tv5ytfm30wjnrthvwa59hz9zu2wjv3s2v2kkv0wqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tpvk76</id>
    
      <title type="html">There is a &amp;#34;websocket&amp;#34; thread that is async since it ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsz9q37v3vuvv7tv5ytfm30wjnrthvwa59hz9zu2wjv3s2v2kkv0wqzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6tpvk76" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8f979lxcwn6we7wsp9nxqv42el8tqdcyd0udjln07uky4nya7kjcpzemhxue69uhhyetvv9ujumn0wd68ytnfdenx7gr7mxg&#39;&gt;nevent1q…7mxg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;There is a &amp;#34;websocket&amp;#34; thread that is async since it handles multiplexing all the different websocket connections. However, it delegates most CPU or I/O bound operations to various thread pools. There are more details in the Architecture section of the README: &lt;a href=&#34;https://github.com/hoytech/strfry#architecture&#34;&gt;https://github.com/hoytech/strfry#architecture&lt;/a&gt;
    </content>
    <updated>2023-01-12T16:21:13&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsfs3mtvdjqqac9hqrlfxq8kd55ue7mue4mue4q9337nm3h2nuhmgczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6aa0uny</id>
    
      <title type="html">I&amp;#39;m planning on it, yes! It will be at relay.strfry.net :)</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsfs3mtvdjqqac9hqrlfxq8kd55ue7mue4mue4q9337nm3h2nuhmgczyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6aa0uny" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgnydspuhsxf8ypuzq66x93hspt6zwuuslwlm2gkxa52cmepfa9hgpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5xqgqhy&#39;&gt;nevent1q…gqhy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I&amp;#39;m planning on it, yes! It will be at relay.strfry.net :)
    </content>
    <updated>2023-01-10T23:31:11&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqsfm9pkql6cfmk7f6rlrfg4d70ch2jgy4rlankthrulwp6s84v2zmgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6urr4f9</id>
    
      <title type="html">Thanks! I&amp;#39;m looking forward to actually testing strfry on ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqsfm9pkql6cfmk7f6rlrfg4d70ch2jgy4rlankthrulwp6s84v2zmgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6urr4f9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2n0fp9fe6s5asnztzj5hzh2ccwwq68uq6whda33mu04gl7qsnutcpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet586mtyv&#39;&gt;nevent1q…mtyv&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks! I&amp;#39;m looking forward to actually testing strfry on production traffic. :)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;I think the merkle-tree syncing could really help with distributing data amongst relays too, I&amp;#39;m going to write more on this shortly.
    </content>
    <updated>2023-01-10T19:22:03&#43;01:00</updated>
  </entry>

  <entry>
    <id>https://nostr.ae/nevent1qqszl7meruz7jngxrs7vdt6g03y6mutp32dyfcqdgs90rgnmhnusthgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6894gd9</id>
    
      <title type="html">Hey all! Here&amp;#39;s a new nostr relay implementation I&amp;#39;m ...</title>
    
    <link rel="alternate" href="https://nostr.ae/nevent1qqszl7meruz7jngxrs7vdt6g03y6mutp32dyfcqdgs90rgnmhnusthgzyqscywzrzwfet8tvsct680vfjvp6jesfk39xgn5h8zgs8znaap3z6894gd9" />
    <content type="html">
      Hey all! Here&amp;#39;s a new nostr relay implementation I&amp;#39;m working on: &lt;a href=&#34;https://github.com/hoytech/strfry&#34;&gt;https://github.com/hoytech/strfry&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;It&amp;#39;s still in beta/dev, but pretty close to production ready. Most interesting feature is a merkle-tree based set reconciliation protocol for syncing messages between servers.
    </content>
    <updated>2023-01-09T22:00:05&#43;01:00</updated>
  </entry>

</feed>