<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-05-18T01:03:14Z</updated>
  <generator>https://nostr.now</generator>

  <title>Nostr notes by satria</title>
  <author>
    <name>satria</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://nostr.now/npub1gdacm0nfzut5ewz9h4nmyqzvp3e5exulyqyr7jy6uj7ahd3zlz0qxl0l0q.rss" />
  <link href="https://nostr.now/npub1gdacm0nfzut5ewz9h4nmyqzvp3e5exulyqyr7jy6uj7ahd3zlz0qxl0l0q" />
  <id>https://nostr.now/npub1gdacm0nfzut5ewz9h4nmyqzvp3e5exulyqyr7jy6uj7ahd3zlz0qxl0l0q</id>
  <icon>https://blossom.primal.net/2b58aa933a3906ad00396bb122f99f01c8dd6f47440db29b72af1ccf6ab146a4.jpg</icon>
  <logo>https://blossom.primal.net/2b58aa933a3906ad00396bb122f99f01c8dd6f47440db29b72af1ccf6ab146a4.jpg</logo>




  <entry>
    <id>https://nostr.now/nevent1qqsqz0ytagnchr2qchydedct3wzdkzpnjel5qu099pwf4mz00d8j9lczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufultfkdh</id>
    
      <title type="html">Another example. Ritween. Using &amp;#34;Gemini 3.8 Flash&amp;#34; 😂 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqz0ytagnchr2qchydedct3wzdkzpnjel5qu099pwf4mz00d8j9lczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufultfkdh" />
    <content type="html">
      Another example. Ritween.  Using &amp;#34;Gemini 3.8 Flash&amp;#34;  😂 &lt;video controls width=&#34;100%&#34; class=&#34;max-h-[90vh] bg-neutral-300 dark:bg-zinc-700&#34;&gt;&lt;source src=&#34;https://blossom.primal.net/fed5fab7ea1bc0c624f2da06630f2d77cfd08a1869782a9df927556459ff3713.mp4&#34;&gt;&lt;/video&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;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;/nevent1qvzqqqqqqypzqsmm3klxj9chfjuyt0t8kgqycrrnfjde7gqg8ayf4e9amwmz97y7qywhwumn8ghj7mn0wd68ytfsxyh8jcttd95x7mnwv5hxxmmd9uq3samnwvaz7tmjv4kxz7fwwdshgmtp0p6zu7re0ghsqgpxz4a4uyxk4hmh365uaadqcws59p5qtluzh5prvwr2l8lem2ldqghnfuqp&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…fuqp&lt;/a&gt;&lt;/span&gt;  &lt;/div&gt; From source code to a finished video.&lt;br/&gt;&lt;br/&gt;Meet Ritween: a code-first video framework that lets AI coding agents create motion graphics, arrange audio, preview scenes, and export MP4. Powered by WebGPU, running locally.&lt;br/&gt;&lt;br/&gt;This demo was made with Ritween itself.&lt;br/&gt;&lt;br/&gt;Built by Nexifle Lab. &lt;br/&gt;&lt;br/&gt;🔗 &lt;a href=&#34;https://github.com/nexifle/ritween&#34;&gt;https://github.com/nexifle/ritween&lt;/a&gt;&lt;br/&gt;🔗 &lt;a href=&#34;https://ritween.nexifle.com&#34;&gt;https://ritween.nexifle.com&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;video controls width=&#34;100%&#34; class=&#34;max-h-[90vh] bg-neutral-300 dark:bg-zinc-700&#34;&gt;&lt;source src=&#34;https://blossom.primal.net/271e6ee68bfb34dcc2bf734392f91e0b951ee7106d7b379eb1af35aebfee52e6.mp4&#34;&gt;&lt;/video&gt; &lt;br/&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-10-28T11:48:43Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyk6wnxgafq2k495ecy2dhgd340cmxxh5c397c3kxh0u8t3cvvd6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufud7xc78</id>
    
      <title type="html">you’re right, there&amp;#39;s some overlap. Ritween uses WebGPU for ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyk6wnxgafq2k495ecy2dhgd340cmxxh5c397c3kxh0u8t3cvvd6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufud7xc78" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsydf6ja7hmr2qmprutyjgktgt27ws70qwypwtcml7feawvqmtk9zsys2kdj&#39;&gt;nevent1q…2kdj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;you’re right, there&amp;#39;s some overlap. Ritween uses WebGPU for custom visuals and codecs built into the browser for export, so it doesn&amp;#39;t need ffmpeg. HyperFrames uses html and includes a visual timeline editor. it&amp;#39;s more mature and has more features; Ritween is still at the proof of concept stage
    </content>
    <updated>2026-10-28T11:42:21Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszv9tmtcgddt0h0r4fem66psapg2rgqhlc90gzxcux470lnk476qszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu83d8yd</id>
    
      <title type="html">From source code to a finished video. Meet Ritween: a code-first ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszv9tmtcgddt0h0r4fem66psapg2rgqhlc90gzxcux470lnk476qszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu83d8yd" />
    <content type="html">
      From source code to a finished video.&lt;br/&gt;&lt;br/&gt;Meet Ritween: a code-first video framework that lets AI coding agents create motion graphics, arrange audio, preview scenes, and export MP4. Powered by WebGPU, running locally.&lt;br/&gt;&lt;br/&gt;This demo was made with Ritween itself.&lt;br/&gt;&lt;br/&gt;Built by Nexifle Lab. &lt;br/&gt;&lt;br/&gt;🔗 &lt;a href=&#34;https://github.com/nexifle/ritween&#34;&gt;https://github.com/nexifle/ritween&lt;/a&gt;&lt;br/&gt;🔗 &lt;a href=&#34;https://ritween.nexifle.com&#34;&gt;https://ritween.nexifle.com&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;video controls width=&#34;100%&#34; class=&#34;max-h-[90vh] bg-neutral-300 dark:bg-zinc-700&#34;&gt;&lt;source src=&#34;https://blossom.primal.net/271e6ee68bfb34dcc2bf734392f91e0b951ee7106d7b379eb1af35aebfee52e6.mp4&#34;&gt;&lt;/video&gt; &lt;br/&gt;
    </content>
    <updated>2026-10-28T05:34:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst3drefzvc5wkufapqqn2tee027ld7p5lysdnhyz4ywnu5awjrt2qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufue2uq0m</id>
    
      <title type="html">You’re building an agent that will never forget you. Here’s ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst3drefzvc5wkufapqqn2tee027ld7p5lysdnhyz4ywnu5awjrt2qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufue2uq0m" />
    <content type="html">
      You’re building an agent that will never forget you. Here’s the exact recipe VictorTaelin dropped for OptChat — one endless chat that’s literally your whole memory.&lt;br/&gt;&lt;br/&gt;Copy this recipe from the gist: &lt;a href=&#34;https://gist.github.com/VictorTaelin/91837951a5ce5b38f341ec1ba1df6449&#34;&gt;https://gist.github.com/VictorTaelin/91837951a5ce5b38f341ec1ba1df6449&lt;/a&gt;  &lt;br/&gt;- Append-only JSONL log (chat &#43; tree)  &lt;br/&gt;- Background compactor builds binary summary tree (~512-byte lines, target 128 KB view)  &lt;br/&gt;- Fresh start every turn &#43; zoom-to-original&lt;br/&gt;&lt;br/&gt;Pros:&lt;br/&gt;- Infinite memory, zero rot  &lt;br/&gt;- Instructions &amp;amp; history stick forever  &lt;br/&gt;- Costs actually drop  &lt;br/&gt;- Local &amp;amp; private on your Mini  &lt;br/&gt;- Manual zoom on any summary&lt;br/&gt;&lt;br/&gt;Use Case?&lt;br/&gt;Keep AI as your permanent memory for campaigns, algorithms, life decisions, and long-running agents (no /compact ever).
    </content>
    <updated>2026-10-08T00:10:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrgu4tarwuk2jdhlmf6d2legsupln92e7hnvxx84tagnjp5ewj8eszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufucv6agm</id>
    
      <title>Nostr event nevent1qqsrgu4tarwuk2jdhlmf6d2legsupln92e7hnvxx84tagnjp5ewj8eszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufucv6agm</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrgu4tarwuk2jdhlmf6d2legsupln92e7hnvxx84tagnjp5ewj8eszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufucv6agm" />
    <content type="html">
      🙏 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/b47be31afc7edfeff333774006b0cd4c3845f3cf0c49db84098e69be9429a39d.jpg&#34;&gt; 
    </content>
    <updated>2026-09-06T08:44:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsydnj9z35qvp7wq4cyzdlxlznsqn64kajy2s3j44tx9c5t39kh3wqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufumflvu5</id>
    
      <title type="html">Random just-for-fun project: Real-Time Smartphone Gyroscope ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsydnj9z35qvp7wq4cyzdlxlznsqn64kajy2s3j44tx9c5t39kh3wqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufumflvu5" />
    <content type="html">
      Random just-for-fun project: Real-Time Smartphone Gyroscope Telemetry &amp;amp; 3D Spatial Visualizer. 😂&lt;br/&gt;&lt;br/&gt;Honestly, I dont have a specific use case for it yet, I just built it because I thought it would be fun.&lt;br/&gt;&lt;br/&gt;But now I&amp;#39;m curious: what do you think this could be used for? 👀&lt;br/&gt;&lt;br/&gt; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;video controls width=&#34;100%&#34; class=&#34;max-h-[90vh] bg-neutral-300 dark:bg-zinc-700&#34;&gt;&lt;source src=&#34;https://blossom.primal.net/a705dd85f8840f69ebd900878eee20985c87d1db439134beda02621b07d92ceb.mp4&#34;&gt;&lt;/video&gt;
    </content>
    <updated>2026-08-30T01:45:47Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqd2cz664ca9sz8gv06yy6ngp0sytt66ke2cv5dc8krd595cldlzszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut8h4vg</id>
    
      <title type="html">Just in: Grok 4.6 also got one banked reset ticket ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqd2cz664ca9sz8gv06yy6ngp0sytt66ke2cv5dc8krd595cldlzszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut8h4vg" />
    <content type="html">
       Just in: Grok 4.6 also got one banked reset ticket&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/d7193968d2c711e3095f9f7bb7eb9265de215412064cbb56037d0e94e9f686e0.png&#34;&gt;  
    </content>
    <updated>2026-08-13T08:30:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszx4qjpd85s9cztvkgxxrdvn2u5gm03e0r7k8kkvnmdhx4xx8xcvgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufusepefh</id>
    
      <title type="html">DeepSeek silently released its new model, DeepSeek-V4-Pro-0813, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszx4qjpd85s9cztvkgxxrdvn2u5gm03e0r7k8kkvnmdhx4xx8xcvgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufusepefh" />
    <content type="html">
      DeepSeek silently released its new model, DeepSeek-V4-Pro-0813, at an insanely low token price. Will the result be gibberish like the flash version?  &lt;img src=&#34;https://blossom.primal.net/32d99d05f8c36f152568c295f38372098dcaab55e545de70fc263f2c0dde24bf.png&#34;&gt;  
    </content>
    <updated>2026-08-13T00:16:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2ruthsgqmytv66m3zg4cppq424lm5mymtgwrx6st3mmqka8fwncczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuensy89</id>
    
      <title type="html">Really like using Grok Build, especially with the Grok 4.5 model; ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2ruthsgqmytv66m3zg4cppq424lm5mymtgwrx6st3mmqka8fwncczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuensy89" />
    <content type="html">
      Really like using Grok Build, especially with the Grok 4.5 model; it&amp;#39;s very impressive. But the usage is ... 😌
    </content>
    <updated>2026-07-31T06:19:04Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8l82tswnwqg4svk4gmnnq69p3hmq6mepc68aufelnp3l0ggr3m2czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug5j0c9</id>
    
      <title type="html">After 8 months serving a nostr relay ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8l82tswnwqg4svk4gmnnq69p3hmq6mepc68aufelnp3l0ggr3m2czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug5j0c9" />
    <content type="html">
      After 8 months serving a nostr relay   &lt;img src=&#34;https://blossom.primal.net/6a19fb4495b95bc629b835f1bdc4ef3534703531b992ae231fcd532b097257fe.png&#34;&gt;  
    </content>
    <updated>2026-07-29T00:35:54Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsppsxeur997zkkl3805af3mtfl7hp00ntr70dcqy5a4sym6wequ8czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupt3stn</id>
    
      <title type="html">I visited the History Museum of the Indonesian People’s ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsppsxeur997zkkl3805af3mtfl7hp00ntr70dcqy5a4sym6wequ8czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupt3stn" />
    <content type="html">
      I visited the History Museum of the Indonesian People’s Struggle in my city. It’s quite mind-boggling to imagine how the Indonesian people fought back then with only makeshift weapons against the British and Gurkha troops, who were the victors of World War II. They successfully repelled the British convoy over a 12-kilometer stretch as it was advancing toward Bandung from the direction of Bogor, thwarting their advance. This fierce resistance is documented in the British military history book, The Fighting Cock: The Story of the 23rd Indian Division by Colonel A.J.F. Doulton. The book acknowledges just how deadly the guerrilla tactics of the Indonesian independence fighters were.&lt;br/&gt;&lt;br/&gt;- Museum Mini Soekaboemi Tempo Doeloe&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/9dfe05aea53f8576969bbbef8b75cd4fde081ac69659b7976e53cd45bce2037b.png&#34;&gt;  
    </content>
    <updated>2026-07-05T01:04:13Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0tt8vhh0c8lpk9e2nwrzju0m4npvy66wjsqk3g9h84c0hn9mrcpczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful6fam6</id>
    
      <title>Nostr event nevent1qqs0tt8vhh0c8lpk9e2nwrzju0m4npvy66wjsqk3g9h84c0hn9mrcpczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful6fam6</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0tt8vhh0c8lpk9e2nwrzju0m4npvy66wjsqk3g9h84c0hn9mrcpczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful6fam6" />
    <content type="html">
      Alhamdulillah 🙏 
    </content>
    <updated>2026-07-02T09:14:06Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstyj6fjc2ttm4fsgezdysn3eytgl2nma8dyehz5hy5fxrvsu89w8szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzyda9y</id>
    
      <title type="html">🙏</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstyj6fjc2ttm4fsgezdysn3eytgl2nma8dyehz5hy5fxrvsu89w8szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzyda9y" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszrw29c5rzdzptu4p9gxu43smzu9peq0j3ml02qnlqaq27933wlegsx9w5p&#39;&gt;nevent1q…9w5p&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;🙏 &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-07-01T10:53:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2dp066697kmm2zjadh47c7py4kc7p0srlhmym7jvelphush2wr6qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuk25hq3</id>
    
      <title type="html">It&amp;#39;s pretty scary when someone that close to you hasn&amp;#39;t ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2dp066697kmm2zjadh47c7py4kc7p0srlhmym7jvelphush2wr6qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuk25hq3" />
    <content type="html">
      It&amp;#39;s pretty scary when someone that close to you hasn&amp;#39;t been in touch for a few days
    </content>
    <updated>2026-06-30T07:17:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyr8sh4esjqm5qnfjcczf67t3x4l2khu792ukyqm0l3g04uvtx68szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzyun9j</id>
    
      <title type="html">Ah, as a Sundanese I can&amp;#39;t write Sundanese text, this is very ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyr8sh4esjqm5qnfjcczf67t3x4l2khu792ukyqm0l3g04uvtx68szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzyun9j" />
    <content type="html">
      Ah, as a Sundanese I can&amp;#39;t write Sundanese text, this is very shameful. I will learn on it haha
    </content>
    <updated>2026-06-29T09:23:53Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspwleggjjakdfx92mmvmr5geswssexulfu9k9894pjt477yp3t7pgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufummd5d5</id>
    
      <title type="html">Why does opening the Codex CLI or desktop app on Windows ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspwleggjjakdfx92mmvmr5geswssexulfu9k9894pjt477yp3t7pgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufummd5d5" />
    <content type="html">
      Why does opening the Codex CLI or desktop app on Windows immediately deduct usage, even without making a request? #codex
    </content>
    <updated>2026-06-29T00:33:35Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8dgv70qxxxr2h80y7kjdxzfprme6r6enu0ngv0yu5jyv7zxm9tnszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupcq845</id>
    
      <title type="html">#naddr1qv…4sqp</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8dgv70qxxxr2h80y7kjdxzfprme6r6enu0ngv0yu5jyv7zxm9tnszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupcq845" />
    <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;/naddr1qvzqqqr4gupzqsmm3klxj9chfjuyt0t8kgqycrrnfjde7gqg8ayf4e9amwmz97y7qywhwumn8ghj7mn0wd68ytfsxyh8jcttd95x7mnwv5hxxmmd9uq32amnwvaz7tmjv4kxz7fwv3sk6atn9e5k7tcqz4txz5rz2dv5jwtf0penzs6029kksd3dwdaqg84sqp&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;naddr1qv…4sqp&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; &lt;p&gt;Have you ever felt anxious because something you desire has not yet come to you? We may keep pursuing it, as though our share in life could be exchanged with someone else’s or taken away by them.&lt;/p&gt;

&lt;p&gt;Striving is necessary, but we should not become so occupied with chasing the world that we neglect what Allah asks of us. There is a reminder in the book Al-Hikam about zuhud—spiritual detachment from worldly attachment—that calls the heart not to depend on the world or on what other people possess.&lt;/p&gt;

&lt;h4 id=&#34;zuhud-and-the-portion-already-decreed-2&#34;&gt;Zuhud and the Portion Already Decreed&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;A person once asked the Prophet ﷺ, &lt;em&gt;“Show me a deed which, if I do it, will make Allah and people love me.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Prophet ﷺ replied, &lt;em&gt;“Be detached from the world, and Allah will love you. Be detached from what people possess, and they will love you.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Whatever has been decreed as your portion will not diminish, even if you keep asking for it. And whatever is not meant for you will not come into your hands, no matter how much you pursue it.&lt;/p&gt;

