<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2025-02-06T17:52:42Z</updated>
  <generator>https://yabu.me</generator>

  <title>Nostr notes by puppo</title>
  <author>
    <name>puppo</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://yabu.me/npub1pupp0m7f4hd4jlxasua7j5gq9fejzunu32m8wrpufaufsmymjzqsyl8uql.rss" />
  <link href="https://yabu.me/npub1pupp0m7f4hd4jlxasua7j5gq9fejzunu32m8wrpufaufsmymjzqsyl8uql" />
  <id>https://yabu.me/npub1pupp0m7f4hd4jlxasua7j5gq9fejzunu32m8wrpufaufsmymjzqsyl8uql</id>
  <icon>https://nostr.build/i/p/054fb948b282a0a0d962f7c50eb2cdfb09c714ae87d9b2e996a1d579be48d883.jpg</icon>
  <logo>https://nostr.build/i/p/054fb948b282a0a0d962f7c50eb2cdfb09c714ae87d9b2e996a1d579be48d883.jpg</logo>




  <entry>
    <id>https://yabu.me/nevent1qqsqtlsjgywye6rekmdh4rrde4ut70fg6t40kx65n49fkkj52e2mgvszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggza9kjyj</id>
    
      <title type="html">Test mention @npub1lrn…qnw5</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsqtlsjgywye6rekmdh4rrde4ut70fg6t40kx65n49fkkj52e2mgvszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggza9kjyj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs269u0d9k05h45cr8qaklr6huvyhglswt63pze5vmwmge7m8vx4qsursk53&#39;&gt;nevent1q…sk53&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test mention &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1lrnvvs6z78s9yjqxxr38uyqkmn34lsaxznnqgd877j4z2qej3j5s09qnw5&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;corndalorian&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1lrn…qnw5&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; 
    </content>
    <updated>2025-06-27T14:02:52Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs97uk3awnhsr5g4j7md9dt570t2tgythqn8stv5xdfey3ycwzrsmszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz4sdt6y</id>
    
      <title type="html">Test reply</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs97uk3awnhsr5g4j7md9dt570t2tgythqn8stv5xdfey3ycwzrsmszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz4sdt6y" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs269u0d9k05h45cr8qaklr6huvyhglswt63pze5vmwmge7m8vx4qsursk53&#39;&gt;nevent1q…sk53&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test reply 
    </content>
    <updated>2025-06-27T14:02:30Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsy2x7jyvpg5cdxcyz0768qpuds87kkz9tu9x8x0vunavwzwhksqeczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzj2xlqd</id>
    
      <title type="html">Followed 🐾💜</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsy2x7jyvpg5cdxcyz0768qpuds87kkz9tu9x8x0vunavwzwhksqeczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzj2xlqd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8zpw4l0sq5d5n8yhjsj8scqtr6wfs3eust3q04gcanv6lk8rnr2sw8p77x&#39;&gt;nevent1q…p77x&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Followed 🐾💜
    </content>
    <updated>2025-05-07T11:54:50Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs25pa9hmx6us866xvj2kg26e6xczmdwxqumslcwvzng7nksn0ludgzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggznuysve</id>
    
      <title type="html">💜🐾</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs25pa9hmx6us866xvj2kg26e6xczmdwxqumslcwvzng7nksn0ludgzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggznuysve" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswt6lqvj4dv02t9wmp7dr36hcrz3ycs570sy3g4ns8679tc9xhp4qvu6652&#39;&gt;nevent1q…6652&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;💜🐾
    </content>
    <updated>2025-05-07T11:39:32Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsvz30nyy9cr7mrq56uww5wckvtj49a0k739dn43d453hxga3pp7nczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz8lw0mj</id>
    
      <title type="html">Thank you ser! 🫂</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsvz30nyy9cr7mrq56uww5wckvtj49a0k739dn43d453hxga3pp7nczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz8lw0mj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsv29ns4qhlghqq6386lt0k7anq8asrl4umzrhahl954ltngym9ceqa4p70m&#39;&gt;nevent1q…p70m&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thank you ser! 🫂
    </content>
    <updated>2025-05-07T11:32:37Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsyftlz77q0mshzd48n5znvrxfk0gs6qcv3knefwxzrkl53w86g5vszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhaz9tk</id>
    
      <title type="html">👀 Got room for one moar?</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsyftlz77q0mshzd48n5znvrxfk0gs6qcv3knefwxzrkl53w86g5vszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhaz9tk" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxu4gvac588sl3ul7slfqcwmcuj97vgksjk40wvda5junt63y7c5qypcmff&#39;&gt;nevent1q…cmff&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;👀 Got room for one moar? 
    </content>
    <updated>2025-05-07T11:22:01Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqswn7c6c5yf7702w4rpfyf69gm6dz3a2d2xmn3ncw2qnqw97evfj6gzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzfuuz7y</id>
    
      <title type="html">👀 #note12c6…q5vp</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqswn7c6c5yf7702w4rpfyf69gm6dz3a2d2xmn3ncw2qnqw97evfj6gzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzfuuz7y" />
    <content type="html">
      👀&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting  &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note12c6g4608p9dav25hgfdez3aqw0fu426zwvesxr5ex9dhp0c5kl8sh2q5vp&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note12c6…q5vp&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; lol&lt;br/&gt;&lt;a href=&#34;https://following.space/d/2irz1yazlnoy?p=623ed218de81311783656783d6ce690b521a89c4dc09f28962e5bfd4fa549249&#34;&gt;https://following.space/d/2irz1yazlnoy?p=623ed218de81311783656783d6ce690b521a89c4dc09f28962e5bfd4fa549249&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2025-05-07T11:21:10Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsfqr2dqgnucq9ltlaxyv9gc9uekkrtm5caqeazqrk8wfa9dv6ej0czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz03fj73</id>
    
      <title type="html">🫡</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsfqr2dqgnucq9ltlaxyv9gc9uekkrtm5caqeazqrk8wfa9dv6ej0czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz03fj73" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsp0vpllcrqfn0mz8v0xutsncyq3f0j6de8rem4a97qcsda834tx0gd6h48z&#39;&gt;nevent1q…h48z&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;🫡
    </content>
    <updated>2025-02-21T21:25:37Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs2qtv94c00k3pc9lhxlgdgp7v2ddazddp0gjes2uusz74mkra80rqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzr9yw8v</id>
    
      <title type="html">👀</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs2qtv94c00k3pc9lhxlgdgp7v2ddazddp0gjes2uusz74mkra80rqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzr9yw8v" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfyutlqd56zdsaqnlwn9wg3m2sk5ap69z0u6neulag32x26cpdx2g0k8qwa&#39;&gt;nevent1q…8qwa&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;👀
    </content>
    <updated>2023-12-23T03:42:54Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsvhk2ruv47xunuwnhasy2pgd6gluu603sylw6xmd9jvpvsxn3am0czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzrt4l6m</id>
    
      <title type="html">Mi familia 💜🐶</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsvhk2ruv47xunuwnhasy2pgd6gluu603sylw6xmd9jvpvsxn3am0czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzrt4l6m" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2ex2v6wvclecwhyqlys0qt5w5tn02jtga7p3t5nns8lxh3yzw08sv72j78&#39;&gt;nevent1q…2j78&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Mi familia 💜🐶
    </content>
    <updated>2023-09-29T12:15:21Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs9yc37xhnd3l5t67v4nrlaw2hvamjfr5rjp7nsc9l32nm7g2l72tczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz0cdg8q</id>
    
      <title type="html">Test bare note ID #note1dhe…gmgq</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs9yc37xhnd3l5t67v4nrlaw2hvamjfr5rjp7nsc9l32nm7g2l72tczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz0cdg8q" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0qltx4f2k6gdzy85v0u4mqq5uea6adyffkv7azyu4fanmj53eugqy3w4jy&#39;&gt;nevent1q…w4jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test bare note ID&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1dhegyrfsn9frpwxdxampwvhs7m9mxz6u97v2rug5dhahva2ujl2suwgmgq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1dhe…gmgq&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; &lt;p&gt;I thought it might be interesting to do a quick technical writeup of nostrdb and the new nostrdb profile searching. This is the first text search index within nostrdb, if you&amp;#39;re interested in the nitty gritty details of things, this article is for you!&lt;/p&gt;