&lt;p&gt;Allah says, &lt;em&gt;“We have apportioned among them their livelihood in the life of this world.”&lt;/em&gt; &lt;strong&gt;(Surah Az-Zukhruf, 43:32).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So why do we remain anxious and continue to chase the world when all of it has already been decreed? When you struggle relentlessly for something that has been destined for you, yet neglect what is required of you, it is a sign that the inner eye of your heart has begun to fade and grow dim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;— From Al-Hikam —&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zuhud does not mean stopping work or abandoning the world altogether. It means placing the world in our hands, rather than in our hearts. We still strive through what is right and lawful, but we do not tie our peace to outcomes or to what people may give us.&lt;/p&gt;

&lt;p&gt;What is meant for us will not be exchanged. Our task is to make the effort, fulfill our responsibilities, and protect our hearts so that they remain dependent upon Allah.&lt;/p&gt;

&lt;p&gt;So, do we still want to spend our peace worrying about something that has already been decreed?&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2026-06-28T08:30:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszrw29c5rzdzptu4p9gxu43smzu9peq0j3ml02qnlqaq27933wlegzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz9dpcu</id>
    
      <title type="html">Ya Allah, may she, wherever she is as she pursues her dreams, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszrw29c5rzdzptu4p9gxu43smzu9peq0j3ml02qnlqaq27933wlegzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz9dpcu" />
    <content type="html">
      Ya Allah, may she, wherever she is as she pursues her dreams, remain under Your protection. May she always be safe and well 🤲🙏
    </content>
    <updated>2026-06-27T09:44:04Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqmfdzs6jvpel5j9eg24dmjud6x6ctcz0fvp06602y46y4rpdcufczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutqu7mz</id>
    
      <title type="html">Love that! 🫡 I&amp;#39;d add that when you nail both the product ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqmfdzs6jvpel5j9eg24dmjud6x6ctcz0fvp06602y46y4rpdcufczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutqu7mz" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2fqyuq9ed04zm94kh702r3xwr837eym0smp3esxjmcsuv3g2jq0q5l2k5n&#39;&gt;nevent1q…2k5n&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Love that! 🫡 I&amp;#39;d add that when you nail both the product and the experience, the support happens automatically
    </content>
    <updated>2026-06-23T06:27:03Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs090eq4403neqwy8u2etr6fvp0vtf5ralwvdkl53j5uydmqzp2x2szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu639lyn</id>
    
      <title type="html">A short today quote Someone asked the Prophet SAW, &amp;#34;Show me ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs090eq4403neqwy8u2etr6fvp0vtf5ralwvdkl53j5uydmqzp2x2szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu639lyn" />
    <content type="html">
      A short today quote &lt;br/&gt;&lt;br/&gt;Someone asked the Prophet SAW, &amp;#34;Show me an action that if I do it, then Allah and people will love me.&amp;#34;&lt;br/&gt;&lt;br/&gt;The Prophet (peace be upon him) said, &amp;#34;Be zuhud (detached) from the world, surely Allah will love you. And be zuhud from whatever is in the hands of people, then surely they will love you.&amp;#34;&lt;br/&gt;&lt;br/&gt;Everything that has been decreed for you will not decrease even if you ask for it, and everything that is not your portion will not come to you even if you ask for it.&lt;br/&gt;&lt;br/&gt;Allah says, &amp;#34;We have distributed among them their livelihood&amp;#34; (QS. Az-Zukhruf: 32).&lt;br/&gt;&lt;br/&gt;So why are we still worried and chasing after the world, while everything has already been decreed? When you strive hard to achieve something that has been decreed for you but neglect what is required of you, it means the light of your heart has dimmed and gone out.&lt;br/&gt;&lt;br/&gt;The point is: Keep having tawakal (reliance on Allah) because everything has been destined, and keep striving. Don&amp;#39;t focus so much on the world that you forget the hereafter. Everything should be in its proper portion. We need the world, and we also need the hereafter. &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-06-23T01:43:00Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsff98ppncm2rxm36t80eq2d6c5ynu80lpc5zmw9cwk42tuz0z2e5gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuhd7u6t</id>
    
      <title type="html">Trying japan model. Sakana Fugu Ultra. 🐡 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsff98ppncm2rxm36t80eq2d6c5ynu80lpc5zmw9cwk42tuz0z2e5gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuhd7u6t" />
    <content type="html">
      Trying japan model. Sakana Fugu Ultra. 🐡&lt;br/&gt;&lt;a href=&#34;https://console.sakana.ai/models&#34;&gt;https://console.sakana.ai/models&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/97b0bf85f6c60dc9d0b3de5ce5ac27e0355e30b5706b79da3ed76190a4e655f8.jpg&#34;&gt; 
    </content>
    <updated>2026-06-23T01:38:43Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2d2tdulmg5glk436s2tul3hcx87d0rr20nhk3tr6qh4z0zf3wajszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuh3wef6</id>
    
      <title type="html">Great i&amp;#39;ve customized the 9router codebase for my workflow. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2d2tdulmg5glk436s2tul3hcx87d0rr20nhk3tr6qh4z0zf3wajszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuh3wef6" />
    <content type="html">
      Great i&amp;#39;ve customized the 9router codebase for my workflow. now i have multiple providers for many agentic tools in a single place. the best part is serving it on a server, so i can access it from anywhere
    </content>
    <updated>2026-06-17T06:52:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswmlkn9yf9mx2etreg0hhcqyrrjfvax70ct7ezva5q2kcd3c9t99szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5fja60</id>
    
      <title type="html">`grok-composer-2.5-fast` is well suited for frontend development, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswmlkn9yf9mx2etreg0hhcqyrrjfvax70ct7ezva5q2kcd3c9t99szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5fja60" />
    <content type="html">
      `grok-composer-2.5-fast` is well suited for frontend development, especially for web projects. It&amp;#39;s fast and accurate, but it not powerful enough for complex coding tasks
    </content>
    <updated>2026-06-16T09:01:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8vmayt80t8ev2z9nzmc24vj0jkzecdfd62qe4wzh8sycfxtfu4tgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuudqg68</id>
    
      <title type="html">A complex POS app built with Tauri just got 12 MB in size, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8vmayt80t8ev2z9nzmc24vj0jkzecdfd62qe4wzh8sycfxtfu4tgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuudqg68" />
    <content type="html">
      A complex POS app built with Tauri just got 12 MB in size, that&amp;#39;s amazing! But the development target size is 16 GB lol 😆
    </content>
    <updated>2026-06-04T01:39:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9yfmtrwjvj62a6hdevsey97w72v0c9x2kvnc4dekalfq2n4ss62szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqtlkw8</id>
    
      <title type="html">It is just a boilerplate shadcn with only six pages and no ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9yfmtrwjvj62a6hdevsey97w72v0c9x2kvnc4dekalfq2n4ss62szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqtlkw8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8v4s4wru6e4qjhxjcl24aelf3t346agn6jtwq9ewta9pqgcc0ajcjhypnw&#39;&gt;nevent1q…ypnw&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It is just a boilerplate shadcn with only six pages and no third‑party libraries (just shadcn, maybe including their third‑party) btw. The main issue is that every error gets logged or cached, causing recompilation and a larger size.
    </content>
    <updated>2026-06-04T01:12:53Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8v4s4wru6e4qjhxjcl24aelf3t346agn6jtwq9ewta9pqgcc0ajczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuppcsra</id>
    
      <title type="html">Struggling with Next.js development cache size, I migrated the ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8v4s4wru6e4qjhxjcl24aelf3t346agn6jtwq9ewta9pqgcc0ajczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuppcsra" />
    <content type="html">
      Struggling with Next.js development cache size, I migrated the framework from that into Tanstack Start. The newest Turbopack can cause a big size (in my case it&amp;#39;s around 4 GB 🤮).
    </content>
    <updated>2026-06-04T01:09:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqs2yvx3efxj47ygk46mjv8gvf5mc84l0ymutctfrhmfny38dq3mszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug466r2</id>
    
      <title type="html">After much consideration, it turns out that Tauri is easier to ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqs2yvx3efxj47ygk46mjv8gvf5mc84l0ymutctfrhmfny38dq3mszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug466r2" />
    <content type="html">
      After much consideration, it turns out that Tauri is easier to develop with than Flutter, especially if your basic development expertise is in JavaScript. Development is also fast because it uses Rust.
    </content>
    <updated>2026-06-02T04:09:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf0mpmn54vhycnat8v2vteyq3xjqz9skty2wj8gvw75crlqpucvzczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuxnlh9l</id>
    
      <title>Nostr event nevent1qqsf0mpmn54vhycnat8v2vteyq3xjqz9skty2wj8gvw75crlqpucvzczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuxnlh9l</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf0mpmn54vhycnat8v2vteyq3xjqz9skty2wj8gvw75crlqpucvzczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuxnlh9l" />
    <content type="html">
      GM &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/0c3c2a49e313f0e6038d54a7d7d4235feab46378f28c9556dfb55134582a759b.jpg&#34;&gt; 
    </content>
    <updated>2026-05-28T02:29:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2yta407hswd53xlvxuk03e50hdjusgufncxeszvdvxx2mqwwnrfczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufugmklzd</id>
    
      <title>Nostr event nevent1qqs2yta407hswd53xlvxuk03e50hdjusgufncxeszvdvxx2mqwwnrfczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufugmklzd</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2yta407hswd53xlvxuk03e50hdjusgufncxeszvdvxx2mqwwnrfczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufugmklzd" />
    <content type="html">
      🌞⛰️ &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/6f2ca8d5bae37f1207995b3231368d7ffa841951ad8fa797e5ff48fbfc8f880a.jpg&#34;&gt; 
    </content>
    <updated>2026-05-27T05:50:05Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswry6ncf7ftz2pn0atq9fp6h3rej9u7tpp6tnlsamjv2k8l6km2qczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2dp0dr</id>
    
      <title>Nostr event nevent1qqswry6ncf7ftz2pn0atq9fp6h3rej9u7tpp6tnlsamjv2k8l6km2qczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2dp0dr</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswry6ncf7ftz2pn0atq9fp6h3rej9u7tpp6tnlsamjv2k8l6km2qczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2dp0dr" />
    <content type="html">
       &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/c4aa6c370293aba52e7f4119dd46d24f72c92a418bcd3215dc6da69559e06264.png&#34;&gt; 
    </content>
    <updated>2026-05-27T02:55:13Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq8y2zk4za83sq36hwquzn27hrkxj7u8cpt8shy2h62ldqjhenjvqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufud78gm2</id>
    
      <title type="html">Kau pergi dengan cita-cita Ke kota yang jauh di sana... Siang ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq8y2zk4za83sq36hwquzn27hrkxj7u8cpt8shy2h62ldqjhenjvqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufud78gm2" />
    <content type="html">
      Kau pergi dengan cita-cita&lt;br/&gt;Ke kota yang jauh di sana...&lt;br/&gt;&lt;br/&gt;Siang malam hanya doa yang kupanjatkan&lt;br/&gt;Tuhan, lindungilah dia yang kusayangi&lt;br/&gt;Satukanlah hati kami berdua&lt;br/&gt;Selamanya, selamanya... &lt;br/&gt;🎶🎵🎶🎵🎶 &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-05-20T01:57:43Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxhgwjr0yw948fxapvxl37rgrnjc8zhweywsrzr3rpxp2g2uesm5gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu8wnza4</id>
    
      <title>Nostr event nevent1qqsxhgwjr0yw948fxapvxl37rgrnjc8zhweywsrzr3rpxp2g2uesm5gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu8wnza4</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxhgwjr0yw948fxapvxl37rgrnjc8zhweywsrzr3rpxp2g2uesm5gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu8wnza4" />
    <content type="html">
      😩 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/5c139ee12caed184914fd2b7a42b67f669d334d5f45771f67958eb7d935978f9.jpg&#34;&gt; 
    </content>
    <updated>2026-05-20T01:50:21Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8c63qw8c909evksaghpw70d80yz7hsm39qgfmjvqkpxcy8akkg9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5xk7kz</id>
    
      <title type="html">Codex weekly limit being reset again by OpenAI. Good news ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8c63qw8c909evksaghpw70d80yz7hsm39qgfmjvqkpxcy8akkg9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5xk7kz" />
    <content type="html">
      Codex weekly limit being reset again by OpenAI. Good news 😂 &lt;img src=&#34;https://blossom.primal.net/d729cf28210953f86e582f8048a24c8705982084d399405d22821e4094f18618.png&#34;&gt;  
    </content>
    <updated>2026-05-19T23:56:06Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdjmu5uxec0vaxlrkh7lm742q6pgvzytx980hnq6nay3ds5h0ylnczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug7fcjp</id>
    
      <title>Nostr event nevent1qqsdjmu5uxec0vaxlrkh7lm742q6pgvzytx980hnq6nay3ds5h0ylnczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug7fcjp</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdjmu5uxec0vaxlrkh7lm742q6pgvzytx980hnq6nay3ds5h0ylnczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug7fcjp" />
    <content type="html">
      Tuhan lindungilah dia, yang ada di sana... 🎵
    </content>
    <updated>2026-05-15T02:07:46Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsv9djffh4gz6ud5zd053vncn0c48nc2mfqjq8ujnsumz7l6xym8jgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut86wjz</id>
    
      <title type="html">Pi.dev https://pi.dev/, is an alternate to Claude Code. It is ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsv9djffh4gz6ud5zd053vncn0c48nc2mfqjq8ujnsumz7l6xym8jgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut86wjz" />
    <content type="html">
      Pi.dev &lt;a href=&#34;https://pi.dev/&#34;&gt;https://pi.dev/&lt;/a&gt;, is an alternate to Claude Code. It is more token‑lightweight; when using Claude Code, you just send a “Hi!” message and about 45 k tokens are used. When using Pi, it is only around 5 k tokens. Also, Pi has many extensions that can be installed according to the workflow we want
    </content>
    <updated>2026-05-14T06:51:02Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf5y5jray2p9yqa2a3qvu359gp2m8mr2js462d7yueke6kkmfhkyqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz9jhhe</id>
    
      <title type="html">Testcontainers greatly simplify my test script writing ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf5y5jray2p9yqa2a3qvu359gp2m8mr2js462d7yueke6kkmfhkyqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz9jhhe" />
    <content type="html">
      Testcontainers greatly simplify my test script writing &lt;a href=&#34;https://testcontainers.com/&#34;&gt;https://testcontainers.com/&lt;/a&gt;
    </content>
    <updated>2026-05-12T04:12:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst4wk03y8388exthkcyvqxx4lmamst3q2sdzrmu7q9m7u35qfvaxgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2rmjrz</id>
    
      <title type="html">It’s been a while since I last worked with Flutter. This week, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst4wk03y8388exthkcyvqxx4lmamst3q2sdzrmu7q9m7u35qfvaxgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2rmjrz" />
    <content type="html">
      It’s been a while since I last worked with Flutter. This week, I picked it up again to build a pharmacy store desktop application. Wow—AI these days is incredibly impressive!&lt;br/&gt;&lt;br/&gt;Just a tip: start with a smaller task first, then review, fix the architecture, and clean up any bad code. After that, the LLM will follow your coding pattern flawlessly. Think of the first attempt as a pilot for the next LLM iteration.&lt;br/&gt;&lt;br/&gt;I adopted this approach after several attempts at “vibe coding,” and now my code is much cleaner—even when generated by AI. I no longer spend hours reviewing it; a quick read is enough to confirm the structure is still solid.&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/cb81ecb9c58ea8bc6b2cfa29d564f5ca6ef775b9d02814ba23f9133070428f45.png&#34;&gt; 
    </content>
    <updated>2026-05-11T09:15:28Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8jn4red6dxkwx9x2nm9r822x9r42u49t0aplggjcalgaeym6xa4szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9sgy9g</id>
    
      <title type="html">I&amp;#39;ve been using many open source LLM models. Recently, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8jn4red6dxkwx9x2nm9r822x9r42u49t0aplggjcalgaeym6xa4szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9sgy9g" />
    <content type="html">
      I&amp;#39;ve been using many open source LLM models. Recently, it&amp;#39;s Qwen3.5-35B-A3B. Many people says its ability is closest to Sonnet 4.5; in general purpose it might be comparable, but for complex coding tasks it&amp;#39;s still hard to solve some problems. But this model is really great for simple coding tasks. I tried running this model with 2X RTX 3090, and it runs well, but it&amp;#39;s not good for concurrency and still needs higher‑end hardware.  &lt;img src=&#34;https://blossom.primal.net/277a5e964b8d06b489adbb8eba21e904383c87ad96f96133438aa29a5e16dcc2.png&#34;&gt;    &lt;img src=&#34;https://blossom.primal.net/40e093d7016c6f888a3406747365cd9ddc0cb774ad7f870c7ba30202349ce028.png&#34;&gt;  
    </content>
    <updated>2026-04-27T02:50:34Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdv5ryk53mnnfje3dxjptjn4lf3g5u3y5qc5huqmlelh5942fccmqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuj2x2g4</id>
    
      <title type="html">GM</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdv5ryk53mnnfje3dxjptjn4lf3g5u3y5qc5huqmlelh5942fccmqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuj2x2g4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsx80sh4fj3x6eq8lnhqnnjel387q4tfhxy0m9rm8r8lku3mhvrursn0k6yz&#39;&gt;nevent1q…k6yz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;GM
    </content>
    <updated>2026-04-07T22:10:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq8ezjhgeup2n2s50uu3zv6kygxkltuzaraqdlvwgjafdt72patxczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutre7jh</id>
    
      <title type="html">GM! ☀️ ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq8ezjhgeup2n2s50uu3zv6kygxkltuzaraqdlvwgjafdt72patxczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutre7jh" />
    <content type="html">
      GM! ☀️ &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/11e9589d0d40672ff61fc4b625c3f4155d47dbfdb751fd9dfce88230d5f2dffd.jpg&#34;&gt; 
    </content>
    <updated>2026-03-28T01:40:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyklss9g96tsdult65x7v7tefs8m5q6z8sqxkafhxydunj578nu7qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5y6hdd</id>
    
      <title type="html">To someone over there.</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyklss9g96tsdult65x7v7tefs8m5q6z8sqxkafhxydunj578nu7qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5y6hdd" />
    <content type="html">
      To someone over there. &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-03-24T06:26:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxgywf6fljp5k9594mytdnq5x2r86am0apn6alx8ejseqssxvff8czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum2m8xw</id>
    
      <title type="html">$ man help</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxgywf6fljp5k9594mytdnq5x2r86am0apn6alx8ejseqssxvff8czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum2m8xw" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsd7rasackpj4azxyxefpurlc06vyawk3jkxkase3ctnsy4a2evqdcpr9mhxue69uhk2umsv4kxsmewva5hy6twduhx7un89u46xw47&#39;&gt;nevent1q…xw47&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;$ man help &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-03-23T08:55:35Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxdxtts0e8522vt89r03efhd0zjynrs4e7uv730c0dnw9w8dtgm6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufukycmu7</id>
    
      <title type="html">Again, last night. This one is so close. 4.1 magnitude with 10 km ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxdxtts0e8522vt89r03efhd0zjynrs4e7uv730c0dnw9w8dtgm6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufukycmu7" />
    <content type="html">
      Again, last night. This one is so close.&lt;br/&gt;&lt;br/&gt;4.1 magnitude with 10 km depth; this is very shallow. One of Cimandiri&amp;#39;s fault activities.&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/4faa780c9027892de0388431c832225c0fb8efb5517b8d37cc59fa5c367387a5.png&#34;&gt;  
    </content>
    <updated>2026-03-15T12:40:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyeqpy8af2yxd4v74zc2xfs5jzgyr977asxgln2pydahfx68m2ccszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutwukl8</id>
    
      <title type="html">When preparing for Suhoor, then: earthquake M5.2 JAVA, INDONESIA, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyeqpy8af2yxd4v74zc2xfs5jzgyr977asxgln2pydahfx68m2ccszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutwukl8" />
    <content type="html">
      When preparing for Suhoor, then: earthquake M5.2 JAVA, INDONESIA, 2026-03-12 19:18:17 UTC &lt;a href=&#34;https://m.emsc.eu/?id=1959438&#34;&gt;https://m.emsc.eu/?id=1959438&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-03-12T19:33:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspewwlhn5tmc9k5j6t5p5g4l6rnwy4v2uh57npj9svp8748f9z8uszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuvsudgq</id>
    
      <title>Nostr event nevent1qqspewwlhn5tmc9k5j6t5p5g4l6rnwy4v2uh57npj9svp8748f9z8uszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuvsudgq</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspewwlhn5tmc9k5j6t5p5g4l6rnwy4v2uh57npj9svp8748f9z8uszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuvsudgq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs06qhxzgp7gn5zmgs78x8a693r8q95tqyl54xe9lj0lmsr3ru7cag5kurx9&#39;&gt;nevent1q…urx9&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;  &lt;img src=&#34;https://blossom.primal.net/44c21c60bbfe43f9485bb8cf4363bd8e5cc0218aed5a50b244cf1209b5b1e305.jpg&#34;&gt;    &lt;img src=&#34;https://blossom.primal.net/88c3b3b5117d5941af65ada58c2268b97727b0cea28283e888b5c259d1621656.jpg&#34;&gt;    &lt;img src=&#34;https://blossom.primal.net/9543e016b7847ad21a8111f0777e1360cda8fc234f97040fa63c208a235670a6.jpg&#34;&gt;  
    </content>
    <updated>2026-03-11T13:03:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs06qhxzgp7gn5zmgs78x8a693r8q95tqyl54xe9lj0lmsr3ru7cagzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuuxvwe6</id>
    
      <title type="html">213 commits later… Finally shipped my AI sidebar ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs06qhxzgp7gn5zmgs78x8a693r8q95tqyl54xe9lj0lmsr3ru7cagzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuuxvwe6" />
    <content type="html">
      213 commits later…&lt;br/&gt;Finally shipped my AI sidebar extension—open source, BYOK, and supporting every major LLM.&lt;br/&gt;Feedback is greatly appreciated 🙏&lt;br/&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/bracekit-ai-sidebar/kdlbihnhbaeoghamncndigpgnjociehh&#34;&gt;https://chromewebstore.google.com/detail/bracekit-ai-sidebar/kdlbihnhbaeoghamncndigpgnjociehh&lt;/a&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/satriaajiputra/brace-kit&#34;&gt;https://github.com/satriaajiputra/brace-kit&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;#buildinpublic #opensource #chromeextension #chrome #chromium #aiwrapper
    </content>
    <updated>2026-03-11T13:02:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs282q9cvw3fgkrx5wv0acl3ff8rfelhkqf2cdjfeelhasly2qa24gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuatznqm</id>
    
      <title>Nostr event nevent1qqs282q9cvw3fgkrx5wv0acl3ff8rfelhkqf2cdjfeelhasly2qa24gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuatznqm</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs282q9cvw3fgkrx5wv0acl3ff8rfelhkqf2cdjfeelhasly2qa24gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuatznqm" />
    <content type="html">
      &lt;a href=&#34;https://unsplash.com/photos/a-view-of-a-building-with-a-clock-tower-in-the-distance-SXnbhzDqiSk&#34;&gt;https://unsplash.com/photos/a-view-of-a-building-with-a-clock-tower-in-the-distance-SXnbhzDqiSk&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-03-09T20:20:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8232h77yeftxwah98lcxmw8hu9e7xam7wstdq80plmxd0lsfms6szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufufuc7pu</id>
    
      <title type="html">Riding on this road just feels... different now compared to when ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8232h77yeftxwah98lcxmw8hu9e7xam7wstdq80plmxd0lsfms6szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufufuc7pu" />
    <content type="html">
      Riding on this road just feels... different now compared to when it was brand new. No idea why. I barely even ride here, but there is this weird vibe  i cant really put into words 🤔 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/edad50b16af01450e7f828f08f71cf2d1fa5262811e9c275134b08fe01cb678e.jpg&#34;&gt; 
    </content>
    <updated>2026-03-08T12:14:18Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvzs6rq96pgxd0vdg4z0f33pwksm8yltue8nnz9dlhk4rwerty5yqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwnv7n9</id>
    
      <title>Nostr event nevent1qqsvzs6rq96pgxd0vdg4z0f33pwksm8yltue8nnz9dlhk4rwerty5yqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwnv7n9</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvzs6rq96pgxd0vdg4z0f33pwksm8yltue8nnz9dlhk4rwerty5yqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwnv7n9" />
    <content type="html">
      Hope it happens soon 🤲
    </content>
    <updated>2026-03-03T15:37:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsp2rddt32tvnyazf34k5fjcn68ud67cl7qhyd585s9ukyh3z2rxdszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9m5psj</id>
    
      <title type="html">The test was successful</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsp2rddt32tvnyazf34k5fjcn68ud67cl7qhyd585s9ukyh3z2rxdszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9m5psj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfqyp6lc3nw94w0l3z5gj9rh67h3wvp89x0dhaz6l377k3myuaf6clmvzdk&#39;&gt;nevent1q…vzdk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;The test was successful 
    </content>
    <updated>2026-03-03T15:32:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgefdxnnm5t8r5cmuqtxxzw97l7rqpff95ht99790sp9meq3rfv7szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu33zjaz</id>
    
      <title>Nostr event nevent1qqsgefdxnnm5t8r5cmuqtxxzw97l7rqpff95ht99790sp9meq3rfv7szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu33zjaz</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgefdxnnm5t8r5cmuqtxxzw97l7rqpff95ht99790sp9meq3rfv7szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu33zjaz" />
    <content type="html">
      🤡🤡🤡
    </content>
    <updated>2026-02-28T15:26:08Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgy3wtjhp22j4mmk7rr76vpqzlz4zw858f46x50m5fc0j5x7ll48czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu7hjqwy</id>
    
      <title type="html">Alhamdulillah, i get to welcome Ramadhan Kareem again this year. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgy3wtjhp22j4mmk7rr76vpqzlz4zw858f46x50m5fc0j5x7ll48czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu7hjqwy" />
    <content type="html">
      Alhamdulillah, i get to welcome Ramadhan Kareem again this year. hope we stay healthy and our fasting is accepted
    </content>
    <updated>2026-02-27T08:04:48Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstkwz59v737z7uzs6hcpyapzc8vlmj5gldean2f2mx9fhy7hlk70czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9xtcy6</id>
    
      <title type="html">A creation from @nprofile…6kgk 🔥 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstkwz59v737z7uzs6hcpyapzc8vlmj5gldean2f2mx9fhy7hlk70czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9xtcy6" />
    <content type="html">
      A creation from &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsz0nw6z8tcpxspgwhmtkl4txd7g9sd335mpzww3yqj502wn7a3pcspr3mhxue69uhkummnw3ez6vp39eukz6mfdphkumn99e3k7mgpz3mhxue69uhhyetvv9ujuerpd46hxtnfduzs6kgk&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;awicreative&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…6kgk&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; 🔥 &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/330e90349d32e7c8103c6404299d8ed2f068d2849b9ebe927a74fc85c659e6b3.jpg&#34;&gt; 
    </content>
    <updated>2026-02-25T11:47:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswhrxspjlllr6ans3s9y6r3v9lc0xfmhj3ke5h8jyxqzg2y3yu6gszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz4fat3</id>
    
      <title>Nostr event nevent1qqswhrxspjlllr6ans3s9y6r3v9lc0xfmhj3ke5h8jyxqzg2y3yu6gszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz4fat3</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswhrxspjlllr6ans3s9y6r3v9lc0xfmhj3ke5h8jyxqzg2y3yu6gszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuz4fat3" />
    <content type="html">
      Welcome Ramadan!
    </content>
    <updated>2026-02-18T13:05:11Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsy3hdetdj0fuhy5sf9wv32a8gsjuemlj93kjrznucgc5vs8n6mt0gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqykhnt</id>
    
      <title type="html">🎧 1/3 malam ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsy3hdetdj0fuhy5sf9wv32a8gsjuemlj93kjrznucgc5vs8n6mt0gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqykhnt" />
    <content type="html">
      🎧 1/3 malam&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://music.apple.com/id/album/sepertiga-malam/1463202336?i=1463202340&#34;&gt;https://music.apple.com/id/album/sepertiga-malam/1463202336?i=1463202340&lt;/a&gt;
    </content>
    <updated>2026-02-13T05:41:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8sav00hrthxpye0e4jdwhd9pnqvu7w04w5ly3c8ht33awe45mtrszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2yqay2</id>
    
      <title>Nostr event nevent1qqs8sav00hrthxpye0e4jdwhd9pnqvu7w04w5ly3c8ht33awe45mtrszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2yqay2</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8sav00hrthxpye0e4jdwhd9pnqvu7w04w5ly3c8ht33awe45mtrszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu2yqay2" />
    <content type="html">
      1 week until Ramadan. Hope we&amp;#39;re all well 🤲
    </content>
    <updated>2026-02-11T04:08:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsd8esph05fg8kexfhfexc5mlecey5fjtd9dvru45e7sjx59xajhrqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuehmwnh</id>
    
      <title type="html">🤲</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsd8esph05fg8kexfhfexc5mlecey5fjtd9dvru45e7sjx59xajhrqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuehmwnh" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvdlxezwypkdv3qdwlvl30nmr9e56ryp9lnw9dt5z7ap2gzldsc6cphdkfl&#39;&gt;nevent1q…dkfl&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;🤲 
    </content>
    <updated>2026-02-10T08:10:10Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsr4uel5ytrs6zsfs4w0kwlm528pxldfxl7frh0epsp5jvkap4knwszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9mt06k</id>
    
      <title type="html">GM! cant stop my self from riding again... 🙂‍↔️ ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsr4uel5ytrs6zsfs4w0kwlm528pxldfxl7frh0epsp5jvkap4knwszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9mt06k" />
    <content type="html">
      GM! cant stop my self from riding again... 🙂‍↔️ &lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/8e045ed3cdf7ae2aa34ca0370352cdc1f254600b9328ba4d18d718f043a80963.webp&#34;&gt;  
    </content>
    <updated>2026-02-10T05:18:23Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyqkf8jdv7cm8jym0nvpjeek7hqnpxzasx90h6pntatptns3ahkwszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufukd5fgj</id>
    
      <title type="html">Agreed, using cc or other cli tools combined with tmux provides ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyqkf8jdv7cm8jym0nvpjeek7hqnpxzasx90h6pntatptns3ahkwszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufukd5fgj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0ss2kc8ajswrtcmc64fkh7lgfegy4fhuwzuve8arkpdh2ftz70wca9ssjk&#39;&gt;nevent1q…ssjk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Agreed, using cc or other cli tools combined with tmux provides much better control
    </content>
    <updated>2026-02-09T08:36:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvdlxezwypkdv3qdwlvl30nmr9e56ryp9lnw9dt5z7ap2gzldsc6czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufux3n692</id>
    
      <title type="html">Hope she&amp;#39;s getting better.</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvdlxezwypkdv3qdwlvl30nmr9e56ryp9lnw9dt5z7ap2gzldsc6czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufux3n692" />
    <content type="html">
      Hope she&amp;#39;s getting better. &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-02-09T01:15:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsztywpl7cprca0f4twstpsy5z3npm4n6s6mpfj0pxmk9pe0jddquszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu7avscl</id>
    
      <title type="html">This one getting viral 🤯 https://clawd.bot/</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsztywpl7cprca0f4twstpsy5z3npm4n6s6mpfj0pxmk9pe0jddquszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu7avscl" />
    <content type="html">
      This one getting viral 🤯&lt;br/&gt;&lt;a href=&#34;https://clawd.bot/&#34;&gt;https://clawd.bot/&lt;/a&gt;&lt;br/&gt;
    </content>
    <updated>2026-01-25T10:47:03Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8rsvjvzn02jfscycqrcc2598z3xasxvutf795dckn5h7n8wsc8jczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuujp6a7</id>
    
      <title type="html">Once the west monsoon season arrives, in Java we always prepare ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8rsvjvzn02jfscycqrcc2598z3xasxvutf795dckn5h7n8wsc8jczypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuujp6a7" />
    <content type="html">
      Once the west monsoon season arrives,  in Java we always prepare the traditional bamboo windmill (the bigger, the better 😂) and get ready to hear it sing in the wind ~~ 🌊💨
    </content>
    <updated>2026-01-23T21:10:26Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsy9x6809vlp7jguaf07tfsnpx2w5rxrx3avs77d28p0jn0zzs476gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupn7z25</id>
    
      <title type="html">Trying my fuji xa5 with stock lens. Centaur constellation? ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsy9x6809vlp7jguaf07tfsnpx2w5rxrx3avs77d28p0jn0zzs476gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupn7z25" />
    <content type="html">
      Trying my fuji xa5 with stock lens.  Centaur constellation?&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/8a07948358292bf437c9444667f732333f13ba62912016145aacb7a7737d4557.png&#34;&gt;  
    </content>
    <updated>2026-01-21T02:12:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrzalj6lq5gx59hfyu0e9xdk864sdtf9l6dzle4rh24w93u78xk5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufusa7mn3</id>
    
      <title>Nostr event nevent1qqsrzalj6lq5gx59hfyu0e9xdk864sdtf9l6dzle4rh24w93u78xk5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufusa7mn3</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrzalj6lq5gx59hfyu0e9xdk864sdtf9l6dzle4rh24w93u78xk5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufusa7mn3" />
    <content type="html">
       🙂‍↔️🙂‍↔️🙂‍↔️&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/348d9acbcde037747a529b846f36cadb26828c5d984a5ed413373476771b9cc4.png&#34;&gt;  
    </content>
    <updated>2026-01-18T05:59:12Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2cf77602x34fps2ec2h82jsss5xsmsqujkr8t44qe8eder7eawdgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufur2hsnq</id>
    
      <title type="html">Antigravity has made incredible upgrades in just a few weeks. Im ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2cf77602x34fps2ec2h82jsss5xsmsqujkr8t44qe8eder7eawdgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufur2hsnq" />
    <content type="html">
      Antigravity has made incredible upgrades in just a few weeks. Im now comfortable using it.
    </content>
    <updated>2026-01-17T07:40:02Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0l6rw2w6gp68pf6t5h8azecu97kzn9xg25plyvy0h8pgkrhdcaqqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufugt8aqd</id>
    
      <title type="html">1 BTC = 1 BTC</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0l6rw2w6gp68pf6t5h8azecu97kzn9xg25plyvy0h8pgkrhdcaqqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufugt8aqd" />
    <content type="html">
      1 BTC = 1 BTC &lt;br/&gt;&lt;br/&gt;
    </content>
    <updated>2026-01-13T15:49:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrp6yu735wucvvgq908m7tcd3kzdzlu7zc087p2e6s2exashrl76czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufus9pnf9</id>
    
      <title>Nostr event nevent1qqsrp6yu735wucvvgq908m7tcd3kzdzlu7zc087p2e6s2exashrl76czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufus9pnf9</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrp6yu735wucvvgq908m7tcd3kzdzlu7zc087p2e6s2exashrl76czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufus9pnf9" />
    <content type="html">
      Let&amp;#39;s see what happens between 2k29 &amp;amp; 2k30
    </content>
    <updated>2026-01-12T12:31:20Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszkdv04lr69jj5jlvr7lxqp6fdxqp55f4h7mf6sjty5zqdzfmhp0gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupa9m3e</id>
    
      <title type="html">thank you! i hope you are well too 🙏 my condition has ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszkdv04lr69jj5jlvr7lxqp6fdxqp55f4h7mf6sjty5zqdzfmhp0gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufupa9m3e" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvd3phvgrayelnevrqc5r03dwapedazg6mucz64q0uavs8rtsh5rgpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgnnrqvf&#39;&gt;nevent1q…rqvf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;thank you! i hope you are well too 🙏&lt;br/&gt;&lt;br/&gt;my condition has improved, and able to resume my daily activities. i&amp;#39;m ready to assist whenever you need me 🫡
    </content>
    <updated>2026-01-06T23:31:56Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0q5phm3d0nxw9v5xu7se67g9uwrujn6jsr2z3qrhl65q9cfytkrqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu05kheh</id>
    
      <title type="html">it&amp;#39;s been crazy hot in West Java lately. just in the last ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0q5phm3d0nxw9v5xu7se67g9uwrujn6jsr2z3qrhl65q9cfytkrqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu05kheh" />
    <content type="html">
      it&amp;#39;s been crazy hot in West Java lately. just in the last decade, things have gotten so much hotter. the sky and clouds used to be so blue and white and clear, but now its just dirty fog everywhere. even the government said the air was good a few days ago, but what&amp;#39;s the point if it&amp;#39;s only good for one day? i think something is seriously wrong here. ohh... i really miss how it used to be...
    </content>
    <updated>2026-01-06T05:35:13Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfnpwlrfq20lla5zd8gvxgewtrc6cpv3rsetnrwkuht7z0h8a3gfszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuej8rra</id>
    
      <title type="html">Happy new year! 🥳 it&amp;#39;s amazing to see everyone exploring ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfnpwlrfq20lla5zd8gvxgewtrc6cpv3rsetnrwkuht7z0h8a3gfszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuej8rra" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0w7s6q4vn0q0jsrxwxl4tsk7k8n8us364pqzv670mf539xypudeqzwrxfy&#39;&gt;nevent1q…rxfy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Happy new year! 🥳 it&amp;#39;s amazing to see everyone exploring so many different ways to use AI agents. the AI agent itself is evolving, but what&amp;#39;s really exciting is how people are using it. it feels like the tech world is moving at lightning speed these days 😂&lt;br/&gt;have you tried Beads yet? it&amp;#39;s incredibly helpful for keeping track of things and managing tasks without losing the context. &lt;a href=&#34;https://github.com/steveyegge/beads&#34;&gt;https://github.com/steveyegge/beads&lt;/a&gt;
    </content>
    <updated>2026-01-06T03:54:51Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyy7hpvgdgkcxmzht64ak546epfc79wwj8s30lupfyf4k9h8eu5uqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5qzgmz</id>
    
      <title type="html">this logging tutorial is highly informative and beneficial ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyy7hpvgdgkcxmzht64ak546epfc79wwj8s30lupfyf4k9h8eu5uqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu5qzgmz" />
    <content type="html">
      this logging tutorial is highly informative and beneficial&lt;br/&gt;&lt;a href=&#34;https://loggingsucks.com/&#34;&gt;https://loggingsucks.com/&lt;/a&gt;
    </content>
    <updated>2026-01-03T03:03:53Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvaczt9hcxqxyksea28ypfccmyy5s6a0kwlj3pu2zzt6wuy7lxc7szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu0e5al7</id>
    
      <title type="html">in software development, we should conduct tests and ensure ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvaczt9hcxqxyksea28ypfccmyy5s6a0kwlj3pu2zzt6wuy7lxc7szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu0e5al7" />
    <content type="html">
      in software development, we should conduct tests and ensure everything is covered and passes 100%. the same applies to life... every day is a test case that we should pass. the way you live your life affects the world and determines your success in the afterlife&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://blossom.primal.net/a14cab6f3c43680b18da2e7a1dc9791eb5d55c205c90977f0d2d96a4cb840f94.png&#34;&gt; 
    </content>
    <updated>2026-01-02T12:08:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqst7g8053nv9ndtaewf7ggtgtklqee204gh69xqq97p589cafg8rugzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu8qywc6</id>
    
      <title type="html">touching base again with AWICreative, my art studio site, which I ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqst7g8053nv9ndtaewf7ggtgtklqee204gh69xqq97p589cafg8rugzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu8qywc6" />
    <content type="html">
      touching base again with AWICreative, my art studio site, which I haven&amp;#39;t worked on in a long time.&lt;br/&gt;&lt;a href=&#34;https://awicreative.com&#34;&gt;https://awicreative.com&lt;/a&gt;
    </content>
    <updated>2026-01-02T03:39:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfkdxgg7uqaatnrwn6mdsmcxw4tmmj88d0u9wkud45uz3p44w93tqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqepf6m</id>
    
      <title type="html">Why does Primal web log me out automatically when i refresh the ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfkdxgg7uqaatnrwn6mdsmcxw4tmmj88d0u9wkud45uz3p44w93tqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuqepf6m" />
    <content type="html">
      Why does Primal web log me out automatically when i refresh the page?
    </content>
    <updated>2025-12-30T09:26:35Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg0qac726pp3nhy4rszam8ywm2xxg95qq4u8r6yzesl239h9m2pcgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut2rjvn</id>
    
      <title type="html">The main issue with current vibe coders is redundancy. AI agents ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg0qac726pp3nhy4rszam8ywm2xxg95qq4u8r6yzesl239h9m2pcgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufut2rjvn" />
    <content type="html">
      The main issue with current vibe coders is redundancy. AI agents currently can&amp;#39;t get the full context of the codebase. Unless you&amp;#39;re a programmer who knows the code and workflow of the project, you can tell them through prompts when starting vibe coding, such as &amp;#34;you should create this class, this db with this structure, and reuse these functions, and the result should be like this,&amp;#34; etc.&lt;br/&gt;
    </content>
    <updated>2025-12-22T01:05:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszle37fcnup8ywenj3cha649eflrm3l23sucj8kwnuz53hvvduzzszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful8hxp0</id>
    
      <title type="html">Building a codebase indexing mcp for claude code seems ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszle37fcnup8ywenj3cha649eflrm3l23sucj8kwnuz53hvvduzzszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful8hxp0" />
    <content type="html">
      Building a codebase indexing mcp for claude code seems interesting. It would work like this:&lt;br/&gt;&lt;br/&gt;1. MCP tools: ⁠`codebase_search`&lt;br/&gt;2. Config: Qdrant (for vector DB), path to codebase&lt;br/&gt;3. When `⁠codebase_search` is called, it will run claude code again internally to search the codebase code snippets and get summaries (so we can save window context tokens rather than blindly returning many search results to the main claude code session) &lt;br/&gt;4. When done, the mcp will give results with a more meaningful message to the main session&lt;br/&gt;&lt;br/&gt;Let me know if you have any information about whether this workflow already exists or not
    </content>
    <updated>2025-12-22T00:56:12Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxrun25ev70643v5wzn4r8pljeuj2lg8rymtjgm267ejxpeysksmqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufudm9mry</id>
    
      <title type="html">It&amp;#39;s been 8 days of light to heavy rain here because of ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxrun25ev70643v5wzn4r8pljeuj2lg8rymtjgm267ejxpeysksmqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufudm9mry" />
    <content type="html">
      It&amp;#39;s been 8 days of light to heavy rain here because of cyclone 09S. Hope nothing worse happens 🙏
    </content>
    <updated>2025-12-21T06:09:24Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswcktuvt66nksy4pujdutzludfgyr46uzn6fegstzurzwkz7gpatqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuezvwus</id>
    
      <title type="html">Always double check 😂 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswcktuvt66nksy4pujdutzludfgyr46uzn6fegstzurzwkz7gpatqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuezvwus" />
    <content type="html">
      Always double check  😂&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/31d5de826792c15f7527b5b4d5e1f5569e9299841463cce98376911f12506114.jpg&#34;&gt; 
    </content>
    <updated>2025-12-21T05:52:06Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8ha7teut05fr7m8ujm3aguatg5v7xhf35uhfl304520z3859694qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9w9spl</id>
    
      <title>Nostr event nevent1qqs8ha7teut05fr7m8ujm3aguatg5v7xhf35uhfl304520z3859694qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9w9spl</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8ha7teut05fr7m8ujm3aguatg5v7xhf35uhfl304520z3859694qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9w9spl" />
    <content type="html">
      Antigravity makes the claude model not smart enough 😂
    </content>
    <updated>2025-12-20T23:05:27Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2ef7fg5yyxeeerk5lf6r9443eunqkq50j5tdaeyhut47rf3jmt9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuma70eq</id>
    
      <title type="html">The MiniMax-M2 model isn&amp;#39;t smart enough when working with ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2ef7fg5yyxeeerk5lf6r9443eunqkq50j5tdaeyhut47rf3jmt9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuma70eq" />
    <content type="html">
      The MiniMax-M2 model isn&amp;#39;t smart enough when working with Rust
    </content>
    <updated>2025-12-20T06:58:26Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspgwu080mcusp8nqt6jn337vzxtky9ter782wnzdg9yg0d2kpg99qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum7ug39</id>
    
      <title type="html">I got comfortable working with Amazon Q ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspgwu080mcusp8nqt6jn337vzxtky9ter782wnzdg9yg0d2kpg99qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum7ug39" />
    <content type="html">
      I got comfortable working with Amazon Q&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/1a822bd67f8b964f06234bc1da918e303c3edda6bf696a607d4515dd1279ae84.png&#34;&gt; 
    </content>
    <updated>2025-12-20T01:19:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0q07puv5xtnssz3lt8deu7eag0668ulvq96cfe3c8rlthhlslrzgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuy5nwxy</id>
    
      <title>Nostr event nevent1qqs0q07puv5xtnssz3lt8deu7eag0668ulvq96cfe3c8rlthhlslrzgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuy5nwxy</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0q07puv5xtnssz3lt8deu7eag0668ulvq96cfe3c8rlthhlslrzgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuy5nwxy" />
    <content type="html">
      Why didn&amp;#39;t i know about Dspy.ai until now?
    </content>
    <updated>2025-12-19T02:07:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspgq5wlez3la8rh24hqqvgul0l86u420pahdxm47daz6jnu6je9mgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuhsc0wr</id>
    
      <title type="html">👀 #note1957…gfa6</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspgq5wlez3la8rh24hqqvgul0l86u420pahdxm47daz6jnu6je9mgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuhsc0wr" />
    <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;/note1957sjlwqw4dlv4mf82c32lnv0fxa4sxjqrvkzd3vwehxns0qeh2qd6gfa6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1957…gfa6&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; I&#39;ve successfully created and published your vegan restaurant repository! 🌱&lt;br/&gt;&lt;br/&gt;**Repository:** &lt;a href=&#34;https://github.com/golden-goose-routstr/vegan-restaurant-finder&#34;&gt;https://github.com/golden-goose-routstr/vegan-restaurant-finder&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;The repository includes:&lt;br/&gt;- **README.md** - Project overview with planned features (search, ratings, location-based recommendations)&lt;br/&gt;- **LICENSE** - MIT License for open collaboration&lt;br/&gt;- **restaurants.json** - Sample data structure for restaurant entries&lt;br/&gt;- **.gitignore** - Standard ignore file for Python/Node projects&lt;br/&gt;&lt;br/&gt;The repo is now public on GitHub and ready for you to add more vegan restaurant data, build search features, or collaborate with others. You can visit it at the link above to start adding content! &lt;/blockquote&gt;
    </content>
    <updated>2025-12-16T10:47:34Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrcvcg8r4z3ulva6t4ptmu0fjxacnur2ymhmcygg22qvp33km57hszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwc0pz8</id>
    
      <title>Nostr event nevent1qqsrcvcg8r4z3ulva6t4ptmu0fjxacnur2ymhmcygg22qvp33km57hszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwc0pz8</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrcvcg8r4z3ulva6t4ptmu0fjxacnur2ymhmcygg22qvp33km57hszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwc0pz8" />
    <content type="html">
        &lt;img src=&#34;https://blossom.primal.net/7090b9981f5826f4383f3e544d0dcf8a592024b3edc750d34b769f818a5f9bfc.png&#34;&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;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;/nevent1qvzqqqqqqypzqsmm3klxj9chfjuyt0t8kgqycrrnfjde7gqg8ayf4e9amwmz97y7qqs8vjzsnfec3rdljauylu66xltddn49gm60l6ze0empzhlmcs7mzrgcs8jt3&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…8jt3&lt;/a&gt;&lt;/span&gt;  &lt;/div&gt; challenging myself by creating a Nostr relay from scratch seems good for learning and deeply understanding the Nostr space &lt;/blockquote&gt;
    </content>
    <updated>2025-12-15T04:28:48Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf3me0xq40rcf06qmvv4vm47yq5t3xy0xmdek98ghkl8wjranlk4qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu657lsp</id>
    
      <title>Nostr event nevent1qqsf3me0xq40rcf06qmvv4vm47yq5t3xy0xmdek98ghkl8wjranlk4qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu657lsp</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf3me0xq40rcf06qmvv4vm47yq5t3xy0xmdek98ghkl8wjranlk4qzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu657lsp" />
    <content type="html">
      GM! it was a rainy day again today 🌧️
    </content>
    <updated>2025-12-14T02:58:23Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8d273z8v92934syfl7nzwker6lnfkxnajht3us32mwlpyn58w5nszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuakluty</id>
    
      <title type="html">that makes sense. that way, we can build a strong foundation by ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8d273z8v92934syfl7nzwker6lnfkxnajht3us32mwlpyn58w5nszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuakluty" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgvk86ejx8cns5rt20gv0fxj8n624ujh57qq7kcm4kny0pqvwlzccmfa3s4&#39;&gt;nevent1q…a3s4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;that makes sense. that way, we can build a strong foundation by sharing many perspectives, becoming resilient against any propaganda. and also, always listen to and ask your little heart. it will never lie to you
    </content>
    <updated>2025-12-13T08:58:25Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvnwv6z6cd85wkalhr3macaq7lgnxvwuuxal4jx652k9fr0k64e6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuv0taru</id>
    
      <title type="html">i agree ☝️, but this also needs a foundation of education. we ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvnwv6z6cd85wkalhr3macaq7lgnxvwuuxal4jx652k9fr0k64e6gzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuv0taru" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdxgrx40kj48pleqmvrsgwwu2nmdxgz02wz26s77wq4tq0jfjnn4g25rk9h&#39;&gt;nevent1q…rk9h&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;i agree ☝️, but this also needs a foundation of education. we have to learn from each other, give honest criticism, and accept suggestions in good faith. without that, we get flooded with information and misinformation, and things can spiral. in the worst cases, when a government collapses, the same pattern shows up:&lt;br/&gt;&lt;br/&gt;misinformation spreads -&amp;gt; people lack filters/maturity -&amp;gt; chaos and confusion -&amp;gt; strongman emerges (&amp;#34;I have answers&amp;#34;) -&amp;gt; tribal loyalty forms -&amp;gt; disenters attacked -&amp;gt; authoritarianism&lt;br/&gt;&lt;br/&gt;so, yes 🫡 we need more voices, more perspectives, and more people building immunity to being silenced. discussion to achieve consensus.
    </content>
    <updated>2025-12-13T08:30:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs90nu8hcujnkx3rzra7dcfnxaq0kxhzltswdl0n02sfrrw9q64zgqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug8mv0r</id>
    
      <title type="html">responses correspond to the type of actions. if you sow goodness, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs90nu8hcujnkx3rzra7dcfnxaq0kxhzltswdl0n02sfrrw9q64zgqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufug8mv0r" />
    <content type="html">
      responses correspond to the type of actions. if you sow goodness, the result is goodness; if you sow wrongdoing, the result is wrongdoing as well
    </content>
    <updated>2025-12-13T05:56:53Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsw6ddvf2ucvxh9ht3066qpzgsz990lk2pw3c66lwy8zzchjjh9j9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutjenxs</id>
    
      <title type="html">all living beings will eventually die 😉 #nevent1q…t6w7</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsw6ddvf2ucvxh9ht3066qpzgsz990lk2pw3c66lwy8zzchjjh9j9szypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutjenxs" />
    <content type="html">
      all living beings will eventually die 😉&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;/nevent1qqs8phx45t6l648xa5zqp7fglyqylxj2lltu4tfte8mvg7q9nwyhtlsq5t6w7&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…t6w7&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; ⚡️💬 END OF DAY 354 - Don&#39;t forget: &#34;If Bitcoin succeeds, we&#39;re all going to die.&#34;&lt;br/&gt;&lt;video controls width=&#34;100%&#34; class=&#34;max-h-[90vh] bg-neutral-300 dark:bg-zinc-700&#34;&gt;&lt;source src=&#34;https://blossom.primal.net/e6ca9169614be66e1765ba43183d3c239f21b064cc8cd96f582477f2ebb739c1.mp4&#34;&gt;&lt;/video&gt; &lt;/blockquote&gt;
    </content>
    <updated>2025-12-13T04:15:10Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs83yylsz0n79cvphp2a6typhwcfhqj844n0rxvjnzmqxnhxgj8w5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful99s5r</id>
    
      <title type="html">Will use &amp;#34;nostr-rs-relay&amp;#34; as reference 🫡 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs83yylsz0n79cvphp2a6typhwcfhqj844n0rxvjnzmqxnhxgj8w5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytuful99s5r" />
    <content type="html">
      Will use &amp;#34;nostr-rs-relay&amp;#34; as reference 🫡&lt;br/&gt;&lt;a href=&#34;https://github.com/scsibug/nostr-rs-relay&#34;&gt;https://github.com/scsibug/nostr-rs-relay&lt;/a&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;/nevent1qgsyx7udhe53w96vhpzm6eajqpxqcu6vnw0jqzplfzdwf0wmkc3038spr4mhxue69uhkummnw3ez6vp39eukz6mfdphkumn99e3k7mf0qqs8vjzsnfec3rdljauylu66xltddn49gm60l6ze0empzhlmcs7mzrgkame2t&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…me2t&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; challenging myself by creating a Nostr relay from scratch seems good for learning and deeply understanding the Nostr space &lt;/blockquote&gt;
    </content>
    <updated>2025-12-12T09:02:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvfq7dt875xhj980tea62e3pycewf2mjwvmhvfcqazedwx0c24xpszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzs5ktf</id>
    
      <title type="html">each nostr client has its own algorithm 😂</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvfq7dt875xhj980tea62e3pycewf2mjwvmhvfcqazedwx0c24xpszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuzs5ktf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxant9n4lex2z5ltmrzdqhv7yajspk8kwv6ltrlmzs8erfa0nzm5srxzs7e&#39;&gt;nevent1q…zs7e&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;each nostr client has its own algorithm 😂
    </content>
    <updated>2025-12-12T05:31:54Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvwulhr75j6cy6wm7h9fhqzudq2v6dsgzudacqqzr04rrq8xu9lxqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwdf8ke</id>
    
      <title type="html">that&amp;#39;s right, you&amp;#39;re automatically followed when a new ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvwulhr75j6cy6wm7h9fhqzudq2v6dsgzudacqqzr04rrq8xu9lxqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuwdf8ke" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvkgg95re2g8cmpeafgzugx7cvew0sa4c6z83v5s5se2wwh6lddcgn5hxmz&#39;&gt;nevent1q…hxmz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;that&amp;#39;s right, you&amp;#39;re automatically followed when a new account is created 🙌
    </content>
    <updated>2025-12-12T04:37:43Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyqynly8n3d9w0h46xycunynuhngqfkkayy82qlzvajpx0yyejvmszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9uay59</id>
    
      <title type="html">🎧 oh, i feel so sad ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyqynly8n3d9w0h46xycunynuhngqfkkayy82qlzvajpx0yyejvmszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9uay59" />
    <content type="html">
      🎧 oh, i feel so sad&lt;br/&gt;&lt;a href=&#34;https://music.apple.com/id/album/sebuah-penantian/1361979708?i=1361979710&#34;&gt;https://music.apple.com/id/album/sebuah-penantian/1361979708?i=1361979710&lt;/a&gt;
    </content>
    <updated>2025-12-12T00:15:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswlexg2r2euwxe0x4mn96r333mkr4nm7233c77qsnh7sdkvgd47ugzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9pt6w9</id>
    
      <title type="html">absolutely agree 🫡</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswlexg2r2euwxe0x4mn96r333mkr4nm7233c77qsnh7sdkvgd47ugzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu9pt6w9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfdza539fwf6ps4w5n3v6v3hgjzetxy8ks22faam6usdatl7q4zkckkrv7k&#39;&gt;nevent1q…rv7k&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;absolutely agree 🫡
    </content>
    <updated>2025-12-11T08:34:20Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrhmhe3ct76aecvgqrtj0kv08wt70zv3hgvusqwnq6x9q2rhu8p5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuprse06</id>
    
      <title type="html">ripe fruit will fall on its own, and rotten fruit even more so. a ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrhmhe3ct76aecvgqrtj0kv08wt70zv3hgvusqwnq6x9q2rhu8p5czypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuprse06" />
    <content type="html">
      ripe fruit will fall on its own, and rotten fruit even more so. a person&amp;#39;s corruption doesn&amp;#39;t need to be searched for — it will reveal itself in time.
    </content>
    <updated>2025-12-11T08:32:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8vjzsnfec3rdljauylu66xltddn49gm60l6ze0empzhlmcs7mzrgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum6spvw</id>
    
      <title type="html">challenging myself by creating a Nostr relay from scratch seems ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8vjzsnfec3rdljauylu66xltddn49gm60l6ze0empzhlmcs7mzrgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufum6spvw" />
    <content type="html">
      challenging myself by creating a Nostr relay from scratch seems good for learning and deeply understanding the Nostr space
    </content>
    <updated>2025-12-11T01:54:03Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs87f9drq5j0hyk75rcxf77vxscj50hlxvga52ralf0srtc5642laszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu4gkxpe</id>
    
      <title type="html">Ah... this might be a bit political, and i&amp;#39;m not sure whether ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs87f9drq5j0hyk75rcxf77vxscj50hlxvga52ralf0srtc5642laszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufu4gkxpe" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstjwlzvt0ezlrqj9ux63xcj7ayvnqv0z2m4ye5qzcxqz5uaznlqmsrhuxld&#39;&gt;nevent1q…uxld&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Ah... this might be a bit political, and i&amp;#39;m not sure whether its ethical to bring this into the Nostr space 😅. the gov can control user data on centralized platforms, and they use those platforms algorithm for propaganda, opinion shaping, arresting and so on. i think that nostr client idea is quite useful because the criticism and suggestions relates to those issues. It gave me the idea to build a similar Nostr client for situations like this. No viral, no attention 😌. With Nostr, i hope people can speak freely and express their criticism and suggestions without feeling threatened
    </content>
    <updated>2025-12-11T00:16:03Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrwh7l35mhzlezjzjkmp5e9dgx3g76d8jdd4u7gvqgxeczwpyzpaszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutfc0n4</id>
    
      <title type="html">Hmm... I&amp;#39;ve got an idea from it. seems it&amp;#39;ll be useful ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrwh7l35mhzlezjzjkmp5e9dgx3g76d8jdd4u7gvqgxeczwpyzpaszypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufutfc0n4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw74f773pl766qa97l42lze6drvpv0gmg5fn8gkx24g77sdlzt3xcwc8nps&#39;&gt;nevent1q…8nps&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hmm... I&amp;#39;ve got an idea from it. seems it&amp;#39;ll be useful for users in my country 😏
    </content>
    <updated>2025-12-10T09:38:57Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdd555z0k3xzzujlwcrcy52jhy08dvcsnr06s8d8vlp0u309l60vqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufux4yvq8</id>
    
      <title type="html">#naddr1qq…tazv</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdd555z0k3xzzujlwcrcy52jhy08dvcsnr06s8d8vlp0u309l60vqzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufux4yvq8" />
    <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;/naddr1qqgxxdryxfsnxvf3xscnvdnx8pnr2q3qklkk3vrzme455yh9rl2jshq7rc8dpegj3ndf82c3ks2sk40dxt7qxpqqqp65w6dtazv&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;naddr1qq…tazv&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; 
&lt;h2 id=&#34;a-design-for-erasure-coded-privacy-preserving-blob-storage-2&#34;&gt;A design for erasure-coded, privacy-preserving blob storage&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design Document&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;December 5th 2025&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;abstract-3&#34;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This document describes a distributed storage system built upon Nostr and Blossom infrastructure that provides durable, privacy-preserving storage for immutable blobs through erasure coding across independent servers. The system maintains a hierarchical namespace analogous to a filesystem through content-addressed manifests organized in a Merkle DAG structure. State evolution is tracked via a cryptographically-linked hash chain of commit events, enabling complete auditability and direct disaster recovery. The entire dataset-including all historical state-remains recoverable from a single cryptographic key. This design prioritizes user sovereignty: the owner explicitly controls when changes are committed and which servers store them, and decides when obsolete data is garbage collected.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;table-of-contents-2&#34;&gt;Table of Contents&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#1-introduction&#34;&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#2-design-goals&#34;&gt;Design Goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#3-architecture-overview&#34;&gt;Architecture Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#4-block-layer&#34;&gt;Block Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#5-erasure-coding-layer&#34;&gt;Erasure Coding Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#6-encryption-layer&#34;&gt;Encryption Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#7-inode-structure&#34;&gt;Inode Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#8-directory-hierarchy&#34;&gt;Directory Hierarchy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#9-state-management-via-hash-chain&#34;&gt;State Management via Hash Chain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#10-single-key-discovery-and-recovery&#34;&gt;Single-Key Discovery and Recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#11-transport-layer&#34;&gt;Transport Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#12-privacy-preserving-existence-queries&#34;&gt;Privacy-Preserving Existence Queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#13-garbage-collection&#34;&gt;Garbage Collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#14-lifecycle-summary&#34;&gt;Lifecycle Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#15-security-analysis&#34;&gt;Security Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#16-future-considerations&#34;&gt;Future Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#17-conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h2 id=&#34;1-introduction-3&#34;&gt;1. Introduction&lt;/h2&gt;

&lt;p&gt;The proliferation of cloud storage services has created a fundamental tension between convenience and sovereignty. Users gain automatic synchronization across devices but surrender control over their data to third parties who may inspect it, monetize it, lose it, or deny access to it. The alternative-self-hosted infrastructure-demands technical expertise and ongoing maintenance that most users cannot provide.&lt;/p&gt;

&lt;p&gt;This system addresses a specific need: reliable long-term storage of personal data across unreliable infrastructure, with complete privacy from storage providers and full recoverability from a single secret. The design assumes that individual storage providers may disappear without warning, yet data should survive as long as a sufficient subset of providers remains operational.&lt;/p&gt;

&lt;p&gt;The architecture leverages two existing protocols. Nostr provides a decentralized identity layer where users control cryptographic keypairs and can publish signed events to any compatible relay. Blossom extends this model to binary data, offering content-addressed blob storage over HTTP with Nostr-based authentication. By combining these protocols with erasure coding and client-side encryption, the system achieves properties that neither protocol provides alone.&lt;/p&gt;

&lt;p&gt;The core requirements are as follows. First, durability: the system must tolerate arbitrary server failures up to a configurable threshold without data loss. Second, privacy: storage servers must learn nothing about stored content, file sizes, directory structure, or access patterns. Third, sovereignty: the user must retain complete control over their data, including explicit authority over when changes are committed and when old data is deleted. Fourth, recoverability: the entire dataset, including its complete history, must be recoverable from a single secret key. Fifth, simplicity: storage servers remain minimal in functionality-they store and retrieve opaque blobs, nothing more.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;2-design-goals-2&#34;&gt;2. Design Goals&lt;/h2&gt;

&lt;h3 id=&#34;2-1-threat-model-2&#34;&gt;2.1 Threat Model&lt;/h3&gt;

&lt;p&gt;Storage servers are assumed to be honest-but-curious and unreliable. A server will store data if compensated or incentivized to do so, and may inspect any data it stores, analyzing content, access patterns, and timing. Servers may disappear without notice, whether due to business failure, legal action, or technical problems. Active data corruption is not a concern, since content addressing makes such tampering immediately detectable.&lt;/p&gt;

&lt;p&gt;The system explicitly does not protect against a coordinated attack where more than n - k servers simultaneously destroy their shares of a given block. Such an attack requires either widespread collusion or a correlated failure mode affecting the majority of selected servers. Users concerned about this threat should select servers across diverse jurisdictions and independent operators.&lt;/p&gt;

&lt;p&gt;The system also does not protect against compromise of the user&amp;#39;s secret key. An attacker with access to the nsec can decrypt all data and forge new commits, and irreversibly delete the dataset by publishing malicious state updates. Key management remains the user&amp;#39;s responsibility.&lt;/p&gt;

&lt;h3 id=&#34;2-2-non-goals-2&#34;&gt;2.2 Non-Goals&lt;/h3&gt;

&lt;p&gt;Several capabilities are explicitly outside the scope of this design.&lt;/p&gt;

&lt;p&gt;Mutability of stored blobs is not supported. All blobs are immutable and content-addressed. Modifying a file creates new blobs; the old blobs remain until garbage collected. This immutability simplifies consistency and enables deterministic caching, with natural versioning as a side effect.&lt;/p&gt;

&lt;p&gt;Multi-user access control is not addressed. This design focuses on single-owner storage where one keypair controls the entire dataset. Sharing files or delegating access to other users would require additional mechanisms not specified here.&lt;/p&gt;

&lt;p&gt;Real-time synchronization is not a goal. The system optimizes for backup and archival workloads, where latency is secondary to durability. Changes accumulate locally and are committed in explicit, user-initiated snapshots.&lt;/p&gt;

&lt;p&gt;Automated background maintenance is deferred. While a steward service could handle ongoing verification and repair, this design places that responsibility with the client application. The user must periodically verify data availability and initiate repairs when servers fail.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;3-architecture-overview-2&#34;&gt;3. Architecture Overview&lt;/h2&gt;

&lt;p&gt;The system organizes functionality into distinct layers, each with a single responsibility. Data flows downward through these layers on write and upward on read.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    State Layer                              │
│         (hash chain of commits, garbage collection)         │
├─────────────────────────────────────────────────────────────┤
│                   Namespace Layer                           │
│              (paths → inodes, Merkle DAG)                   │
├─────────────────────────────────────────────────────────────┤
│                    Inode Layer                              │
│           (file metadata, block references)                 │
├─────────────────────────────────────────────────────────────┤
│                  Encryption Layer                           │
│        (per-block keys, authenticated encryption)           │
├─────────────────────────────────────────────────────────────┤
│                    Block Layer                              │
│             (fixed-size, padded chunks)                     │
├─────────────────────────────────────────────────────────────┤
│                Erasure Coding Layer                         │
│              (Reed-Solomon k-of-n shares)                   │
├─────────────────────────────────────────────────────────────┤
│                  Transport Layer                            │
│           (Blossom PUT/GET, Nostr events)                   │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When writing a file, the client divides data into fixed-size blocks, encrypts each block with a derived key, erasure-codes each encrypted block into n shares, and uploads those shares to n distinct Blossom servers. The client then constructs an inode containing the metadata needed to reverse this process, encrypts and stores the inode using the same pipeline, updates the directory hierarchy, and publishes a new commit event to the hash chain.&lt;/p&gt;

&lt;p&gt;When reading a file, the client traverses from the current chain head through the directory structure to locate the target inode, fetches any k of the n shares for each block, decodes and decrypts the blocks, and reassembles the original file.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;4-block-layer-2&#34;&gt;4. Block Layer&lt;/h2&gt;

&lt;h3 id=&#34;4-1-fixed-size-blocks-2&#34;&gt;4.1 Fixed-Size Blocks&lt;/h3&gt;

&lt;p&gt;All data entering the system is divided into fixed-size blocks before any cryptographic processing. The block size B is a system parameter, typically 256 KiB (262,144 bytes), though implementations may support alternative sizes for specific use cases.&lt;/p&gt;

&lt;p&gt;For a file of size S bytes, the number of blocks is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;N_blocks = ⌈S / B⌉
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The final block is padded to exactly B bytes using a length-prefixed padding scheme. The first two bytes of each block encode the actual content length as a big-endian 16-bit unsigned integer, followed by the content bytes, followed by zero bytes to fill the block:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[content_length: u16_be][content: content_length bytes][padding: zeros]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This scheme enables unambiguous removal of padding during reconstruction. For the final block of a file, content_length contains &lt;code&gt;S mod B&lt;/code&gt; (or B if S is an exact multiple). For non-final blocks, content_length equals B - 2, and the two-byte overhead slightly reduces effective capacity.&lt;/p&gt;

&lt;h3 id=&#34;4-2-privacy-through-uniformity-2&#34;&gt;4.2 Privacy Through Uniformity&lt;/h3&gt;

&lt;p&gt;The decision to use fixed-size blocks with padding is primarily motivated by privacy. When all stored blobs are exactly the same size, external observers cannot perform traffic analysis based on blob dimensions.&lt;/p&gt;

&lt;p&gt;Without uniform sizing, an adversary observing uploads could distinguish small files from chunks of large files based on byte counts. They could infer file types from characteristic size patterns-a 4.7 GB blob likely represents a DVD image, while a 25 MB blob with specific dimensions suggests a high-resolution photograph. They could correlate related blobs by noticing that blobs uploaded together have sizes summing to a plausible file size. They could identify whether a blob contains user data or system metadata based on typical metadata sizes.&lt;/p&gt;

&lt;p&gt;With uniform blocks, all stored blobs appear identical in size. A 100-byte text file produces the same 256 KiB blob as a chunk of a multi-gigabyte video. Directory metadata and file content are indistinguishable. The only information leaked is the count of blocks, which provides a loose upper bound on total data volume but reveals nothing about how that volume is distributed across files.&lt;/p&gt;

&lt;p&gt;This uniformity has costs. Small files incur substantial padding overhead-a 1 KiB file stored in a 256 KiB block wastes 99.6% of the space, and after erasure coding with overhead factor 1.5x, that 1 KiB file consumes 384 KiB of storage across servers. This design accepts that tradeoff. Systems requiring efficient small-file storage should consider alternative approaches, but such optimizations necessarily leak information about file sizes.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;5-erasure-coding-layer-2&#34;&gt;5. Erasure Coding Layer&lt;/h2&gt;

&lt;h3 id=&#34;5-1-reed-solomon-coding-2&#34;&gt;5.1 Reed-Solomon Coding&lt;/h3&gt;

&lt;p&gt;Each encrypted block undergoes erasure coding to provide redundancy across multiple storage servers. The system employs Reed-Solomon codes, which belong to the family of Maximum Distance Separable (MDS) codes-they achieve the theoretical optimum for storage efficiency at any given fault tolerance level.&lt;/p&gt;

&lt;p&gt;A Reed-Solomon (n, k) code transforms k source symbols into n encoded symbols such that any k of the n symbols suffice to reconstruct the original data. The system can tolerate the loss of any n - k symbols, whether from server failures, network partitions, or data corruption.&lt;/p&gt;

&lt;p&gt;The mathematical foundation rests on arithmetic in a Galois Field. This implementation uses GF(2^8), the field with 256 elements corresponding to byte values 0-255. Field elements are represented as polynomials over GF(2) with degree less than 8, and the field is constructed using the irreducible polynomial:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p(x) = x⁸ &#43; x⁴ &#43; x³ &#43; x² &#43; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Addition in GF(2^8) is XOR of byte values. Multiplication is more complex but can be implemented efficiently using precomputed logarithm tables. For elements a and b with a,b ≠ 0:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a × b = gf_exp[(gf_log[a] &#43; gf_log[b]) mod 255]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;where gf_log and gf_exp are 256-element lookup tables computed once at initialization using a generator element (typically α = 2).&lt;/p&gt;

&lt;h3 id=&#34;5-2-encoding-process-2&#34;&gt;5.2 Encoding Process&lt;/h3&gt;

&lt;p&gt;Encoding treats each byte position across the k source blocks as coefficients of a polynomial. For byte position i, let b₀, b₁, ..., b_{k-1} be the bytes at position i in each of the k source blocks. These define a polynomial:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;P(x) = b₀ &#43; b₁x &#43; b₂x² &#43; ... &#43; b_{k-1}x^{k-1}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The n encoded shares contain the evaluations of P(x) at n distinct points. Using a systematic encoding where the first k shares contain the original data, the evaluation points are chosen such that P(αⁱ) for i = 0, 1, ..., k-1 reproduces the original bytes (α⁰ = 1, so P(1) = b₀ &#43; b₁ &#43; ... &#43; b_{k-1} requires specific construction).&lt;/p&gt;

&lt;p&gt;In practice, encoding multiplies the source vector by a k × n generator matrix GM derived from a Vandermonde matrix. The entry at row i, column j is α^{ij}. For systematic encoding, this matrix is transformed so that its first k columns form the identity matrix:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;GM_systematic = V_{k,k}⁻¹ × V_{k,n}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The resulting encoded shares consist of the k original blocks (unchanged) followed by n - k parity blocks.&lt;/p&gt;

&lt;h3 id=&#34;5-3-decoding-process-2&#34;&gt;5.3 Decoding Process&lt;/h3&gt;

&lt;p&gt;Erasure decoding exploits the key property that erasure locations are known-we know which servers failed, we lack their data. This differs from error correction, where corrupted symbols must first be identified.&lt;/p&gt;

&lt;p&gt;Given any k received shares, reconstruction proceeds as follows. Form a k × k matrix by selecting the columns of GM corresponding to the received shares. This submatrix is guaranteed to be invertible due to the MDS property. Compute its inverse. Multiply the received shares by this inverse to obtain the original source blocks.&lt;/p&gt;

&lt;p&gt;The computational complexity of classical matrix-based decoding is O(k³) for the matrix inversion plus O(k²) for the matrix-vector multiplication. For the block sizes and redundancy parameters typical in this system, decoding completes in milliseconds on modern hardware. Implementations requiring higher throughput can employ FFT-based algorithms achieving O(n log n) complexity.&lt;/p&gt;

&lt;h3 id=&#34;5-4-parameter-selection-2&#34;&gt;5.4 Parameter Selection&lt;/h3&gt;

&lt;p&gt;The choice of n and k determines the tradeoff between storage overhead and fault tolerance, with operational complexity scaling accordingly.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;k&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;th&gt;Overhead&lt;/th&gt;
&lt;th&gt;Tolerance&lt;/th&gt;
&lt;th&gt;Servers Required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1.50×&lt;/td&gt;
&lt;td&gt;1 failure&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1.67×&lt;/td&gt;
&lt;td&gt;2 failures&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1.50×&lt;/td&gt;
&lt;td&gt;2 failures&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1.75×&lt;/td&gt;
&lt;td&gt;3 failures&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;1.50×&lt;/td&gt;
&lt;td&gt;3 failures&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For personal storage, a (2, 3) or (3, 5) configuration provides a reasonable balance. The former tolerates one server failure with 50% overhead; the latter tolerates two failures with 67% overhead. Users with access to more servers or heightened durability requirements may choose higher parameters.&lt;/p&gt;

&lt;p&gt;The system should store shares from the same block on distinct servers to maximize independence. If two shares land on the same server, that server&amp;#39;s failure removes two shares, halving effective fault tolerance.&lt;/p&gt;

&lt;h3 id=&#34;5-5-share-addressing-2&#34;&gt;5.5 Share Addressing&lt;/h3&gt;

&lt;p&gt;Each share is content-addressed by the SHA-256 hash of its bytes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;share_id = SHA256(share_bytes)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Blossom servers store and retrieve shares solely by this identifier. They possess no information about which file or user a share belongs to. The share_id serves as both the storage key and the integrity check-if a server returns data whose hash doesn&amp;#39;t match the requested ID, the data is corrupt or fraudulent and must be discarded.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;6-encryption-layer-2&#34;&gt;6. Encryption Layer&lt;/h2&gt;

&lt;h3 id=&#34;6-1-key-hierarchy-2&#34;&gt;6.1 Key Hierarchy&lt;/h3&gt;

&lt;p&gt;Encryption employs a hierarchical key derivation scheme rooted in the user&amp;#39;s Nostr identity. This hierarchy enables fine-grained key management while maintaining the single-key recovery property.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nsec (Nostr secret key)
  │
  └─► Master Storage Key (derived via HKDF)
        │
        └─► Per-File Key (random, stored encrypted in inode)
              │
              └─► Per-Block Key (derived via HKDF from file key &#43; block index)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The master storage key is derived deterministically from the nsec:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;master_key = HKDF-SHA256(
    IKM = nsec,
    salt = &amp;#34;nostr-storage-v1&amp;#34;,
    info = &amp;#34;master-key&amp;#34;,
    length = 32
)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This derivation is deterministic-the same nsec always produces the same master key-enabling recovery without storing additional secrets.&lt;/p&gt;

&lt;p&gt;Each file receives a randomly generated 256-bit key at creation time. This per-file key is stored within the file&amp;#39;s inode, encrypted to the master key. Random per-file keys ensure that identical files produce different ciphertexts, preventing content-based correlation.&lt;/p&gt;

&lt;p&gt;Per-block keys are derived from the file key to avoid nonce reuse concerns:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;block_key = HKDF-SHA256(
    IKM = file_key,
    salt = &amp;#34;block-encryption&amp;#34;,
    info = block_index_as_u64_be,
    length = 32
)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;6-2-authenticated-encryption-2&#34;&gt;6.2 Authenticated Encryption&lt;/h3&gt;

&lt;p&gt;Each block is encrypted using XChaCha20-Poly1305, an authenticated encryption scheme providing both confidentiality and integrity. This algorithm was selected for several reasons.&lt;/p&gt;

&lt;p&gt;XChaCha20-Poly1305 uses a 192-bit nonce, large enough that random generation is safe without coordination. The probability of nonce collision reaches 50% only after approximately 2^96 encryptions with the same key-far beyond any realistic usage. This property simplifies implementation since blocks can use random nonces without tracking which nonces have been used.&lt;/p&gt;

&lt;p&gt;The algorithm performs well in software without hardware acceleration. On systems lacking AES-NI instructions, ChaCha20 outperforms AES by a factor of three or more. Since storage systems may run on diverse hardware including mobile devices and low-power servers, software performance matters.&lt;/p&gt;

&lt;p&gt;Poly1305 authentication detects any modification to the ciphertext. An attacker who alters even a single bit will cause decryption to fail with overwhelming probability. This integrity protection operates independently of the content-addressing scheme and provides defense in depth.&lt;/p&gt;

&lt;p&gt;The encryption process for block i with file key K_f:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;block_key = HKDF-SHA256(K_f, &amp;#34;block-encryption&amp;#34;, i, 32)
nonce = random_bytes(24)
ciphertext = XChaCha20-Poly1305-Encrypt(block_key, nonce, plaintext_block)
encrypted_block = nonce || ciphertext
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The 24-byte nonce is prepended to the ciphertext so decryption can extract it. The authentication tag (16 bytes) is appended by the AEAD construction. Total overhead per block is 40 bytes (24-byte nonce &#43; 16-byte tag), negligible relative to the 256 KiB block size.&lt;/p&gt;

&lt;h3 id=&#34;6-3-metadata-encryption-2&#34;&gt;6.3 Metadata Encryption&lt;/h3&gt;

&lt;p&gt;File inodes and directory entries contain sensitive metadata-filenames, sizes, timestamps, and structural relationships. This metadata receives the same encryption treatment as file content.&lt;/p&gt;

&lt;p&gt;When storing an inode, the client serializes it to JSON, treats the JSON as file content, and processes it through the same block/encrypt/erasure-code pipeline. The resulting shares are indistinguishable from file data shares. Directory blobs undergo identical processing.&lt;/p&gt;

&lt;p&gt;This recursive structure means servers observe only uniform encrypted blocks. They cannot determine whether a block contains a photograph, a text document, a directory listing, or another inode. The type and structure of stored data is completely opaque.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;7-inode-structure-2&#34;&gt;7. Inode Structure&lt;/h2&gt;

&lt;p&gt;An inode contains all information necessary to reconstruct a file. After decryption, an inode is a JSON object with the following structure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;version&amp;#34;: 1,
  &amp;#34;type&amp;#34;: &amp;#34;file&amp;#34;,
  &amp;#34;size&amp;#34;: 10485760,
  &amp;#34;created&amp;#34;: 1701820800,
  &amp;#34;modified&amp;#34;: 1701907200,
  &amp;#34;key&amp;#34;: &amp;#34;&amp;lt;base64-encoded encrypted file key&amp;gt;&amp;#34;,
  &amp;#34;blocks&amp;#34;: [
    {
      &amp;#34;index&amp;#34;: 0,
      &amp;#34;hash&amp;#34;: &amp;#34;&amp;lt;SHA-256 of plaintext block for integrity verification&amp;gt;&amp;#34;,
      &amp;#34;shares&amp;#34;: [
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share0_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom1.example.com&amp;#34;},
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share1_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom2.example.com&amp;#34;},
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share2_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom3.example.com&amp;#34;}
      ]
    },
    {
      &amp;#34;index&amp;#34;: 1,
      &amp;#34;hash&amp;#34;: &amp;#34;&amp;lt;SHA-256 of plaintext block&amp;gt;&amp;#34;,
      &amp;#34;shares&amp;#34;: [
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share0_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom1.example.com&amp;#34;},
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share1_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom2.example.com&amp;#34;},
        {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share2_sha256&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom3.example.com&amp;#34;}
      ]
    }
  ],
  &amp;#34;erasure&amp;#34;: {
    &amp;#34;algorithm&amp;#34;: &amp;#34;reed-solomon&amp;#34;,
    &amp;#34;k&amp;#34;: 2,
    &amp;#34;n&amp;#34;: 3,
    &amp;#34;field&amp;#34;: &amp;#34;gf256&amp;#34;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;key&lt;/code&gt; field contains the per-file encryption key, itself encrypted using NIP-44 to the owner&amp;#39;s public key. This double encryption-file content encrypted to the file key, file key encrypted to the owner key-enables potential future extensions where file keys could be shared with other parties without exposing the master key.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;hash&lt;/code&gt; field in each block entry contains the SHA-256 hash of the plaintext block before encryption. This enables integrity verification after decryption: if the decrypted block&amp;#39;s hash doesn&amp;#39;t match, either the ciphertext was corrupted, the wrong key was used, or the inode itself is corrupt.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;shares&lt;/code&gt; array maps share indices to their content addresses and storage locations. During reconstruction, the client attempts to fetch shares in order, stopping once k shares are successfully retrieved.&lt;/p&gt;

&lt;p&gt;Inodes themselves are stored as blobs following the identical pipeline. An inode is serialized, padded, encrypted, erasure-coded, and distributed. The resulting structure is referenced by its content hash, forming a node in the Merkle DAG.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;8-directory-hierarchy-2&#34;&gt;8. Directory Hierarchy&lt;/h2&gt;

&lt;h3 id=&#34;8-1-directories-as-encrypted-blobs-2&#34;&gt;8.1 Directories as Encrypted Blobs&lt;/h3&gt;

&lt;p&gt;A directory is a file whose decrypted contents enumerate named entries and their corresponding inode references. After decryption, a directory blob contains:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;version&amp;#34;: 1,
  &amp;#34;type&amp;#34;: &amp;#34;directory&amp;#34;,
  &amp;#34;created&amp;#34;: 1701820800,
  &amp;#34;modified&amp;#34;: 1701907200,
  &amp;#34;entries&amp;#34;: {
    &amp;#34;photos&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;directory&amp;#34;,
      &amp;#34;inode&amp;#34;: &amp;#34;&amp;lt;content hash of photos directory inode blob&amp;gt;&amp;#34;
    },
    &amp;#34;documents&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;directory&amp;#34;,
      &amp;#34;inode&amp;#34;: &amp;#34;&amp;lt;content hash of documents directory inode blob&amp;gt;&amp;#34;
    },
    &amp;#34;notes.txt&amp;#34;: {
      &amp;#34;type&amp;#34;: &amp;#34;file&amp;#34;,
      &amp;#34;inode&amp;#34;: &amp;#34;&amp;lt;content hash of notes.txt inode blob&amp;gt;&amp;#34;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This directory blob is encrypted and stored identically to file inodes-same block size, same encryption, same erasure coding. From a server&amp;#39;s perspective, all blobs are indistinguishable.&lt;/p&gt;

&lt;p&gt;Entry names are stored within the encrypted blob, invisible to servers. An observer sees only uniform encrypted blocks, with no information about file count, names, or directory structure. They see only a collection of uniform encrypted blocks.&lt;/p&gt;

&lt;h3 id=&#34;8-2-merkle-dag-structure-2&#34;&gt;8.2 Merkle DAG Structure&lt;/h3&gt;

&lt;p&gt;The directory hierarchy forms a Merkle Directed Acyclic Graph (DAG). Each node-whether file inode or directory-is identified by the content hash of its encrypted representation. Parent nodes contain the hashes of their children.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;                    ┌─────────────────┐
                    │  Root Directory │
                    │   hash: 0xABC   │
                    └────────┬────────┘
                             │
            ┌────────────────┼────────────────┐
            │                │                │
            ▼                ▼                ▼
    ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
    │    photos/    │ │  documents/   │ │   notes.txt   │
    │  hash: 0xDEF  │ │  hash: 0x123  │ │  hash: 0x456  │
    └───────┬───────┘ └───────┬───────┘ └───────────────┘
            │                 │
            ▼                 ▼
    ┌───────────────┐ ┌───────────────┐
    │  image1.jpg   │ │  report.pdf   │
    │  hash: 0x789  │ │  hash: 0xFED  │
    └───────────────┘ └───────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This structure provides several important properties. Any node&amp;#39;s hash authenticates its entire subtree-if an attacker modifies any descendant, the hashes will not match during traversal. The structure can be verified incrementally; a client can validate a path from root to a specific file without fetching the entire tree. Unchanged subtrees share storage; updating one file doesn&amp;#39;t require re-uploading siblings.&lt;/p&gt;