&lt;p&gt;For the most part, nostrdb has been a copy of the design of strfry, in terms of its indices and multi-process architecture. strfry doesn&amp;#39;t support search (yet), so this is a novel feature of nostrdb. What is strfry? If it weren&amp;#39;t for strfry, nostr wouldn&amp;#39;t work. It is simply the best way to implement a nostr database and relay. SQL servers are just too slow to serve dynamic queries at scale.&lt;/p&gt;

&lt;p&gt;I wanted something like strfry that I could embed into native nostr clients like Damus, this is how nostrdb was born!&lt;/p&gt;

&lt;p&gt;First, let&amp;#39;s look at how nostrdb at a high level.&lt;/p&gt;

&lt;h1 id=&#34;nostrdb-2&#34;&gt;nostrdb&lt;/h1&gt;

&lt;p&gt;nostrdb is an embedded library for native nostr clients. It uses the Lightning-mapped database (LMDB) for very efficient querying. This allows it to skip SQL query parsing and query planning. We don&amp;#39;t really need all that with nostr. nostr search filters are a bit more restrictive, so we can build custom indices for the most common nostr queries. This is a huge win CPU-wise, nostr queries can be very dynamic, and skipping the query parsing and planning saves CPU and battery.&lt;/p&gt;

&lt;p&gt;Before we get into any of that, let&amp;#39;s look at how you would use the library from the highest level. The entrypoint for notes in nostrdb is the &lt;code&gt;ndb_process_event&lt;/code&gt; function. When you receive nostr events from another relay, this function is called for each event.&lt;/p&gt;