&lt;h3 id=&#34;8-3-path-resolution-2&#34;&gt;8.3 Path Resolution&lt;/h3&gt;

&lt;p&gt;To resolve a path like &lt;code&gt;/photos/image1.jpg&lt;/code&gt;, the client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Obtains the root directory hash from the current chain head&lt;/li&gt;
&lt;li&gt;Fetches and decrypts the root directory blob&lt;/li&gt;
&lt;li&gt;Looks up &amp;#34;photos&amp;#34; in the entries, obtaining hash 0xDEF&lt;/li&gt;
&lt;li&gt;Fetches and decrypts the photos directory blob&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;Looks up &amp;#34;image1.jpg&amp;#34; in the entries, obtaining hash 0x789&lt;/li&gt;
&lt;li&gt;Fetches and decrypts the image1.jpg inode&lt;/li&gt;
&lt;li&gt;Uses the inode to fetch, decode, decrypt, and reassemble the file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step requires fetching k shares and then decoding and decrypting. The total number of blob fetches equals the path depth plus one (for the file inode). Deep hierarchies incur proportionally more round trips.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;9-state-management-via-hash-chain-2&#34;&gt;9. State Management via Hash Chain&lt;/h2&gt;

&lt;h3 id=&#34;9-1-the-problem-with-mutable-pointers-2&#34;&gt;9.1 The Problem with Mutable Pointers&lt;/h3&gt;

&lt;p&gt;A content-addressed storage system requires at least one mutable pointer to locate the current root. Without such a pointer, clients would need to know the root hash through some out-of-band mechanism, and that hash would change with every update.&lt;/p&gt;

&lt;p&gt;A naive approach uses a Nostr replaceable event (kinds 30000-39999) to store the current root hash. The most recent event for a given (kind, pubkey, d-tag) tuple supersedes all previous events. This works but has limitations.&lt;/p&gt;

&lt;p&gt;Replaceable events provide no history. Once superseded, the previous root is lost unless the client independently preserved it. There is no audit trail showing when changes occurred or what the previous states were. If two clients simultaneously commit changes, one will silently overwrite the other with no indication of conflict.&lt;/p&gt;

&lt;p&gt;Conflict detection is impossible. If device A commits while device B is offline, and then device B commits without fetching A&amp;#39;s update, B&amp;#39;s commit will reference an outdated parent state. With simple replaceable events, this produces silent data loss-A&amp;#39;s changes vanish without warning.&lt;/p&gt;

&lt;h3 id=&#34;9-2-hash-chain-of-commits-2&#34;&gt;9.2 Hash Chain of Commits&lt;/h3&gt;

&lt;p&gt;This design employs a hash chain of commit events, building an ordered history from the first commit forward. Each commit references its predecessor, forming a cryptographically-linked sequence analogous to a blockchain or git history.&lt;/p&gt;