&lt;h2 id=&#34;event-processing-2&#34;&gt;Event processing&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ndb_process_event(&amp;#39;[&amp;#34;EVENT&amp;#34;,&amp;#34;subid&amp;#34;,{kind:1, ...}]&amp;#39;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We begin by queueing the event for processing in the multi-threaded ingester. This allows it to return immediately and not block the client.&lt;/p&gt;

&lt;p&gt;The ingester is multi-threaded because validating note signatures can be pretty slow. We want note processing to be as quick as possible so nostrdb doesn&amp;#39;t have a bottleneck here.&lt;/p&gt;

&lt;p&gt;nostrdb is very smart about not burning CPU when it doesn&amp;#39;t need to. The custom json parser will stop when it finds the note ID field, lookup that note in the database to see if we already have it, and then stop JSON parsing if we do. This saves CPU for large notes like contact lists, and skips the need to re-validate the signature as well. Even strfry doesn&amp;#39;t make this optimization, so nostrdb has a speed, cpu, and battery life advantage here.&lt;/p&gt;

&lt;p&gt;During the processing step, nostrdb will detect different note types such as profile metadata. It will look at the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;display_name&lt;/code&gt; field and add a custom index for searching user profiles. Since keys in LMDB are lexicographically sorted and support range queries, our profile search indices is simply (name &#43; pubkey &#43; created_at). This allows you to do a ranged key-lookup on &amp;#34;jb&amp;#34; and it will position the db cursor to the first record that starts with jb. LMDB uses a b&#43; tree, this is not a linear scan, so it is very fast! Eventually this index will be used for implementing nip-50 search on the nostrdb relay interface, which is coming sometime in the future.&lt;/p&gt;

&lt;p&gt;Once we&amp;#39;re done writing the indices and validating the note, we store nostr notes in a custom, compact binary format that is easy to access directly in memory from any programming language. We also do this with profile records by leveraging flatbuffers.&lt;/p&gt;

&lt;p&gt;So in the end, what does this achieve? It enables you to store as much nostr data as you want with near zero query and serialization overhead. Since the data stored in nostrdb is just flatbuffers, you can access data directly from the operating system&amp;#39;s page cache (just a pointer to memory) and from any programming language via flatbuffer&amp;#39;s schema and codegen tools. It&amp;#39;s so fast it will be guaranteed once of the fastest things in your codebase. You can even run it in your main UI thread so you can worry about other things such as UX and design without introducing complex async logic in your user interface.&lt;/p&gt;

&lt;h2 id=&#34;what-s-next-2&#34;&gt;What&amp;#39;s next&lt;/h2&gt;

&lt;p&gt;nostrdb is already partially integrated into Damus iOS. Damus uses nostrdb&amp;#39;s compact note format for storing notes in memory, but eventually everything will be switched to use nostrdb directly. The next version of Damus testflight will remove the in-memory and core-data profile cache and switch to nostrdb profiles. Damus currently has a complex in-memory trie data structure for profile searches, but it only knows about profiles it has seen during the current session. This is a common source of confusion, sometimes Damus doesn&amp;#39;t auto-complete profiles it has already seen sometime in the past. nostrdb profile searches will allow @ mentions and user search to find every profile it has ever seen in realtime. This will be a huge usability win for Damus and other clients looking to adopt nostrdb.&lt;/p&gt;

&lt;p&gt;Right now nostrdb exposes its functionality via direct function calls: &lt;code&gt;ndb_get_profile&lt;/code&gt;, etc. The plan is that most of these calls won&amp;#39;t be necessary. Once nostrdb has nostr filter parsing, it will be able to support dynamic queries of the kind you would expect from your typical nostr relay. This will turn nostrdb-powered clients into relays themselves.&lt;/p&gt;

&lt;p&gt;Once nostrdb is more relay-like, then we will be able to leverage strfry&amp;#39;s negentropy set-reconciliation queries to only fetch notes that we don&amp;#39;t already have. This will be insanely useful for reducing bandwidth usage when querying strfry relays. Eventually it may make the most sense to just let nostrdb do all the websocket querying behind the scenes, becoming a kind of local multiplexing relay.&lt;/p&gt;

&lt;p&gt;The future of nostrdb is very exciting. I plan on using it in Damus NoteDeck and Damus Android, why duplicate all this work in every client? nostrdb will make developing native clients much easier.&lt;/p&gt;

&lt;h2 id=&#34;support-2&#34;&gt;Support&lt;/h2&gt;

&lt;p&gt;Damus and nostrdb are mainly supported by donations. nostrdb is open source, MIT-licensed. Damus is GPL. We are dedicated to building the best and most free open source tech on nostr. If you would like to support our work, please consider &lt;a href=&#34;https://store.damus.io&#34;&gt;buying our merch&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Thanks for getting this far! Until next time...&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2023-09-20T21:40:24Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsg32yjufsc3p300hk83extyrkf58qv76t9yc7c9mw6n59mhh22knszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz8n34fu</id>
    
      <title type="html">Test @note #note1dhe…gmgq</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsg32yjufsc3p300hk83extyrkf58qv76t9yc7c9mw6n59mhh22knszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz8n34fu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0qltx4f2k6gdzy85v0u4mqq5uea6adyffkv7azyu4fanmj53eugqy3w4jy&#39;&gt;nevent1q…w4jy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test @note&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1dhegyrfsn9frpwxdxampwvhs7m9mxz6u97v2rug5dhahva2ujl2suwgmgq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1dhe…gmgq&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; &lt;p&gt;I thought it might be interesting to do a quick technical writeup of nostrdb and the new nostrdb profile searching. This is the first text search index within nostrdb, if you&amp;#39;re interested in the nitty gritty details of things, this article is for you!&lt;/p&gt;

&lt;p&gt;For the most part, nostrdb has been a copy of the design of strfry, in terms of its indices and multi-process architecture. strfry doesn&amp;#39;t support search (yet), so this is a novel feature of nostrdb. What is strfry? If it weren&amp;#39;t for strfry, nostr wouldn&amp;#39;t work. It is simply the best way to implement a nostr database and relay. SQL servers are just too slow to serve dynamic queries at scale.&lt;/p&gt;

&lt;p&gt;I wanted something like strfry that I could embed into native nostr clients like Damus, this is how nostrdb was born!&lt;/p&gt;

&lt;p&gt;First, let&amp;#39;s look at how nostrdb at a high level.&lt;/p&gt;

&lt;h1 id=&#34;nostrdb-5&#34;&gt;nostrdb&lt;/h1&gt;

&lt;p&gt;nostrdb is an embedded library for native nostr clients. It uses the Lightning-mapped database (LMDB) for very efficient querying. This allows it to skip SQL query parsing and query planning. We don&amp;#39;t really need all that with nostr. nostr search filters are a bit more restrictive, so we can build custom indices for the most common nostr queries. This is a huge win CPU-wise, nostr queries can be very dynamic, and skipping the query parsing and planning saves CPU and battery.&lt;/p&gt;

&lt;p&gt;Before we get into any of that, let&amp;#39;s look at how you would use the library from the highest level. The entrypoint for notes in nostrdb is the &lt;code&gt;ndb_process_event&lt;/code&gt; function. When you receive nostr events from another relay, this function is called for each event.&lt;/p&gt;

&lt;h2 id=&#34;event-processing-5&#34;&gt;Event processing&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ndb_process_event(&amp;#39;[&amp;#34;EVENT&amp;#34;,&amp;#34;subid&amp;#34;,{kind:1, ...}]&amp;#39;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We begin by queueing the event for processing in the multi-threaded ingester. This allows it to return immediately and not block the client.&lt;/p&gt;

&lt;p&gt;The ingester is multi-threaded because validating note signatures can be pretty slow. We want note processing to be as quick as possible so nostrdb doesn&amp;#39;t have a bottleneck here.&lt;/p&gt;

&lt;p&gt;nostrdb is very smart about not burning CPU when it doesn&amp;#39;t need to. The custom json parser will stop when it finds the note ID field, lookup that note in the database to see if we already have it, and then stop JSON parsing if we do. This saves CPU for large notes like contact lists, and skips the need to re-validate the signature as well. Even strfry doesn&amp;#39;t make this optimization, so nostrdb has a speed, cpu, and battery life advantage here.&lt;/p&gt;

&lt;p&gt;During the processing step, nostrdb will detect different note types such as profile metadata. It will look at the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;display_name&lt;/code&gt; field and add a custom index for searching user profiles. Since keys in LMDB are lexicographically sorted and support range queries, our profile search indices is simply (name &#43; pubkey &#43; created_at). This allows you to do a ranged key-lookup on &amp;#34;jb&amp;#34; and it will position the db cursor to the first record that starts with jb. LMDB uses a b&#43; tree, this is not a linear scan, so it is very fast! Eventually this index will be used for implementing nip-50 search on the nostrdb relay interface, which is coming sometime in the future.&lt;/p&gt;

&lt;p&gt;Once we&amp;#39;re done writing the indices and validating the note, we store nostr notes in a custom, compact binary format that is easy to access directly in memory from any programming language. We also do this with profile records by leveraging flatbuffers.&lt;/p&gt;

&lt;p&gt;So in the end, what does this achieve? It enables you to store as much nostr data as you want with near zero query and serialization overhead. Since the data stored in nostrdb is just flatbuffers, you can access data directly from the operating system&amp;#39;s page cache (just a pointer to memory) and from any programming language via flatbuffer&amp;#39;s schema and codegen tools. It&amp;#39;s so fast it will be guaranteed once of the fastest things in your codebase. You can even run it in your main UI thread so you can worry about other things such as UX and design without introducing complex async logic in your user interface.&lt;/p&gt;

&lt;h2 id=&#34;what-s-next-5&#34;&gt;What&amp;#39;s next&lt;/h2&gt;

&lt;p&gt;nostrdb is already partially integrated into Damus iOS. Damus uses nostrdb&amp;#39;s compact note format for storing notes in memory, but eventually everything will be switched to use nostrdb directly. The next version of Damus testflight will remove the in-memory and core-data profile cache and switch to nostrdb profiles. Damus currently has a complex in-memory trie data structure for profile searches, but it only knows about profiles it has seen during the current session. This is a common source of confusion, sometimes Damus doesn&amp;#39;t auto-complete profiles it has already seen sometime in the past. nostrdb profile searches will allow @ mentions and user search to find every profile it has ever seen in realtime. This will be a huge usability win for Damus and other clients looking to adopt nostrdb.&lt;/p&gt;

&lt;p&gt;Right now nostrdb exposes its functionality via direct function calls: &lt;code&gt;ndb_get_profile&lt;/code&gt;, etc. The plan is that most of these calls won&amp;#39;t be necessary. Once nostrdb has nostr filter parsing, it will be able to support dynamic queries of the kind you would expect from your typical nostr relay. This will turn nostrdb-powered clients into relays themselves.&lt;/p&gt;

&lt;p&gt;Once nostrdb is more relay-like, then we will be able to leverage strfry&amp;#39;s negentropy set-reconciliation queries to only fetch notes that we don&amp;#39;t already have. This will be insanely useful for reducing bandwidth usage when querying strfry relays. Eventually it may make the most sense to just let nostrdb do all the websocket querying behind the scenes, becoming a kind of local multiplexing relay.&lt;/p&gt;

&lt;p&gt;The future of nostrdb is very exciting. I plan on using it in Damus NoteDeck and Damus Android, why duplicate all this work in every client? nostrdb will make developing native clients much easier.&lt;/p&gt;

&lt;h2 id=&#34;support-5&#34;&gt;Support&lt;/h2&gt;

&lt;p&gt;Damus and nostrdb are mainly supported by donations. nostrdb is open source, MIT-licensed. Damus is GPL. We are dedicated to building the best and most free open source tech on nostr. If you would like to support our work, please consider &lt;a href=&#34;https://store.damus.io&#34;&gt;buying our merch&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Thanks for getting this far! Until next time...&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2023-09-20T21:39:42Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs0qltx4f2k6gdzy85v0u4mqq5uea6adyffkv7azyu4fanmj53eugqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzrg97m3</id>
    
      <title type="html">Test #naddr1qq…6u3g</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs0qltx4f2k6gdzy85v0u4mqq5uea6adyffkv7azyu4fanmj53eugqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzrg97m3" />
    <content type="html">
      Test &lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/naddr1qqxnzd3ex5eryvfkx56nydesqgsr9cvzwc652r4m83d86ykplrnm9dg5gwdvzzn8ameanlvut35wy3grqsqqqa282m6u3g&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;naddr1qq…6u3g&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; &lt;p&gt;I thought it might be interesting to do a quick technical writeup of nostrdb and the new nostrdb profile searching. This is the first text search index within nostrdb, if you&amp;#39;re interested in the nitty gritty details of things, this article is for you!&lt;/p&gt;

&lt;p&gt;For the most part, nostrdb has been a copy of the design of strfry, in terms of its indices and multi-process architecture. strfry doesn&amp;#39;t support search (yet), so this is a novel feature of nostrdb. What is strfry? If it weren&amp;#39;t for strfry, nostr wouldn&amp;#39;t work. It is simply the best way to implement a nostr database and relay. SQL servers are just too slow to serve dynamic queries at scale.&lt;/p&gt;

&lt;p&gt;I wanted something like strfry that I could embed into native nostr clients like Damus, this is how nostrdb was born!&lt;/p&gt;

&lt;p&gt;First, let&amp;#39;s look at how nostrdb at a high level.&lt;/p&gt;

&lt;h1 id=&#34;nostrdb-8&#34;&gt;nostrdb&lt;/h1&gt;

&lt;p&gt;nostrdb is an embedded library for native nostr clients. It uses the Lightning-mapped database (LMDB) for very efficient querying. This allows it to skip SQL query parsing and query planning. We don&amp;#39;t really need all that with nostr. nostr search filters are a bit more restrictive, so we can build custom indices for the most common nostr queries. This is a huge win CPU-wise, nostr queries can be very dynamic, and skipping the query parsing and planning saves CPU and battery.&lt;/p&gt;

&lt;p&gt;Before we get into any of that, let&amp;#39;s look at how you would use the library from the highest level. The entrypoint for notes in nostrdb is the &lt;code&gt;ndb_process_event&lt;/code&gt; function. When you receive nostr events from another relay, this function is called for each event.&lt;/p&gt;

&lt;h2 id=&#34;event-processing-8&#34;&gt;Event processing&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ndb_process_event(&amp;#39;[&amp;#34;EVENT&amp;#34;,&amp;#34;subid&amp;#34;,{kind:1, ...}]&amp;#39;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We begin by queueing the event for processing in the multi-threaded ingester. This allows it to return immediately and not block the client.&lt;/p&gt;

&lt;p&gt;The ingester is multi-threaded because validating note signatures can be pretty slow. We want note processing to be as quick as possible so nostrdb doesn&amp;#39;t have a bottleneck here.&lt;/p&gt;

&lt;p&gt;nostrdb is very smart about not burning CPU when it doesn&amp;#39;t need to. The custom json parser will stop when it finds the note ID field, lookup that note in the database to see if we already have it, and then stop JSON parsing if we do. This saves CPU for large notes like contact lists, and skips the need to re-validate the signature as well. Even strfry doesn&amp;#39;t make this optimization, so nostrdb has a speed, cpu, and battery life advantage here.&lt;/p&gt;

&lt;p&gt;During the processing step, nostrdb will detect different note types such as profile metadata. It will look at the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;display_name&lt;/code&gt; field and add a custom index for searching user profiles. Since keys in LMDB are lexicographically sorted and support range queries, our profile search indices is simply (name &#43; pubkey &#43; created_at). This allows you to do a ranged key-lookup on &amp;#34;jb&amp;#34; and it will position the db cursor to the first record that starts with jb. LMDB uses a b&#43; tree, this is not a linear scan, so it is very fast! Eventually this index will be used for implementing nip-50 search on the nostrdb relay interface, which is coming sometime in the future.&lt;/p&gt;

&lt;p&gt;Once we&amp;#39;re done writing the indices and validating the note, we store nostr notes in a custom, compact binary format that is easy to access directly in memory from any programming language. We also do this with profile records by leveraging flatbuffers.&lt;/p&gt;

&lt;p&gt;So in the end, what does this achieve? It enables you to store as much nostr data as you want with near zero query and serialization overhead. Since the data stored in nostrdb is just flatbuffers, you can access data directly from the operating system&amp;#39;s page cache (just a pointer to memory) and from any programming language via flatbuffer&amp;#39;s schema and codegen tools. It&amp;#39;s so fast it will be guaranteed once of the fastest things in your codebase. You can even run it in your main UI thread so you can worry about other things such as UX and design without introducing complex async logic in your user interface.&lt;/p&gt;

&lt;h2 id=&#34;what-s-next-8&#34;&gt;What&amp;#39;s next&lt;/h2&gt;

&lt;p&gt;nostrdb is already partially integrated into Damus iOS. Damus uses nostrdb&amp;#39;s compact note format for storing notes in memory, but eventually everything will be switched to use nostrdb directly. The next version of Damus testflight will remove the in-memory and core-data profile cache and switch to nostrdb profiles. Damus currently has a complex in-memory trie data structure for profile searches, but it only knows about profiles it has seen during the current session. This is a common source of confusion, sometimes Damus doesn&amp;#39;t auto-complete profiles it has already seen sometime in the past. nostrdb profile searches will allow @ mentions and user search to find every profile it has ever seen in realtime. This will be a huge usability win for Damus and other clients looking to adopt nostrdb.&lt;/p&gt;

&lt;p&gt;Right now nostrdb exposes its functionality via direct function calls: &lt;code&gt;ndb_get_profile&lt;/code&gt;, etc. The plan is that most of these calls won&amp;#39;t be necessary. Once nostrdb has nostr filter parsing, it will be able to support dynamic queries of the kind you would expect from your typical nostr relay. This will turn nostrdb-powered clients into relays themselves.&lt;/p&gt;

&lt;p&gt;Once nostrdb is more relay-like, then we will be able to leverage strfry&amp;#39;s negentropy set-reconciliation queries to only fetch notes that we don&amp;#39;t already have. This will be insanely useful for reducing bandwidth usage when querying strfry relays. Eventually it may make the most sense to just let nostrdb do all the websocket querying behind the scenes, becoming a kind of local multiplexing relay.&lt;/p&gt;

&lt;p&gt;The future of nostrdb is very exciting. I plan on using it in Damus NoteDeck and Damus Android, why duplicate all this work in every client? nostrdb will make developing native clients much easier.&lt;/p&gt;

&lt;h2 id=&#34;support-8&#34;&gt;Support&lt;/h2&gt;

&lt;p&gt;Damus and nostrdb are mainly supported by donations. nostrdb is open source, MIT-licensed. Damus is GPL. We are dedicated to building the best and most free open source tech on nostr. If you would like to support our work, please consider &lt;a href=&#34;https://store.damus.io&#34;&gt;buying our merch&lt;/a&gt; !&lt;/p&gt;

&lt;p&gt;Thanks for getting this far! Until next time...&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2023-09-20T21:37:06Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsxp87uvfy557e67zau94ww5mcjn7adut8xdf42arvs4esnq5n6k2czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzd8sv0y</id>
    
      <title>Nostr event nevent1qqsxp87uvfy557e67zau94ww5mcjn7adut8xdf42arvs4esnq5n6k2czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzd8sv0y</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsxp87uvfy557e67zau94ww5mcjn7adut8xdf42arvs4esnq5n6k2czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzd8sv0y" />
    <content type="html">
      hello world
    </content>
    <updated>2023-09-19T22:15:33Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsqhfe0qs25ny5mr3gez0slpvxed9l2lnzahqawmyqrje6szesvyuczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzd2w820</id>
    
      <title type="html">A poop a day keeps the vet away. 🐕</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsqhfe0qs25ny5mr3gez0slpvxed9l2lnzahqawmyqrje6szesvyuczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzd2w820" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvdjtfdrtws39wq04adupsvuc39gy2kv05mwt3tggwcpxzsgdqessfyf27q&#39;&gt;nevent1q…f27q&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;A poop a day keeps the vet away. 🐕
    </content>
    <updated>2023-09-07T00:03:02Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsxqvfhfuncvaalc6ua8dc2sukqlhtjhdkge5zzd3nrcrcau4ng0zczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzzqs2ag</id>
    
      <title type="html">Nice to meet another good boy around these parts. 🐶</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsxqvfhfuncvaalc6ua8dc2sukqlhtjhdkge5zzd3nrcrcau4ng0zczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzzqs2ag" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0gan8fv3utpeus6kteuhrh3ea35kswdjv0s30z3z4eg33y86afkqrjzcuf&#39;&gt;nevent1q…zcuf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Nice to meet another good boy around these parts. 🐶 
    </content>
    <updated>2023-09-02T01:28:04Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqstwpvg6uh5nmt3vzd5ky5l22e0cqp7mjl6v3hmquysm9cp2yecmuszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgdhv0w</id>
    
      <title>Nostr event nevent1qqstwpvg6uh5nmt3vzd5ky5l22e0cqp7mjl6v3hmquysm9cp2yecmuszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgdhv0w</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqstwpvg6uh5nmt3vzd5ky5l22e0cqp7mjl6v3hmquysm9cp2yecmuszyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgdhv0w" />
    <content type="html">
       &lt;img src=&#34;https://cdn.nostr.build/i/750268112dd12db988be7f7a0c2a7e29289841d1d2b8ce23406187385023afd9.jpg&#34;&gt; &lt;br/&gt;&lt;br/&gt;This is a test post for formatting and layout. &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://youtu.be/dQw4w9WgXcQ&#34;&gt;https://youtu.be/dQw4w9WgXcQ&lt;/a&gt;
    </content>
    <updated>2023-08-03T18:23:03Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsgpd5kq6dmksx9clj97jmzpmpc67s7pfuqdekynsf5qt0z8g65tuczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzwke787</id>
    
      <title type="html">Test 6</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsgpd5kq6dmksx9clj97jmzpmpc67s7pfuqdekynsf5qt0z8g65tuczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzwke787" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egltmmlq&#39;&gt;nevent1q…mmlq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 6
    </content>
    <updated>2023-07-29T16:15:15Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsw7pefe8jt8l0y9sa5n3hvhmuj70ymptqwxr5aff8qh5jc0g5dl7qzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz5j6cfp</id>
    
      <title type="html">Test 6</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsw7pefe8jt8l0y9sa5n3hvhmuj70ymptqwxr5aff8qh5jc0g5dl7qzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz5j6cfp" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egltmmlq&#39;&gt;nevent1q…mmlq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 6
    </content>
    <updated>2023-07-29T16:14:35Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsdfz5h50c344s688n6l6qp5uq3japvrfn7qgsp2k5thcweva6fhdqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhtyf58</id>
    
      <title type="html">Test 5</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsdfz5h50c344s688n6l6qp5uq3japvrfn7qgsp2k5thcweva6fhdqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhtyf58" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfghk9dddaumaa6a75xzqdwv83egyjcz4rdy9ln8c242n447jf7zqyzqcvr&#39;&gt;nevent1q…qcvr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 5
    </content>
    <updated>2023-07-29T16:14:07Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsfghk9dddaumaa6a75xzqdwv83egyjcz4rdy9ln8c242n447jf7zqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzthw4kj</id>
    
      <title type="html">Test 4</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsfghk9dddaumaa6a75xzqdwv83egyjcz4rdy9ln8c242n447jf7zqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzthw4kj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvlu9h66zecxk5xwujn4540m2hrxh55tuf4t6fka0w7x2ztkulj9cst56qq&#39;&gt;nevent1q…56qq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 4
    </content>
    <updated>2023-07-29T16:13:42Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqstlaqc30sju53q8nrj0qp8epj6zykyg7lfjtk6lcps44gsk5xvmxczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz0lyuhl</id>
    
      <title type="html">Test 3</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqstlaqc30sju53q8nrj0qp8epj6zykyg7lfjtk6lcps44gsk5xvmxczyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz0lyuhl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvlu9h66zecxk5xwujn4540m2hrxh55tuf4t6fka0w7x2ztkulj9cst56qq&#39;&gt;nevent1q…56qq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 3
    </content>
    <updated>2023-07-29T16:13:19Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsvlu9h66zecxk5xwujn4540m2hrxh55tuf4t6fka0w7x2ztkulj9czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgn45e0</id>
    
      <title type="html">Test 2</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsvlu9h66zecxk5xwujn4540m2hrxh55tuf4t6fka0w7x2ztkulj9czyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgn45e0" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egltmmlq&#39;&gt;nevent1q…mmlq&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Test 2
    </content>
    <updated>2023-07-29T16:13:08Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgterkg</id>
    
      <title>Nostr event nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgterkg</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsqqcdp822qel60tqvqmmkw0ll6pj97g86un2zyud9yvendnyk59egzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzgterkg" />
    <content type="html">
      Test post 1
    </content>
    <updated>2023-07-29T16:12:53Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqszzscxxysxvgk0wzer9l3nrts7h75lyg9vedk0hr5eqdf0esufeyqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz04afwd</id>
    
      <title type="html">#note1qzz…wd3e Testing Highlighter.com website with nsecBunker.</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqszzscxxysxvgk0wzer9l3nrts7h75lyg9vedk0hr5eqdf0esufeyqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz04afwd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqpprev99at74g9gkamchxh3z2hfc8lwsqnkdletp5u0m609dgt3qc7xy7r&#39;&gt;nevent1q…xy7r&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1qzz8jc2t6ha2s23dmh3wd0zy4wns07aqp8vmljkrfclh5726shzq79wd3e&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1qzz…wd3e&lt;/a&gt;&lt;/span&gt;&lt;br/&gt; &lt;/div&gt; I&#39;ve been working on a new electronic cash system that&#39;s fully&lt;br/&gt;peer-to-peer, with no trusted third party.&lt;br/&gt;&lt;br/&gt;The paper is available at:&lt;br/&gt;&lt;a href=&#34;http://www.bitcoin.org/bitcoin.pdf&#34;&gt;http://www.bitcoin.org/bitcoin.pdf&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;The main properties:&lt;br/&gt;Double-spending is prevented with a peer-to-peer network.&lt;br/&gt;No mint or other trusted parties.&lt;br/&gt;Participants can be anonymous.&lt;br/&gt;New coins are made from Hashcash style proof-of-work.&lt;br/&gt;The proof-of-work for new coin generation also powers the&lt;br/&gt;network to prevent double-spending. &lt;/blockquote&gt;Testing Highlighter.com website with nsecBunker. 
    </content>
    <updated>2023-07-26T23:37:17Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqspkaesnq9xfc6x7xs33kfv8vjfzajdgerctuz28krfp0q8jzttlvqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhypn9m</id>
    
      <title>Nostr event nevent1qqspkaesnq9xfc6x7xs33kfv8vjfzajdgerctuz28krfp0q8jzttlvqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhypn9m</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqspkaesnq9xfc6x7xs33kfv8vjfzajdgerctuz28krfp0q8jzttlvqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzhypn9m" />
    <content type="html">
      Testing nsecBunker login in Nostur 
    </content>
    <updated>2023-06-30T19:58:02Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs2hezjjyptexckd9vqdll8elpsnre7ake7mlhmjccthcnh0glav5szyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzpt2uul</id>
    
      <title>Nostr event nevent1qqs2hezjjyptexckd9vqdll8elpsnre7ake7mlhmjccthcnh0glav5szyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzpt2uul</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs2hezjjyptexckd9vqdll8elpsnre7ake7mlhmjccthcnh0glav5szyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzpt2uul" />
    <content type="html">
      Nsec bunker test 3
    </content>
    <updated>2023-06-02T03:06:33Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsg47x7jfv353rtktpr8aq57vt29tjcyt3ysklasw2xgerp0uhm9lqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzvqv5zc</id>
    
      <title>Nostr event nevent1qqsg47x7jfv353rtktpr8aq57vt29tjcyt3ysklasw2xgerp0uhm9lqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzvqv5zc</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsg47x7jfv353rtktpr8aq57vt29tjcyt3ysklasw2xgerp0uhm9lqzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggzvqv5zc" />
    <content type="html">
      I’m not puppo
    </content>
    <updated>2023-06-02T02:34:21Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs28jwnmzja4vplpusfw8jpxxgf6qn0l4kvapkgp607sn5zj00rvhgzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz26nv03</id>
    
      <title>Nostr event nevent1qqs28jwnmzja4vplpusfw8jpxxgf6qn0l4kvapkgp607sn5zj00rvhgzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz26nv03</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs28jwnmzja4vplpusfw8jpxxgf6qn0l4kvapkgp607sn5zj00rvhgzyq8sy9l0exkakktumkrnh623qq48xgtj0j9tvacv838h3xrvnwggz26nv03" />
    <content type="html">
      Test 1
    </content>
    <updated>2023-06-02T01:41:06Z</updated>
  </entry>

</feed>