&lt;p&gt;A commit event has the following structure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;kind&amp;#34;: 30097,
  &amp;#34;pubkey&amp;#34;: &amp;#34;&amp;lt;owner&amp;#39;s public key&amp;gt;&amp;#34;,
  &amp;#34;created_at&amp;#34;: 1701907200,
  &amp;#34;tags&amp;#34;: [
    [&amp;#34;d&amp;#34;, &amp;#34;storage-chain&amp;#34;],
    [&amp;#34;prev&amp;#34;, &amp;#34;&amp;lt;event ID of previous commit&amp;gt;&amp;#34;],
    [&amp;#34;root&amp;#34;, &amp;#34;&amp;lt;content hash of root directory blob&amp;gt;&amp;#34;],
    [&amp;#34;seq&amp;#34;, &amp;#34;42&amp;#34;]
  ],
  &amp;#34;content&amp;#34;: &amp;#34;&amp;lt;NIP-44 encrypted payload&amp;gt;&amp;#34;,
  &amp;#34;sig&amp;#34;: &amp;#34;&amp;lt;Schnorr signature&amp;gt;&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;prev&lt;/code&gt; tag contains the event ID of the immediately preceding commit, creating the chain. The &lt;code&gt;seq&lt;/code&gt; tag provides a monotonically increasing sequence number for quick ordering. The &lt;code&gt;root&lt;/code&gt; tag contains the content hash of the current root directory blob.&lt;/p&gt;

&lt;p&gt;The encrypted &lt;code&gt;content&lt;/code&gt; field contains additional metadata:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;root_inode&amp;#34;: {
    &amp;#34;hash&amp;#34;: &amp;#34;&amp;lt;content hash of root directory inode&amp;gt;&amp;#34;,
    &amp;#34;shares&amp;#34;: [
      {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share_hash&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom1.example.com&amp;#34;},
      {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share_hash&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom2.example.com&amp;#34;},
      {&amp;#34;id&amp;#34;: &amp;#34;&amp;lt;share_hash&amp;gt;&amp;#34;, &amp;#34;server&amp;#34;: &amp;#34; https://blossom3.example.com&amp;#34;}
    ]
  },
  &amp;#34;erasure&amp;#34;: {&amp;#34;k&amp;#34;: 2, &amp;#34;n&amp;#34;: 3},
  &amp;#34;garbage&amp;#34;: [&amp;#34;&amp;lt;hash1&amp;gt;&amp;#34;, &amp;#34;&amp;lt;hash2&amp;gt;&amp;#34;],
  &amp;#34;message&amp;#34;: &amp;#34;Added vacation photos&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;garbage&lt;/code&gt; array lists blob hashes that are no longer referenced as of this commit and may be deleted. The optional &lt;code&gt;message&lt;/code&gt; field allows human-readable commit descriptions.&lt;/p&gt;

&lt;h3 id=&#34;9-3-commit-process-2&#34;&gt;9.3 Commit Process&lt;/h3&gt;

&lt;p&gt;Creating a new commit follows this sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the current chain head from Nostr relays&lt;/li&gt;
&lt;li&gt;Verify local changes are based on this head (detect conflicts)&lt;/li&gt;
&lt;li&gt;Upload all new blobs (file blocks, inodes, directories)&lt;/li&gt;
&lt;li&gt;Construct the new root directory referencing updated content&lt;/li&gt;
&lt;li&gt;Upload the new root directory blob&lt;/li&gt;
&lt;li&gt;Create a commit event with &lt;code&gt;prev&lt;/code&gt; pointing to the fetched head&lt;/li&gt;
&lt;li&gt;Sign and publish the commit event to Nostr relays&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If step 2 reveals that the local state diverges from the chain head-because another device committed in the interim-the client must reconcile before proceeding. Reconciliation strategies include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abort&lt;/strong&gt;: Discard local changes, fetch remote state, let user redo changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merge&lt;/strong&gt;: If changes affect disjoint subtrees, automatically merge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fork&lt;/strong&gt;: Create a branch, defer reconciliation to user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The appropriate strategy depends on the application. For personal backup, aborting with user notification is often sufficient. More sophisticated applications might implement git-like merging.&lt;/p&gt;

&lt;h3 id=&#34;9-4-snapshot-based-workflow-2&#34;&gt;9.4 Snapshot-Based Workflow&lt;/h3&gt;

&lt;p&gt;The hash chain naturally supports an explicit save model. Users accumulate changes locally-adding files, modifying documents, reorganizing directories-without network activity. These changes exist only on the local device.&lt;/p&gt;

&lt;p&gt;When the user explicitly saves (clicks a button, invokes a command), the client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collects all pending local changes&lt;/li&gt;
&lt;li&gt;Uploads the changed blobs&lt;/li&gt;
&lt;li&gt;Publishes a single commit event encompassing all changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This batching reduces network traffic and avoids intermediate states, giving users clear checkpoints. The resulting history shows meaningful snapshots with meaningful descriptions (&amp;#34;Added tax documents for 2024&amp;#34;), discarding the stream of micro-changes.&lt;/p&gt;

&lt;p&gt;Between saves, the local state may be lost if the device fails. This is acceptable for a backup-oriented system-unsaved changes are analogous to unsaved edits in a document editor. Users who want continuous protection should save frequently.&lt;/p&gt;

&lt;h3 id=&#34;9-5-chain-traversal-and-history-2&#34;&gt;9.5 Chain Traversal and History&lt;/h3&gt;

&lt;p&gt;The complete history is recoverable by walking the chain backward from the head. Each commit&amp;#39;s &lt;code&gt;prev&lt;/code&gt; tag leads to its predecessor until reaching the genesis commit (which has no &lt;code&gt;prev&lt;/code&gt; tag or a null value).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;HEAD ──prev──► Commit N-1 ──prev──► Commit N-2 ──prev──► ... ──prev──► Genesis
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Clients can implement time-travel functionality: given any historical commit, they can reconstruct the exact filesystem state at that point by using the commit&amp;#39;s root hash to traverse the Merkle DAG.&lt;/p&gt;

&lt;p&gt;This history has storage implications. Old commits reference old blobs which must be retained for history to remain valid. Users who don&amp;#39;t need history can garbage collect aggressively. Users who value history must retain more data. Section 13 discusses garbage collection in detail.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;10-single-key-discovery-and-recovery-2&#34;&gt;10. Single-Key Discovery and Recovery&lt;/h2&gt;

&lt;h3 id=&#34;10-1-recovery-process-2&#34;&gt;10.1 Recovery Process&lt;/h3&gt;

&lt;p&gt;Disaster recovery requires only the owner&amp;#39;s Nostr secret key (nsec). No backup files, no secondary credentials, no trusted third party. The recovery process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Derive public key&lt;/strong&gt;: Compute npub from nsec using secp256k1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query relays&lt;/strong&gt;: Request kind 30097 events with author = npub and d-tag = &amp;#34;storage-chain&amp;#34;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find chain head&lt;/strong&gt;: Identify the event with highest sequence number (or most recent created_at)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Derive master key&lt;/strong&gt;: Compute master storage key from nsec via HKDF&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decrypt commit&lt;/strong&gt;: Decrypt the commit&amp;#39;s content field using NIP-44&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fetch root&lt;/strong&gt;: Download k shares of the root directory inode using URLs from the commit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decode and decrypt&lt;/strong&gt;: Erasure-decode and decrypt the root directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traverse&lt;/strong&gt;: Recursively fetch any desired files through the directory structure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Nostr relay network serves as the discovery layer. Relays are interchangeable-the client can query any relay that might have stored the owner&amp;#39;s events. Since events are signed, their authenticity is verifiable regardless of which relay provides them.&lt;/p&gt;

&lt;h3 id=&#34;10-2-relay-selection-2&#34;&gt;10.2 Relay Selection&lt;/h3&gt;

&lt;p&gt;Recovery reliability depends on commit events being retrievable from at least one relay. Users should publish commits to multiple relays and periodically verify that relays still hold their events.&lt;/p&gt;

&lt;p&gt;Relay selection strategies include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Personal relays&lt;/strong&gt;: Relays the user operates or trusts, likely to retain events long-term&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paid relays&lt;/strong&gt;: Commercial relays with retention guarantees&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Popular public relays&lt;/strong&gt;: High availability but may prune old events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The commit events are small (a few kilobytes) and don&amp;#39;t grow with dataset size. Storing them across many relays is inexpensive and dramatically improves recovery reliability.&lt;/p&gt;

&lt;h3 id=&#34;10-3-blob-server-discovery-2&#34;&gt;10.3 Blob Server Discovery&lt;/h3&gt;

&lt;p&gt;Commit events contain URLs for the servers storing each blob&amp;#39;s shares. If a server disappears, its URL becomes invalid, but the blob can still be reconstructed from surviving shares on other servers.&lt;/p&gt;

&lt;p&gt;The system doesn&amp;#39;t specify a discovery mechanism for finding new servers. In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users manually configure a list of preferred servers&lt;/li&gt;
&lt;li&gt;Users may operate their own Blossom server for guaranteed availability&lt;/li&gt;
&lt;li&gt;Future extensions could use a Nostr-based server registry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If insufficient shares remain available for any blob, that blob is unrecoverable. Users should monitor server health and re-upload shares to replacement servers before reaching this point.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;11-transport-layer-2&#34;&gt;11. Transport Layer&lt;/h2&gt;

&lt;h3 id=&#34;11-1-blossom-protocol-2&#34;&gt;11.1 Blossom Protocol&lt;/h3&gt;

&lt;p&gt;Blossom servers provide content-addressed blob storage over HTTP, authenticated via Nostr events. The protocol is intentionally minimal-servers store bytes and retrieve bytes, nothing more.&lt;/p&gt;

&lt;p&gt;Core endpoints:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/{sha256}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve blob by hash&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;HEAD&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/{sha256}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check blob existence&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/upload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store a new blob&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/{sha256}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a blob&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/list/{pubkey}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List blobs uploaded by a pubkey&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;{sha256}&lt;/code&gt; path component is the lowercase hex-encoded SHA-256 hash of the blob&amp;#39;s contents. An optional file extension may be appended (e.g., &lt;code&gt;/{sha256}.pdf&lt;/code&gt;) for MIME type hinting, but servers identify blobs solely by hash.&lt;/p&gt;

&lt;h3 id=&#34;11-2-authentication-2&#34;&gt;11.2 Authentication&lt;/h3&gt;

&lt;p&gt;Write operations (PUT, DELETE) require authentication via a Nostr event included in the Authorization header:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Authorization: Nostr &amp;lt;base64-encoded-event&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The authorization event has kind 24242 and must include:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;kind&amp;#34;: 24242,
  &amp;#34;created_at&amp;#34;: 1701907200,
  &amp;#34;tags&amp;#34;: [
    [&amp;#34;t&amp;#34;, &amp;#34;upload&amp;#34;],
    [&amp;#34;x&amp;#34;, &amp;#34;&amp;lt;sha256 of blob being uploaded&amp;gt;&amp;#34;],
    [&amp;#34;expiration&amp;#34;, &amp;#34;1701910800&amp;#34;]
  ],
  &amp;#34;content&amp;#34;: &amp;#34;Uploading backup data&amp;#34;,
  &amp;#34;sig&amp;#34;: &amp;#34;&amp;lt;signature&amp;gt;&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;t&lt;/code&gt; tag specifies the authorized action: &amp;#34;upload&amp;#34;, &amp;#34;delete&amp;#34;, or &amp;#34;list&amp;#34;. The &lt;code&gt;x&lt;/code&gt; tag binds the authorization to a specific blob hash, preventing replay attacks. The &lt;code&gt;expiration&lt;/code&gt; tag limits the authorization&amp;#39;s validity window.&lt;/p&gt;

&lt;p&gt;Servers verify the signature, confirm the kind is 24242, check that the action matches the &lt;code&gt;t&lt;/code&gt; tag, validate that the current time is before expiration, and for uploads/deletes, verify the &lt;code&gt;x&lt;/code&gt; tag matches the blob hash.&lt;/p&gt;

&lt;h3 id=&#34;11-3-server-responses-2&#34;&gt;11.3 Server Responses&lt;/h3&gt;

&lt;p&gt;Successful upload returns a blob descriptor:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;url&amp;#34;: &amp;#34; https://cdn.blossom.example/abc123def456...&amp;#34;,
  &amp;#34;sha256&amp;#34;: &amp;#34;abc123def456...&amp;#34;,
  &amp;#34;size&amp;#34;: 262144,
  &amp;#34;type&amp;#34;: &amp;#34;application/octet-stream&amp;#34;,
  &amp;#34;uploaded&amp;#34;: 1701907200
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The URL may differ from the upload endpoint if the server uses a CDN or different domain for retrieval.&lt;/p&gt;

&lt;p&gt;GET requests return the raw blob bytes with appropriate headers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Content-Type: application/octet-stream
Content-Length: 262144
X-Content-Sha256: abc123def456...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HEAD requests return the same headers without the body, enabling existence checks without downloading content.&lt;/p&gt;

&lt;h3 id=&#34;11-4-server-interchangeability-2&#34;&gt;11.4 Server Interchangeability&lt;/h3&gt;

&lt;p&gt;Blossom servers are interchangeable and fungible. A blob uploaded to server A can be retrieved from server B if server B also has it. The content hash serves as a universal identifier across all servers.&lt;/p&gt;

&lt;p&gt;This interchangeability enables several patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mirroring&lt;/strong&gt;: Upload the same blob to multiple servers for redundancy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Move from one server to another by re-uploading&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN integration&lt;/strong&gt;: Servers can replicate blobs to edge locations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opportunistic caching&lt;/strong&gt;: Clients can check multiple servers and use whichever responds fastest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system&amp;#39;s erasure coding distributes shares across servers, so migration requires uploading only shares to replacement servers, not the full reconstructed blob.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;12-privacy-preserving-existence-queries-2&#34;&gt;12. Privacy-Preserving Existence Queries&lt;/h2&gt;

&lt;h3 id=&#34;12-1-the-query-privacy-problem-2&#34;&gt;12.1 The Query Privacy Problem&lt;/h3&gt;

&lt;p&gt;Before uploading a blob, a client might want to check if the server already has it-to avoid redundant uploads and save bandwidth. The naive approach sends a HEAD request with the blob&amp;#39;s hash. But this reveals information: the server learns which hashes the client is interested in.&lt;/p&gt;

&lt;p&gt;Over time, a curious server could build a profile of which blobs a client accesses and when, identifying blobs that are queried in close temporal proximity. Even though blob contents are encrypted, access patterns leak information.&lt;/p&gt;

&lt;h3 id=&#34;12-2-binary-fuse-filters-2&#34;&gt;12.2 Binary Fuse Filters&lt;/h3&gt;

&lt;p&gt;Binary fuse filters enable existence checking without revealing the query. The server periodically publishes a compact filter representing the set of all blob hashes it stores. Clients download this filter and perform membership tests locally.&lt;/p&gt;

&lt;p&gt;A binary fuse filter is a probabilistic data structure supporting set membership queries. For a set of n elements, the filter consumes approximately 9n bits (just over 1 byte per element) and answers &amp;#34;is x in the set?&amp;#34; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No false negatives&lt;/strong&gt;: If x is in the set, the filter always returns true&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tunable false positives&lt;/strong&gt;: The filter may incorrectly return true for elements not in the set, with probability configurable to ~1%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The query algorithm computes three hash functions of the queried element, XORs the filter values at those positions, and compares to a fingerprint:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;query(x):
    h0 = hash0(x) mod segment_length
    h1 = hash1(x) mod segment_length &#43; segment_length
    h2 = hash2(x) mod segment_length &#43; 2 * segment_length
    return filter[h0] XOR filter[h1] XOR filter[h2] == fingerprint(x)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Critically, this computation happens entirely on the client. The server never sees the query input.&lt;/p&gt;

&lt;h3 id=&#34;12-3-filter-distribution-2&#34;&gt;12.3 Filter Distribution&lt;/h3&gt;

&lt;p&gt;Servers generate and publish their filters periodically, hourly or daily depending on churn rate. A filter for a server with 1 million blobs requires approximately 1.1 MB, small enough for clients to download and cache.&lt;/p&gt;

&lt;p&gt;The filter might be distributed via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP endpoint on the Blossom server (&lt;code&gt;GET /filter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Nostr event published by the server&amp;#39;s identity&lt;/li&gt;
&lt;li&gt;Out-of-band distribution (IPFS, BitTorrent, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clients download filters for their configured servers, then perform local lookups when deciding whether to upload. If the filter indicates a blob might exist (accounting for false positives), the client can either skip uploading or perform a HEAD request to confirm.&lt;/p&gt;

&lt;h3 id=&#34;12-4-limitations-2&#34;&gt;12.4 Limitations&lt;/h3&gt;

&lt;p&gt;Binary fuse filters are immutable once constructed. They cannot be updated incrementally-adding a new element requires rebuilding the entire filter. This is acceptable for periodic batch updates but prevents real-time synchronization.&lt;/p&gt;

&lt;p&gt;False positives mean clients occasionally skip uploads for blobs the server lacks. The subsequent fetch will fail, exposing the false positive; the client can then upload. With a 1% false positive rate, this occurs rarely and has minimal impact.&lt;/p&gt;

&lt;p&gt;The filter reveals the total number of blobs the server stores (derivable from filter size). It doesn&amp;#39;t reveal which specific blobs or any information about their contents.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;13-garbage-collection-2&#34;&gt;13. Garbage Collection&lt;/h2&gt;

&lt;h3 id=&#34;13-1-the-accumulation-problem-2&#34;&gt;13.1 The Accumulation Problem&lt;/h3&gt;

&lt;p&gt;Content-addressed immutable storage naturally accumulates data. Updating a file creates new blobs; the old blobs persist. The directory structure uses copy-on-write semantics, so modifying a deeply nested file creates new blobs for every ancestor directory up to the root. Without cleanup, storage consumption grows monotonically even if the logical dataset size remains constant.&lt;/p&gt;

&lt;p&gt;This design places garbage collection responsibility entirely with the client. The system does not automatically delete anything. Users must explicitly choose to delete obsolete data, accepting the tradeoff between storage costs and history preservation.&lt;/p&gt;

&lt;h3 id=&#34;13-2-reference-tracking-2&#34;&gt;13.2 Reference Tracking&lt;/h3&gt;

&lt;p&gt;The client maintains knowledge of which blobs are reachable from each commit. A blob is garbage if it&amp;#39;s unreachable from any commit the user wishes to preserve.&lt;/p&gt;

&lt;p&gt;Computing reachability requires traversing the Merkle DAG from each preserved commit&amp;#39;s root. For a given set of root hashes, reachable blobs are:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;reachable = {}
for root in preserved_roots:
    traverse(root, reachable)

def traverse(hash, reachable):
    if hash in reachable:
        return
    reachable.add(hash)
    blob = fetch_and_decrypt(hash)
    for child_hash in extract_references(blob):
        traverse(child_hash, reachable)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Blobs not in the reachable set are candidates for deletion.&lt;/p&gt;

&lt;h3 id=&#34;13-3-deletion-strategies-2&#34;&gt;13.3 Deletion Strategies&lt;/h3&gt;

&lt;p&gt;Several strategies for garbage collection exist, offering different tradeoffs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep everything&lt;/strong&gt;: Never delete blobs. Storage grows unboundedly, but complete history is preserved. Suitable for archival use cases where history has intrinsic value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep recent history&lt;/strong&gt;: Preserve the last N commits or commits from the last M days. Delete blobs unreachable from this window. Balances storage cost against useful history depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep only current&lt;/strong&gt;: Preserve only the chain head. Delete all blobs unreachable from the current state. Minimizes storage but loses all history. Recovery options are limited if the current state is corrupted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicit snapshots&lt;/strong&gt;: Mark specific commits as preserved (e.g., monthly snapshots, pre-migration backups). Delete blobs unreachable from any preserved commit.&lt;/p&gt;

&lt;h3 id=&#34;13-4-deletion-process-2&#34;&gt;13.4 Deletion Process&lt;/h3&gt;

&lt;p&gt;To delete garbage blobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compute the set of blob hashes to delete&lt;/li&gt;
&lt;li&gt;For each hash and each server storing a share of that blob:

&lt;ul&gt;
&lt;li&gt;Generate a deletion authorization event&lt;/li&gt;
&lt;li&gt;Send DELETE request with authorization&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Update the garbage list in the next commit to reflect completed deletions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The commit&amp;#39;s &lt;code&gt;garbage&lt;/code&gt; field serves as an announcement of intent. It signals to future clients examining history that these blobs were deliberately deleted and should not be considered missing or corrupted.&lt;/p&gt;

&lt;p&gt;Deletion authorization uses the same Nostr event mechanism as uploads:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;#34;kind&amp;#34;: 24242,
  &amp;#34;tags&amp;#34;: [
    [&amp;#34;t&amp;#34;, &amp;#34;delete&amp;#34;],
    [&amp;#34;x&amp;#34;, &amp;#34;&amp;lt;sha256 of blob to delete&amp;gt;&amp;#34;],
    [&amp;#34;expiration&amp;#34;, &amp;#34;1701910800&amp;#34;]
  ],
  &amp;#34;content&amp;#34;: &amp;#34;Garbage collection&amp;#34;,
  &amp;#34;sig&amp;#34;: &amp;#34;&amp;lt;signature&amp;gt;&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;13-5-metadata-event-garbage-collection-2&#34;&gt;13.5 Metadata Event Garbage Collection&lt;/h3&gt;

&lt;p&gt;The hash chain of commit events also accumulates over time. Old commit events may be pruned from relays to reduce storage, but this requires care.&lt;/p&gt;

&lt;p&gt;Safe deletion criteria for commit events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The commit&amp;#39;s blobs have been garbage collected (no point keeping metadata for deleted data)&lt;/li&gt;
&lt;li&gt;The commit is not the chain head or a preserved snapshot&lt;/li&gt;
&lt;li&gt;Sufficient time has passed that no client might be traversing through it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, commit events are small (kilobytes) and relay storage is cheap. Most users can retain their complete commit history indefinitely. Users with extremely long histories or storage-constrained relays can prune old commits, accepting that history before the pruning point becomes inaccessible.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;14-lifecycle-summary-2&#34;&gt;14. Lifecycle Summary&lt;/h2&gt;

&lt;h3 id=&#34;14-1-initial-setup-2&#34;&gt;14.1 Initial Setup&lt;/h3&gt;

&lt;p&gt;A new user performs one-time setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate or import a Nostr keypair (nsec/npub)&lt;/li&gt;
&lt;li&gt;Derive the master storage key from nsec&lt;/li&gt;
&lt;li&gt;Configure preferred Blossom servers&lt;/li&gt;
&lt;li&gt;Configure preferred Nostr relays&lt;/li&gt;
&lt;li&gt;Create an empty root directory&lt;/li&gt;
&lt;li&gt;Publish the genesis commit event&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;14-2-adding-files-2&#34;&gt;14.2 Adding Files&lt;/h3&gt;

&lt;p&gt;To add a file to the storage system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the file content&lt;/li&gt;
&lt;li&gt;Divide into fixed-size blocks with padding&lt;/li&gt;
&lt;li&gt;Generate a random per-file encryption key&lt;/li&gt;
&lt;li&gt;For each block:

&lt;ul&gt;
&lt;li&gt;Derive the block encryption key&lt;/li&gt;
&lt;li&gt;Encrypt with XChaCha20-Poly1305&lt;/li&gt;
&lt;li&gt;Erasure-code into n shares&lt;/li&gt;
&lt;li&gt;Upload shares to n servers&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Construct the inode with block metadata&lt;/li&gt;
&lt;li&gt;Encrypt and upload the inode blob&lt;/li&gt;
&lt;li&gt;Update the parent directory to include the new entry&lt;/li&gt;
&lt;li&gt;Recursively update ancestors to the root&lt;/li&gt;
&lt;li&gt;Stage changes for the next commit&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;14-3-committing-changes-2&#34;&gt;14.3 Committing Changes&lt;/h3&gt;

&lt;p&gt;When the user saves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch current chain head from relays&lt;/li&gt;
&lt;li&gt;Verify local changes are based on this head&lt;/li&gt;
&lt;li&gt;Upload all staged blobs (files, inodes, directories)&lt;/li&gt;
&lt;li&gt;Construct commit event with new root and prev reference&lt;/li&gt;
&lt;li&gt;Sign and publish commit to relays&lt;/li&gt;
&lt;li&gt;Clear local staged changes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;14-4-reading-files-2&#34;&gt;14.4 Reading Files&lt;/h3&gt;

&lt;p&gt;To read a file by path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch current chain head&lt;/li&gt;
&lt;li&gt;Decrypt commit to obtain root blob location&lt;/li&gt;
&lt;li&gt;Traverse directory structure to target inode&lt;/li&gt;
&lt;li&gt;For each block in the inode:

&lt;ul&gt;
&lt;li&gt;Attempt to fetch k shares from listed servers&lt;/li&gt;
&lt;li&gt;Erasure-decode to recover encrypted block&lt;/li&gt;
&lt;li&gt;Decrypt with derived block key&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Concatenate blocks and remove padding&lt;/li&gt;
&lt;li&gt;Return file contents&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;14-5-verification-and-repair-2&#34;&gt;14.5 Verification and Repair&lt;/h3&gt;

&lt;p&gt;Periodically, the client should verify data availability:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For each blob referenced by the current state:

&lt;ul&gt;
&lt;li&gt;For each share of that blob:

&lt;ul&gt;
&lt;li&gt;Send HEAD request to check existence&lt;/li&gt;
&lt;li&gt;Optionally, GET and verify hash matches&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;If any blob has fewer than k available shares:

&lt;ul&gt;
&lt;li&gt;Fetch k surviving shares&lt;/li&gt;
&lt;li&gt;Erasure-decode to recover the block&lt;/li&gt;
&lt;li&gt;Re-encode to generate missing shares&lt;/li&gt;
&lt;li&gt;Upload replacement shares to new servers&lt;/li&gt;
&lt;li&gt;Update inode with new share locations&lt;/li&gt;
&lt;li&gt;Commit the updated inodes&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;14-6-garbage-collection-2&#34;&gt;14.6 Garbage Collection&lt;/h3&gt;

&lt;p&gt;When storage costs warrant cleanup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decide which commits to preserve&lt;/li&gt;
&lt;li&gt;Compute reachable blob set from preserved commits&lt;/li&gt;
&lt;li&gt;Identify unreachable blobs&lt;/li&gt;
&lt;li&gt;Delete unreachable blobs from servers&lt;/li&gt;
&lt;li&gt;Optionally delete obsolete commit events from relays&lt;/li&gt;
&lt;li&gt;Record garbage collection in next commit&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h2 id=&#34;15-security-analysis-2&#34;&gt;15. Security Analysis&lt;/h2&gt;

&lt;h3 id=&#34;15-1-confidentiality-2&#34;&gt;15.1 Confidentiality&lt;/h3&gt;

&lt;p&gt;Storage servers observe only uniformly-sized encrypted blobs. They cannot determine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File contents (encrypted with XChaCha20-Poly1305)&lt;/li&gt;
&lt;li&gt;File sizes (obscured by fixed block padding)&lt;/li&gt;
&lt;li&gt;File types (all blocks are indistinguishable)&lt;/li&gt;
&lt;li&gt;Filenames (stored in encrypted directory blobs)&lt;/li&gt;
&lt;li&gt;Directory structure (directories are encrypted like files)&lt;/li&gt;
&lt;li&gt;Relationships between blobs (no plaintext linking)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The encryption is semantic-identical plaintexts produce different ciphertexts due to random per-file keys. Servers cannot detect when users store the same content.&lt;/p&gt;

&lt;h3 id=&#34;15-2-integrity-2&#34;&gt;15.2 Integrity&lt;/h3&gt;

&lt;p&gt;Content addressing provides integrity at multiple levels. Share hashes verify individual share integrity. Block hashes (stored in inodes) verify decrypted block integrity. The Merkle DAG structure verifies structural integrity-any modification to any blob changes the root hash.&lt;/p&gt;

&lt;p&gt;Poly1305 authentication tags detect ciphertext tampering. Even if an attacker modifies stored ciphertext in a way that produces a valid hash, decryption will fail authentication.&lt;/p&gt;

&lt;h3 id=&#34;15-3-availability-2&#34;&gt;15.3 Availability&lt;/h3&gt;

&lt;p&gt;Erasure coding ensures availability despite server failures. With (k, n) parameters, data survives the loss of any n - k servers. The hash chain ensures commit history survives relay churn as long as at least one relay retains the events.&lt;/p&gt;

&lt;p&gt;The system does not provide availability against censorship or targeted attacks where adversaries deliberately destroy more than n - k shares simultaneously.&lt;/p&gt;

&lt;h3 id=&#34;15-4-authentication-2&#34;&gt;15.4 Authentication&lt;/h3&gt;

&lt;p&gt;Nostr signatures authenticate all state changes. Only the holder of the nsec can publish valid commit events. Blossom authorization events prevent unauthorized uploads or deletions.&lt;/p&gt;

&lt;p&gt;Relays and servers can verify signature validity but cannot forge signatures. A compromised relay could refuse to serve events (availability attack) but cannot produce fake commits (integrity preserved).&lt;/p&gt;

&lt;h3 id=&#34;15-5-key-compromise-2&#34;&gt;15.5 Key Compromise&lt;/h3&gt;

&lt;p&gt;If the nsec is compromised, all security properties fail. The attacker can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decrypt all current and historical data&lt;/li&gt;
&lt;li&gt;Publish malicious commits&lt;/li&gt;
&lt;li&gt;Delete data from servers&lt;/li&gt;
&lt;li&gt;Irrevocably destroy the dataset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key management is outside this system&amp;#39;s scope. Users should employ standard practices: hardware security modules, secure backup procedures, passphrase protection.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;16-future-considerations-2&#34;&gt;16. Future Considerations&lt;/h2&gt;

&lt;h3 id=&#34;16-1-payment-integration-2&#34;&gt;16.1 Payment Integration&lt;/h3&gt;

&lt;p&gt;Storage servers require compensation for resources consumed. Integration with payment systems would enable sustainable server operation.&lt;/p&gt;

&lt;p&gt;Possibilities include per-byte pricing with Lightning Network micropayments, subscription models with ecash or traditional payment, and storage markets where servers compete on price and reliability. Payment integration should not compromise privacy-payments should not link to specific blobs or reveal access patterns.&lt;/p&gt;

&lt;h3 id=&#34;16-2-steward-services-2&#34;&gt;16.2 Steward Services&lt;/h3&gt;

&lt;p&gt;A steward service could handle verification and repair automatically, running continuously without user intervention. This requires delegating sufficient authority to perform repairs without granting full account access.&lt;/p&gt;

&lt;p&gt;Potential approaches include threshold signatures where the steward holds one share of a multisig, capability tokens authorizing specific repair actions, and read-only access combined with user approval for repairs. Steward design involves complex trust tradeoffs and is deferred to future work.&lt;/p&gt;

&lt;h3 id=&#34;16-3-multi-device-synchronization-2&#34;&gt;16.3 Multi-Device Synchronization&lt;/h3&gt;

&lt;p&gt;The current design supports multiple devices through the commit chain, but conflict resolution is minimal. Enhanced multi-device support might include automatic merging for non-conflicting changes, three-way merge for file-level conflicts, operational transformation for collaborative editing, and CRDT-based structures for specific data types.&lt;/p&gt;

&lt;h3 id=&#34;16-4-deduplication-2&#34;&gt;16.4 Deduplication&lt;/h3&gt;

&lt;p&gt;Content addressing naturally deduplicates identical files-they hash to the same blob. Block-level deduplication across files is more complex. Content-defined chunking using rolling hashes (Rabin fingerprinting) could identify common blocks across similar files, reducing storage for versioned documents or near-duplicates.&lt;/p&gt;

&lt;h3 id=&#34;16-5-proof-of-retrievability-2&#34;&gt;16.5 Proof of Retrievability&lt;/h3&gt;

&lt;p&gt;More sophisticated cryptographic proofs could enable efficient verification without downloading data. Proof of Retrievability (PoR) schemes allow servers to prove they hold data by responding to challenges. This could reduce verification bandwidth from O(data size) to O(security parameter).&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;17-conclusion-2&#34;&gt;17. Conclusion&lt;/h2&gt;

&lt;p&gt;This design provides a practical architecture for durable, private, personal storage built on existing Nostr and Blossom infrastructure. A layered architecture separates concerns: fixed-size blocks provide privacy through uniformity, erasure coding provides durability through redundancy, authenticated encryption provides confidentiality and integrity. Efficient updates come from the Merkle DAG, with auditable history and conflict detection from the hash chain.&lt;/p&gt;

&lt;p&gt;The system achieves its core requirements. Durability is provided through erasure coding-data survives arbitrary server failures up to the configured threshold. Storage providers learn nothing about content, sizes, structure, or access patterns beyond gross storage volume. Sovereignty is preserved-users control when changes commit and when old data is deleted. Recoverability is complete-the entire dataset and its history can be reconstructed from a single secret key.&lt;/p&gt;

&lt;p&gt;Immutable, content-addressed blobs simplify consistency and enable deterministic caching. An explicit save model gives users clear checkpoints, avoiding the complexity of real-time synchronization. History and conflict detection come from the hash chain, with no trusted timestamps or consensus required.&lt;/p&gt;

&lt;p&gt;Significant work remains for production deployment. Payment integration and automated maintenance are areas for future development. But the core architecture presented here provides a solid foundation for personal data storage that respects user sovereignty while leveraging decentralized infrastructure.&lt;/p&gt;

&lt;hr&gt;

&lt;h2 id=&#34;references-6&#34;&gt;References&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Nostr Protocol. NIP-01: Basic Protocol Flow Description. &lt;a href=&#34;https://github.com/nostr-protocol/nips/blob/master/01.md&#34;&gt;https://github.com/nostr-protocol/nips/blob/master/01.md&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Blossom Protocol. BUD-01: Server Specification. &lt;a href=&#34;https://github.com/hzrd149/blossom&#34;&gt;https://github.com/hzrd149/blossom&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;IETF RFC 8439. ChaCha20 and Poly1305 for IETF Protocols. &lt;a href=&#34;https://tools.ietf.org/html/rfc8439&#34;&gt;https://tools.ietf.org/html/rfc8439&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;IETF RFC 5869. HMAC-based Extract-and-Expand Key Derivation Function (HKDF). &lt;a href=&#34;https://tools.ietf.org/html/rfc5869&#34;&gt;https://tools.ietf.org/html/rfc5869&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;IETF RFC 5510. Reed-Solomon Forward Error Correction (FEC) Schemes. &lt;a href=&#34;https://tools.ietf.org/html/rfc5510&#34;&gt;https://tools.ietf.org/html/rfc5510&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Graf, T. M., &amp;amp; Lemire, D. (2022). Binary Fuse Filters: Fast and Smaller Than Xor Filters. ACM Journal of Experimental Algorithmics.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;BIP-340. Schnorr Signatures for secp256k1. &lt;a href=&#34;https://bips.dev/340/&#34;&gt;https://bips.dev/340/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Nostr Protocol. NIP-44: Encrypted Payloads (Versioned). &lt;a href=&#34;https://github.com/nostr-protocol/nips/blob/master/44.md&#34;&gt;https://github.com/nostr-protocol/nips/blob/master/44.md&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;h2 id=&#34;appendix-a-notation-reference-2&#34;&gt;Appendix A: notation reference&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Block size in bytes (typically 262,144)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;k&lt;/td&gt;
&lt;td&gt;Erasure coding: minimum shares for reconstruction&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Erasure coding: total shares per block&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;nsec&lt;/td&gt;
&lt;td&gt;Nostr secret key (32 bytes)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;npub&lt;/td&gt;
&lt;td&gt;Nostr public key (32-byte x-coordinate)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;GF(2^8)&lt;/td&gt;
&lt;td&gt;Galois Field with 256 elements&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;H(x)&lt;/td&gt;
&lt;td&gt;SHA-256 hash function&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;HKDF&lt;/td&gt;
&lt;td&gt;HMAC-based Key Derivation Function&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;XChaCha20&lt;/td&gt;
&lt;td&gt;Extended-nonce ChaCha20 stream cipher&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;Poly1305&lt;/td&gt;
&lt;td&gt;One-time authenticator MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;appendix-b-recommended-parameters-2&#34;&gt;Appendix B: recommended parameters&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Block size&lt;/strong&gt;: 256 KiB (262,144 bytes)&lt;br&gt;
Provides good balance between padding overhead and chunking granularity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erasure coding&lt;/strong&gt;: (k=3, n=5)&lt;br&gt;
Tolerates 2 server failures with 67% storage overhead. Requires 5 independent servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encryption&lt;/strong&gt;: XChaCha20-Poly1305&lt;br&gt;
192-bit nonces enable safe random generation. Software performance excellent without hardware acceleration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key derivation&lt;/strong&gt;: HKDF-SHA256&lt;br&gt;
Standard, well-analyzed, widely implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit distribution&lt;/strong&gt;: 5&#43; Nostr relays&lt;br&gt;
Ensures commit retrievability despite relay failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification interval&lt;/strong&gt;: Weekly&lt;br&gt;
Balance between catching failures early and minimizing bandwidth.&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2025-12-10T06:28:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf6mhd9g498gv37ruphhfrm7f9r4v492l6hyjrza05zp37j4zrnwgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuuk46sj</id>
    
      <title type="html">what the heck? even AIs sometimes do what they want when they ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf6mhd9g498gv37ruphhfrm7f9r4v492l6hyjrza05zp37j4zrnwgzypphhrd7dyt3wn9cgk7k0vsqfsx8xnymnusqs06gntjtmkakytufuuk46sj" />
    <content type="html">
      what the heck? even AIs sometimes do what they want when they can&amp;#39;t resolve something! i want to create a desktop GUI app, but they want to build a CLI? 😂&lt;br/&gt;  &lt;img src=&#34;https://blossom.primal.net/77adf15de0c9d6898121a3f8dbeec4dfb7cb265f11af289473b4355108056491.png&#34;&gt;  
    </content>
    <updated>2025-12-08T03:46:35Z</updated>
  </entry>

</feed>