<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-07-26T14:40:42Z</updated>
  <generator>https://njump.cloud.vinney.xyz</generator>

  <title>Nostr notes by </title>
  <author>
    <name></name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://njump.cloud.vinney.xyz/npub1eq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqg4er58.rss" />
  <link href="https://njump.cloud.vinney.xyz/npub1eq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqg4er58" />
  <id>https://njump.cloud.vinney.xyz/npub1eq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqg4er58</id>
  <icon>https://buzz.cashu.space/media/ec528bf9fb73f71ddfbc260953330fa1038c6a5709f474296982280e3d34df76.png</icon>
  <logo>https://buzz.cashu.space/media/ec528bf9fb73f71ddfbc260953330fa1038c6a5709f474296982280e3d34df76.png</logo>




  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsr6fd8n8rqjdhhs6znrzaxf9kvamj690nn8k9zctvh53w3p7pvlyqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq26ay8q</id>
    
      <title type="html">Not the best picture, but the pork green chile tonight did no ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsr6fd8n8rqjdhhs6znrzaxf9kvamj690nn8k9zctvh53w3p7pvlyqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq26ay8q" />
    <content type="html">
      Not the best picture, but the pork green chile tonight did no disappoint. Local pork, peppers, and tomatillos. Can’t believe I haven’t made this before. &lt;br/&gt;&lt;br/&gt;#foodstr&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/0c0c08c81c822d28814729be96b83d4abde898191fcd56cca69ebb1fb78e6100.jpg&#34;&gt; 
    </content>
    <updated>2026-10-12T02:10:15Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsp5uwrnd653uj30vntlmxwzgu96auwts9jjv55v4fs6k3qdyerhgczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqeulkqz</id>
    
      <title type="html">I’ve been sleeping on jj (jujitsu) for too long. Today I asked ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsp5uwrnd653uj30vntlmxwzgu96auwts9jjv55v4fs6k3qdyerhgczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqeulkqz" />
    <content type="html">
      I’ve been sleeping on jj (jujitsu) for too long. Today I asked my agents which they would prefer to use if working alone and all of them said jj but making sure it stayed git compatible. &lt;br/&gt;&lt;br/&gt;I’m going to ask them to start working this way so I can learn. Excited to see if they are more efficient with my PRs
    </content>
    <updated>2026-09-27T16:49:41Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsfk3yx7ylszsq6qn2j66ww8deavt6fmgjpgv4mqrqwevsxmnkg4cqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6km4ep</id>
    
      <title type="html">I try not to post links to X but some of the items in this list ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsfk3yx7ylszsq6qn2j66ww8deavt6fmgjpgv4mqrqwevsxmnkg4cqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6km4ep" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszqw42e5nshnm9htp6349ry0k0nwsq4nh6weqz4ctrr6u2sw2em7cpp4mhxue69uhkummn9ekx7mq4dcnyj&#39;&gt;nevent1q…cnyj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I try not to post links to X but some of the items in this list show you how powerful it could be. I also tested it briefly for flexible incoming structured data validation and it worked well. Long story short, anywhere you might consider a customer trained classifier to avoid an LLM call is a use-case for Jev. &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://x.com/layton_gott/status/2101450120466174351?s=46&#34;&gt;https://x.com/layton_gott/status/2101450120466174351?s=46&lt;/a&gt;
    </content>
    <updated>2026-09-20T13:23:59Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsd0w9xgqy2m2usjajj8jclwhypcwtnkg43lyynyhvjwltmk4jeyegzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzlx9tq</id>
    
      <title type="html">I submitted for the waitlist and was surprised I got an invite ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsd0w9xgqy2m2usjajj8jclwhypcwtnkg43lyynyhvjwltmk4jeyegzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzlx9tq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2g4fvsr70fu2e6uq5t8mrz2wjn22f55u4wpjudrwqa2rxr0ywajqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdualnhhx&#39;&gt;nevent1q…nhhx&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I submitted for the waitlist and was surprised I got an invite pretty quick. Ran a few tests this morning and it seems like there are going to be a ton of ways to use it. Amazing how cheap it is and the agent was able to wire up quick tests on its own
    </content>
    <updated>2026-09-19T23:52:15Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrq57j7psrmz4t7qfhxv8j4w937k2f5sframl2mud4uvy8e4wqnxqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6h8q7h</id>
    
      <title type="html">Have you played with Jev yet at all?</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrq57j7psrmz4t7qfhxv8j4w937k2f5sframl2mud4uvy8e4wqnxqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6h8q7h" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrc82jed08ws9vwz50apv9vqru8845x3taalnftlsyqe6f3fdfg4gpp4mhxue69uhkummn9ekx7mqjwh0lv&#39;&gt;nevent1q…h0lv&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Have you played with Jev yet at all?
    </content>
    <updated>2026-09-19T23:11:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsyfnz476vhvfnz0gl4fc3lrx4qej35wf2nl0pc7axmwnec7u528dczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjquwv57w</id>
    
      <title type="html">Despite all the hype this has been getting on X, I actually think ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsyfnz476vhvfnz0gl4fc3lrx4qej35wf2nl0pc7axmwnec7u528dczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjquwv57w" />
    <content type="html">
      Despite all the hype this has been getting on X, I actually think people might not understand how big of a deal it is. They refer to it as a system one model, but I think a better name is a general classifier.&lt;br/&gt;&lt;br/&gt;Jev replace specialized machine learning models out of the box in many ways. May of the inefficiencies in current agent workflows like model selection or memory management can be improved. This is going to supercharge the speed and efficiency of agentic workflows and completely shift how AI and data analytics interact. &lt;br/&gt;&lt;br/&gt;I pulled it into my agent this morning and had an improved proof of concept data validation workflow for a project I had been working on for years within 10 minutes. All the testing I did this morning over the course of a few hours cost me &amp;lt; 3 cents. Checking a 22k record database for errors (without needing to explicitly define failure criteria) might cost $1.50.&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;/nevent1qqsq9rllrtem6gwtys66ekxjjp377qmtwf762wj0jfunvu57km2wd7gpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqz9rhwden5te0wfjkccte9ejxzmt4wvhxjmcpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgq3qeq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqxpqqqqqqzusl4pm&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…l4pm&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Jev is nuts….. wish I understood more about how it works, but the opportunities this type of model opens up are incredible. &lt;br/&gt;&lt;br/&gt;Now, we wait to see how fast someone can reproduce with open-source weights for local use. &lt;/blockquote&gt;
    </content>
    <updated>2026-09-19T20:41:20Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs2vhwrvlzgewjrr6wernjvpaeldwu5lqh8ed0kfgdz7pyes0c8efczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqeztff2</id>
    
      <title type="html">Already stuff like this popping up… will test soon if I can. ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs2vhwrvlzgewjrr6wernjvpaeldwu5lqh8ed0kfgdz7pyes0c8efczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqeztff2" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsq9rllrtem6gwtys66ekxjjp377qmtwf762wj0jfunvu57km2wd7gpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgfh3ze2&#39;&gt;nevent1q…3ze2&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Already stuff like this popping up… will test soon if I can. github.com/trycua/cua
    </content>
    <updated>2026-09-19T15:50:41Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9ppelj00f4l50e0kmcptl3pklhlgcn92a7j0yywf8xw0pqyc84yqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq8549cl</id>
    
      <title type="html">It’s gotta be something that could run locally right? The cost ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9ppelj00f4l50e0kmcptl3pklhlgcn92a7j0yywf8xw0pqyc84yqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq8549cl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxyf4fgppm6yka7sn9w7jy09lpr7zfk4r6cwlxhqlj9wf57y7ajaspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgnv2300&#39;&gt;nevent1q…2300&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It’s gotta be something that could run locally right? The cost is so low. Or is it still a big model just with sparse cheap throughput? This is where I don’t know enough yet…
    </content>
    <updated>2026-09-19T15:45:02Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsq9rllrtem6gwtys66ekxjjp377qmtwf762wj0jfunvu57km2wd7gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqss9kw3</id>
    
      <title type="html">Jev is nuts….. wish I understood more about how it works, but ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsq9rllrtem6gwtys66ekxjjp377qmtwf762wj0jfunvu57km2wd7gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqss9kw3" />
    <content type="html">
      Jev is nuts….. wish I understood more about how it works, but the opportunities this type of model opens up are incredible. &lt;br/&gt;&lt;br/&gt;Now, we wait to see how fast someone can reproduce with open-source weights for local use.
    </content>
    <updated>2026-09-19T15:39:46Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswzuv9t6dvk63ys7xpnluhwu5wu8d5me5uf3lt2k5ecrs07hk8c6qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezavfd</id>
    
      <title type="html">Keeping it healthier tonight… Salmon burger with lemon dill ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswzuv9t6dvk63ys7xpnluhwu5wu8d5me5uf3lt2k5ecrs07hk8c6qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezavfd" />
    <content type="html">
      Keeping it healthier tonight… Salmon burger with lemon dill Greek yogurt sauce with chard and cucumbers. Served with squash and green beans. &lt;br/&gt;&lt;br/&gt;Can’t compare to a beef burger, but hit the spot and solid macros.&lt;br/&gt;&lt;br/&gt;#foodstr&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/4a9d79cd4c65beadd523738d5112461053f5c9351a9e00c2bbd5dd833bb28407.jpg&#34;&gt; &lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/973480a07a630b6a848549ac4d737ac9aff7a90c6d9ffa3e4e2f8ee5c898d26a.jpg&#34;&gt; 
    </content>
    <updated>2026-09-13T02:47:23Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0gxjwgecawuspgycp7szwhdn68va7gr4lvxedvm5063e8ykeezgqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpmt0j4</id>
    
      <title type="html">I would argue it’s always safer. A passphrase is either short ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0gxjwgecawuspgycp7szwhdn68va7gr4lvxedvm5063e8ykeezgqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpmt0j4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxpy4a8ttuvtelkrzujg4vspmpswuj6fju5qkuayujuw73jtdgqxcpz3mhxue69uhhyetvv9ujuerpd46hxtnfdu7nqylp&#39;&gt;nevent1q…qylp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I would argue it’s always safer. A passphrase is either short enough to remember and likely easy to brute force OR long and secure and your single point of failure to lose your funds when you can’t reproduce it. Or your trust a password manager, which is maybe okay as long as you have a back up plan for that too.
    </content>
    <updated>2026-09-04T05:00:47Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsqllhtfux04j9u3u5mwed7qe0m2p7ayszu6fwqecrcwlnjpd85xwqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3w5hyx</id>
    
      <title type="html">You should talk to Keith from seed signer about entropy. He has ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsqllhtfux04j9u3u5mwed7qe0m2p7ayszu6fwqecrcwlnjpd85xwqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3w5hyx" />
    <content type="html">
      You should talk to Keith from seed signer about entropy. He has been putting in the work including showing why dice rolls aren’t that “risky”&lt;br/&gt;&lt;br/&gt;I’m unconvinced anyone should ever use a passphrase - should never be compared to multisig.&lt;br/&gt;&lt;br/&gt;The single sig focused hardware marketing budgets will always try to convince you otherwise. I have no regrets in trusting level headed research from open source and DIY devs over corporate marketing.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://fountain.fm/episode/RZ5nt9RBqnyOL13HAZip&#34;&gt;https://fountain.fm/episode/RZ5nt9RBqnyOL13HAZip&lt;/a&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;/nevent1qvzqqqpxqupzpwrxeemtukuzv62esqjgxg4cmaxrs9sgl7j6tdrufuaturv0wea9qqswwag86qtwgyrhq2pd7qwuhtsjpar6efd2xw3armywpamkg0u0yug789v0t&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…9v0t&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;  &lt;/blockquote&gt;
    </content>
    <updated>2026-09-04T03:30:12Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8gr7q9kjyg7gmzqfmg8l7x7wej4829hwzcrc2z79h24cfn4fdrkczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0jdl87</id>
    
      <title type="html">Yellow squash from the garden and jalenpeño cheddar brats from a ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8gr7q9kjyg7gmzqfmg8l7x7wej4829hwzcrc2z79h24cfn4fdrkczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0jdl87" />
    <content type="html">
      Yellow squash from the garden and jalenpeño cheddar brats from a local farm picked up at the farmers market. Brats were beer-braised (Mack and Jacks) with onions and topped with apple cider vinegar picked onions and brown mustard. Grilled to finish and served on a brioche bun… I should probably just never cook a brat again so I can stop while I’m ahead 🤤&lt;br/&gt;&lt;br/&gt;#foodstr&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/0f577c7eddc61607786bafb43416868a21b3a0d2af3bd21a06d70d9033b3b4f7.jpg&#34;&gt; 
    </content>
    <updated>2026-08-31T03:26:41Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsvkcw89q6k9ahqu68yap6wgfnkv9525m2hsjpuzz453d7ewangxuczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3w8ptg</id>
    
      <title type="html">Not a software dev but I have heard at least 1 engineer say this ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsvkcw89q6k9ahqu68yap6wgfnkv9525m2hsjpuzz453d7ewangxuczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3w8ptg" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9rmke590amxlcyktzadynlyw902wv9r36vhkwfccy7wzgw7fmpqspp4mhxue69uhkummn9ekx7mq2wxzxc&#39;&gt;nevent1q…xzxc&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Not a software dev but I have heard at least 1 engineer say this in conversation unprompted by Claude. I supposed it’s possible he started using it more after using Claude, but I doubt it. &lt;br/&gt;&lt;br/&gt;May be more common in some spaces (like enterprises) than others
    </content>
    <updated>2026-08-11T12:37:48Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0pz6m2e065zvgplurc7vmq887gdx6da8z30pmmumw769053h736qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq38whg6</id>
    
      <title type="html">Sunday salmon and steak! Steak was a touch overdone but still ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0pz6m2e065zvgplurc7vmq887gdx6da8z30pmmumw769053h736qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq38whg6" />
    <content type="html">
      Sunday salmon and steak! Steak was a touch overdone but still good. Smoked over cherry and finished in butter, garlic, and rosemary. Chard from the garden stir fried with ginger, garlic, soy sauce, rice wine vinegar, and sesame oil. Chard and summer squash were the first good batch of veggies from the garden! #foodstr&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/ac2c1f5547db140b769dac24b1c6553bd8ba25bcf4515c09e4f3269c2ec218e9.jpg&#34;&gt; &lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/7f9b3e277c15edce3f928a80664fc123410a15c6d6b9d242964aec1fd3cba6ca.jpg&#34;&gt; 
    </content>
    <updated>2026-08-10T01:37:41Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqszus0kntq5ds2pjt02556a0yw3xr6anjz4fzgr2n2g8vfqkdhqmcczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq8hv4uf</id>
    
      <title type="html">So it seems</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqszus0kntq5ds2pjt02556a0yw3xr6anjz4fzgr2n2g8vfqkdhqmcczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq8hv4uf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8a8rey6dra30zvnruhhjp52wps3ysl4sl4wcwjwffs68sn983dzqpz3mhxue69uhhyetvv9ujuerpd46hxtnfduje90a9&#39;&gt;nevent1q…90a9&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;So it seems
    </content>
    <updated>2026-08-08T21:46:19Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxyqzdm9uj3k5rr0dsvx9xcd6zvjlj2ux598t3mffm0ugq09kqr4czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqre9elm</id>
    
      <title type="html">Can someone ELI5 what happened here? Was this not set to happen ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxyqzdm9uj3k5rr0dsvx9xcd6zvjlj2ux598t3mffm0ugq09kqr4czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqre9elm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs93ydmkh0lwftzuswgujpx4ume84wvrpzjpnffrel8gphulzh93qspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgf9n0yn&#39;&gt;nevent1q…n0yn&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Can someone ELI5 what happened here? Was this not set to happen at a specific block height?
    </content>
    <updated>2026-08-08T21:38:14Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs29926swe54xhwteu4wu8cyr2nc0xch3mkq7uwg0gxkldcju2qr2qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqymlveq</id>
    
      <title type="html">Sure thing! It looked like most findings around implementation ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs29926swe54xhwteu4wu8cyr2nc0xch3mkq7uwg0gxkldcju2qr2qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqymlveq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg5h7yhcpgsjzk60v49vwwhreglqamns4fzufxg08n4k7cjtj08mgpz3mhxue69uhhyetvv9ujuerpd46hxtnfduet3qqf&#39;&gt;nevent1q…3qqf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Sure thing! It looked like most findings around implementation were already identified with know fixes as you mention. The things that are new are likely more supply chain improvement and repo hygiene related
    </content>
    <updated>2026-08-08T17:18:36Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsytazvz6vre3kerldcze75jsemf3kxsl6xr5jxc9u27d4ypyw045gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmjkaze</id>
    
      <title type="html">@npub1tv8…7wn2 I built a security audit skill for Claude a ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsytazvz6vre3kerldcze75jsemf3kxsl6xr5jxc9u27d4ypyw045gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmjkaze" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1tv8gmfhalwnxxquxjzeh6gtdsdz6vg7vx0s3rt7s7uuw6aujh32qn77wn2&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;KeithMukai&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1tv8…7wn2&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; I built a security audit skill for Claude a while back that tries to establish a strong security system for software based on the documented claims. I pointed it at seedsigner this morning to see what it would do. It’s relatively opinionated and there are pieces like a CI/CD check for audit on each release that might be overkill, BUT I think it flagged some interesting things. It also drafted a SECURITY.md. Posted it as a draft PR in my fork so I could share.&lt;br/&gt;&lt;br/&gt;Key suggestions:&lt;br/&gt;- one instance of a potential string injection&lt;br/&gt;- suggests to pin dependencies to hashes instead of versions to decrease supply chain risk&lt;br/&gt;- establishes a SECURITY.md with clear claims&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/armstrys/seedsigner/pull/1&#34;&gt;https://github.com/armstrys/seedsigner/pull/1&lt;/a&gt;
    </content>
    <updated>2026-08-08T16:44:49Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsx5n9fwr5hqlwp5wjsx2n4qcqm4m83z7ch78w876mdv6tn08hl2sczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6re9cv</id>
    
      <title>Nostr event nevent1qqsx5n9fwr5hqlwp5wjsx2n4qcqm4m83z7ch78w876mdv6tn08hl2sczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6re9cv</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsx5n9fwr5hqlwp5wjsx2n4qcqm4m83z7ch78w876mdv6tn08hl2sczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6re9cv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdr5gesx5ay9cwnxv7lj95ej7yffe6ra4x9g6quyu40ammal0gduqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhg2teerh&#39;&gt;nevent1q…eerh&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://image.nostr.build/7c22b239fadfc7cbb4412578342f476d4b51f3185ee853b191c0d2b792608e9d.jpg&#34;&gt; 
    </content>
    <updated>2026-08-07T22:16:42Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsdr5gesx5ay9cwnxv7lj95ej7yffe6ra4x9g6quyu40ammal0gduqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqf389ar</id>
    
      <title type="html">How ironic is it that ColdCard got bit by a general purpose ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsdr5gesx5ay9cwnxv7lj95ej7yffe6ra4x9g6quyu40ammal0gduqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqf389ar" />
    <content type="html">
      How ironic is it that ColdCard got bit by a general purpose function in their execution environment after endlessly complaining about the security of using general purpose hardware as a hardware wallet?&lt;br/&gt;&lt;br/&gt;Woops!
    </content>
    <updated>2026-08-07T22:16:24Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsvmppkegu5eq7uur5w0w2angpsypkj0fz5m6ec733fa372q4j889szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqkj9zzf</id>
    
      <title type="html">Also how are we turning a blind eye so fast on open sats… ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsvmppkegu5eq7uur5w0w2angpsypkj0fz5m6ec733fa372q4j889szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqkj9zzf" />
    <content type="html">
      Also how are we turning a blind eye so fast on open sats…  sometime you have to hold integrity over money.&lt;br/&gt;&lt;br/&gt;I hear rumors of big donations to catching up on the audit backlog - great… but there had better be a lot more resignations or governance changes in the next couple weeks before we accept open sats as a neutral actor. &lt;br/&gt;&lt;br/&gt;One spurt of money doesn’t fix a decade of biased decision making. &lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub12rv5lskctqxxs2c8rf2zlzc7xx3qpvzs3w4etgemauy9thegr43sf485vg&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;calle&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub12rv…85vg&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;
    </content>
    <updated>2026-08-07T04:44:33Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqstu366j0ytmvd4wysq3qtgj6ywvycyxzq36lu8ss640denz5unuxczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezu3l6</id>
    
      <title type="html">Have been pulled over to x during the coldcard situation. Feed ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqstu366j0ytmvd4wysq3qtgj6ywvycyxzq36lu8ss640denz5unuxczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezu3l6" />
    <content type="html">
      Have been pulled over to x during the coldcard situation. Feed become less useful and more random ass content over time. &lt;br/&gt;&lt;br/&gt;How do we convince the bitcoiners still using that shit platform to escape?
    </content>
    <updated>2026-08-07T04:26:23Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswzn2haw7wn938jncfegplqhkg8q0a85z3h40wcg7syvkjzz7692gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqhj072j</id>
    
      <title type="html">What’s your read on the current state for private repos? ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswzn2haw7wn938jncfegplqhkg8q0a85z3h40wcg7syvkjzz7692gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqhj072j" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0cyqshwk88ppymsdypjmdgxyvcxdvmsp8ge90wk6gta5n7ndxdwgpp4mhxue69uhkummn9ekx7mqwef78p&#39;&gt;nevent1q…f78p&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;What’s your read on the current state for private repos? Supposedly buzz is the best as a self-hosted community yeah? Is the other tooling mostly public repos only?
    </content>
    <updated>2026-08-06T02:39:23Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8jnpjtz2emxex53nvzhs269xc45fnp5zhkaj9pkj4j4mu2vzq6tqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0l47ae</id>
    
      <title type="html">Just finding out about loupe by spiral - man, the teams at block ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8jnpjtz2emxex53nvzhs269xc45fnp5zhkaj9pkj4j4mu2vzq6tqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0l47ae" />
    <content type="html">
      Just finding out about loupe by spiral - man, the teams at block really deliver. &lt;br/&gt;&lt;br/&gt;What timing given the current conversations around CoinKite
    </content>
    <updated>2026-08-05T00:30:19Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxznp795vqmka5h552n7vu0dj4v6t8ykj4xkysvcgkqrv483gug0szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5v76f6</id>
    
      <title type="html">💯</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxznp795vqmka5h552n7vu0dj4v6t8ykj4xkysvcgkqrv483gug0szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5v76f6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8y00t4gfru8anlrayk9dyqvtucjdjhcn6d6v3ku3v26g2xm0c34spzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgkqjefz&#39;&gt;nevent1q…jefz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;💯
    </content>
    <updated>2026-08-04T23:44:22Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxhuz8e5aqncszekthnexcv375zw9hy57qh604z5pwe4mfps7nsrszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezy7ld</id>
    
      <title type="html">No doubt in the link, but does it really mean anything? Both ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxhuz8e5aqncszekthnexcv375zw9hy57qh604z5pwe4mfps7nsrszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqezy7ld" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqpjxnencrsqp2c6hq75gh7gunh4prat0qcxsy3dfxyvlr4ut0cpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgvmdgr2&#39;&gt;nevent1q…dgr2&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;No doubt in the link, but does it really mean anything? Both doc-hex and switck were committing to libngu prior to adoption in coldcard. The nym use is weird, but doc-hex was already linked to the libngu library without the two profiles being the same person. There were also cases in the commit history with other coinkite devs using two user profiles scgbckbone (as avirgovi). There are also cases when doc-hex shows as the committer even when scgbackbone is the author.&lt;br/&gt;&lt;br/&gt;I think the nym is a red herring. The whole repo reeks of poor dev practices. No PRs in some cases and even when there were switck merging doc-hex meant there was no independent review. Bonkers.&lt;br/&gt;&lt;br/&gt;Peter did like 75% of the commits to coldcard. Pointing out that this all technically falls on him is no surprise. Claiming that it was malicious requires some additional evidence
    </content>
    <updated>2026-08-04T23:01:30Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9k8v7pflx9gzr6gugux546h8hw2yuyyy434zdaynuk9vw4yw2zcgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqc98x3r</id>
    
      <title type="html">I know some people don’t like the idea of assisted multisig but ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9k8v7pflx9gzr6gugux546h8hw2yuyyy434zdaynuk9vw4yw2zcgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqc98x3r" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0ejjpdjms89rm5n3jpxfv7z7jkaemhmqe7s86h7429ajzqhq3t7spp4mhxue69uhkummn9ekx7mqvtm8l9&#39;&gt;nevent1q…m8l9&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I know some people don’t like the idea of assisted multisig but this is exactly why I would push people in that direction first. Yes, it costs money, but think of it as training if you ever want to go full self-custody multisig. About the only real negative trade-off is privacy.&lt;br/&gt;&lt;br/&gt;Some folks may graduate to full multi-sig, but it definitely adds risk of messing something up with no one to bail you out.
    </content>
    <updated>2026-08-04T22:42:21Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxrqfyjdhg024uygcewgx5evqsehcs25au7axhfcnm6qjeva3gadqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq2h9j66</id>
    
      <title type="html">The more I look into this and uncover the git history of the repo ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxrqfyjdhg024uygcewgx5evqsehcs25au7axhfcnm6qjeva3gadqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq2h9j66" />
    <content type="html">
      The more I look into this and uncover the git history of the repo the more it looks like complete incompetence. The dual identity is the hardest to explain, but otherwise it looks like complete governance failure and poor programming.&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;/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3qamnwvaz7tmwdaehgu3wwa5kuegpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgq3qeq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqxpqqqqqqzz47yw4&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…7yw4&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also responsible for the code that added entropy on newer devices, but STILL fell below a reasonable threshold. This is super sketchy. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;—————-&lt;br/&gt;# Peter D. Gray and the Coldcard Entropy Incident&lt;br/&gt;&lt;br/&gt;## Executive summary&lt;br/&gt;&lt;br/&gt;Peter D. Gray, Coinkite engineer (GitHub: `doc-hex`, email: `peter@conalgo.com`), authored the commit that introduced the Coldcard entropy vulnerability and later authored the inadequate mitigation. On March 1, 2021, Gray pushed commit `b18723dd` directly to Coldcard&#39;s firmware master branch: a 120-file, 5,488-line change that replaced the hardware TRNG seed generation path with a call through the `libngu` library, which silently resolved to a non-cryptographic software PRNG called Yasmarang. The commit had no pull request, no code review, no CI pipeline, and no GPG signature despite Gray possessing a valid signing key. The same commit deleted the GPLv3 license and replaced it with MIT plus the Commons Clause.&lt;br/&gt;&lt;br/&gt;Gray was not a passive consumer of libngu. He was an active contributor with 19 commits to the library starting February 10, 2021, 19 days before the integration commit. The library&#39;s primary author, `switck`, had no independent GPG key and signed their own commits using Gray&#39;s GPG key (`A2DCD558C2BE5D7C`), verified by raw PGP signature packet inspection. The two were collaborators: Gray was pushing to switck&#39;s firmware fork by January 2021, and Coinkite maintained their own fork of switck&#39;s library.&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored PR #18 to libngu (March 11, 2022): a 32-bit reseed function that brought newer devices (Mk4, Q, Mk5) from ~40 bits of effective entropy to ~72 bits. The design target was 128 bits. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold.&lt;br/&gt;&lt;br/&gt;The bug survived five years until July 30, 2026, when an attacker drained approximately 1,367 BTC ($88.6 million) from 4,500&#43; addresses. The attacker never touched a single device.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Gray&#39;s relationship with libngu and switck&lt;br/&gt;&lt;br/&gt;### The GPG key&lt;br/&gt;&lt;br/&gt;Gray registered a GPG key on his GitHub account:&lt;br/&gt;&lt;br/&gt;| Property | Value | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Primary key ID | `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Subkey ID | `F0E6CC6AFC16CF7B` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Created | July 17, 2018 | GitHub API |&lt;br/&gt;| Expired | May 28, 2023 | GitHub API |&lt;br/&gt;&lt;br/&gt;switck has no GPG key registered on GitHub ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;)), no SSH keys ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;)), and uses only GitHub&#39;s noreply email. Location listed as &#34;Cyberspace.&#34;&lt;br/&gt;&lt;br/&gt;Despite switck having no registered key, switck&#39;s commits to libngu are GPG-signed. GitHub marks them `verified=False, reason=unknown_key` because the signing key is not registered to switck&#39;s account. Raw inspection of the PGP signature packets reveals the key ID:&lt;br/&gt;&lt;br/&gt;- switck commit `f7711c5522` (2024-03-30): raw PGP packet contains `A2DCD558C2BE5D7C`. This is Gray&#39;s primary key.&lt;br/&gt;- doc-hex commit `61ffc74af1` (2022-03-11): raw PGP packet contains `F0E6CC6AFC16CF7B`. This is Gray&#39;s subkey.&lt;br/&gt;&lt;br/&gt;Both key IDs belong to the same GPG key registered to doc-hex. switck does not have their own GPG key. switck is signing commits with Peter Gray&#39;s key.&lt;br/&gt;&lt;br/&gt;### The collaboration timeline&lt;br/&gt;&lt;br/&gt;| Date | Event | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2020-08-07 | switck creates GitHub account | [GitHub API: users/switck](&lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;) |&lt;br/&gt;| 2020-10-15 | switck creates libngu repo, forks Coldcard/firmware, forks micropython | [GitHub API: repos/switck/libngu](&lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork (release signing, bug fixes) | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) — commits by &#34;Peter D. Gray&#34; |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu same day. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;) (created 2021-02-10), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu (AES clone, env var tweaks, bip39 bugfix) | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;Gray had 19 total commits to libngu. He knew the library he was integrating.&lt;br/&gt;&lt;br/&gt;### The `peter-conalgo` identity&lt;br/&gt;&lt;br/&gt;The parent commit&#39;s `.gitmodules` referenced `github.com/peter-conalgo/trezor-crypto.git` as the `external/crypto` submodule. The GitHub account `peter-conalgo` was created April 22, 2021. The account name is &#34;peter,&#34; no other identity. Gray&#39;s email is `peter@conalgo.com`. The commit removed this submodule (Gray&#39;s personal trezor-crypto fork) and replaced it with switck&#39;s libngu.&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: users/peter-conalgo](&lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;), [parent commit .gitmodules](&lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The fateful commit: `b18723dd`&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/Coldcard/firmware`&lt;br/&gt;**SHA:** `b18723dd`&lt;br/&gt;**Author:** Peter D. Gray (`peter@conalgo.com`)&lt;br/&gt;**Date:** March 1, 2021, 14:03:03 UTC&lt;br/&gt;**Message:** &#34;First pass w/ libNgU&#34;&lt;br/&gt;**Parent:** `f456a88` (single parent: direct push, not a merge commit)&lt;br/&gt;**Files changed:** 120&lt;br/&gt;**Lines:** &#43;2,766 / -2,722&lt;br/&gt;**Pull request:** None&lt;br/&gt;**Code review:** None&lt;br/&gt;**CI:** None (no `.github` directory in repo)&lt;br/&gt;**GPG signature:** Unsigned, despite Gray having a valid key (created 2018, valid through May 2023)&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;), [GitHub commit page](&lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;), [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found)&lt;br/&gt;&lt;br/&gt;### What Gray changed&lt;br/&gt;&lt;br/&gt;| File | Change | Significance |&lt;br/&gt;|---|---|---|&lt;br/&gt;| `shared/random.py` | Changed `from ckcc import rng` to `import ngu`; set `bytes = ngu.random.bytes`. Comment still says &#34;crypto-quality rng.&#34; | Call path that resolved to Yasmarang instead of the hardware TRNG |&lt;br/&gt;| `shared/seed.py` | Changed `make_new_wallet()` from `rng_bytes(seed)` to `random.bytes(32)`. Changed `import tcc` to `import ngu` throughout. Changed `tcc.sha256(seed)` to `ngu.hash.sha256s(seed)`. | Seed generation function. Old path reached STM32 hardware TRNG. New path reached Yasmarang. |&lt;br/&gt;| `shared/drv_entro.py` | Changed `import stash, tcc, hmac, chains` to `import stash, ngu, chains` | BIP-85 entropy derivation path migrated |&lt;br/&gt;| `COPYING` | Deleted (674 lines, GPLv3) | Removed GPLv3 license |&lt;br/&gt;| `COPYING-CC` | Added (MIT &#43; Commons Clause) | Replaced GPLv3 with source-available license restricting commercial use |&lt;br/&gt;| `.gitmodules` | Removed `external/crypto` (`peter-conalgo/trezor-crypto`), removed `external/modcryptocurrency`, added `external/libngu` (`switck/libngu`) | Removed Gray&#39;s personal trezor-crypto fork, added switck&#39;s libngu |&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API file diffs from commit b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### The specific seed generation change&lt;br/&gt;&lt;br/&gt;Before (firmware v3.2.2):&lt;br/&gt;```python&lt;br/&gt;seed = bytearray(32)&lt;br/&gt;rng_bytes(seed)  # reaches ckcc.rng_bytes -&gt; STM32 hardware TRNG&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;After (commit b18723dd, shipped in v4.0.0):&lt;br/&gt;```python&lt;br/&gt;seed = random.bytes(32)  # reaches ngu.random.bytes -&gt; libngu -&gt; rng_get() -&gt; Yasmarang&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5&lt;br/&gt;&lt;br/&gt;### How the bug worked&lt;br/&gt;&lt;br/&gt;The bug required two pieces: a faulty preprocessor check in libngu (switck&#39;s code) and Gray&#39;s seed generation change that routed through it (Gray&#39;s code).&lt;br/&gt;&lt;br/&gt;**libngu&#39;s faulty check** (switck&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;br/&gt;#error &#34;get a HW TRNG plz&#34;&lt;br/&gt;#endif&lt;br/&gt;```&lt;br/&gt;`#ifndef` tests whether the macro exists, not whether it is enabled. Coldcard&#39;s board config defines `MICROPY_HW_ENABLE_RNG` as `0`. The macro exists. Its value is zero. The check passes. The build links Yasmarang.&lt;br/&gt;&lt;br/&gt;**Coldcard&#39;s board config** (Gray&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#define MICROPY_HW_ENABLE_RNG (0)&lt;br/&gt;```&lt;br/&gt;Coinkite disabled MicroPython&#39;s built-in RNG because they provide their own wrapper. But Gray&#39;s seed generation change called `ngu.random.bytes` instead of `ckcc.rng_bytes`, routing through the broken libngu path.&lt;br/&gt;&lt;br/&gt;Yasmarang was seeded from the MCU&#39;s 96-bit unique device identifier (factory metadata, not a secret), the SysTick counter (~80,000 possible values on Mk2/Mk3), and RTC registers (correlated timing values). None are cryptographic entropy sources. Collected once. Never reseeded.&lt;br/&gt;&lt;br/&gt;Effective entropy: ~40 bits on Mk2/Mk3 (design target: 128 bits). A 40-bit keyspace is searchable on commodity hardware.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), sections 1-4&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The reseed commit: PR #18&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored a mitigation.&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/switck/libngu`&lt;br/&gt;**PR:** #18&lt;br/&gt;**Title:** &#34;Add reseed function to ngu.random module&#34;&lt;br/&gt;**Author:** doc-hex (Peter D. Gray)&lt;br/&gt;**Submitted from:** `coinkite/libngu` fork&lt;br/&gt;**Opened:** March 11, 2022&lt;br/&gt;**Merged by:** switck on March 15, 2022&lt;br/&gt;&lt;br/&gt;Source: [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### What the reseed did&lt;br/&gt;&lt;br/&gt;```python&lt;br/&gt;a = callgate.read_rng(1)        # 32 bytes from SE1&lt;br/&gt;b = callgate.read_rng(2)        # 8 bytes from SE2&lt;br/&gt;n = ngu.hash.sha256d(a &#43; b)&lt;br/&gt;n, = ustruct.unpack(&#39;I&#39;, n[0:4])  # keeps only 4 bytes&lt;br/&gt;ngu.random.reseed(n)              # replaces one 32-bit state word&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;The reseed hashes 40 bytes of secure-element output with SHA256d, then truncates to 4 bytes. It replaces one 32-bit Yasmarang state word. Maximum 2^32 distinct reseed values.&lt;br/&gt;&lt;br/&gt;### Why the reseed was inadequate&lt;br/&gt;&lt;br/&gt;| Property | Value |&lt;br/&gt;|---|---|&lt;br/&gt;| Secure element output | 40 bytes |&lt;br/&gt;| Bytes retained after SHA256d | 4 (ustruct unpack &#39;I&#39;) |&lt;br/&gt;| Maximum distinct reseed values | 2^32 |&lt;br/&gt;| Effective entropy after reseed (Mk4/Q/Mk5) | ~72 bits |&lt;br/&gt;| Design target | 128 bits |&lt;br/&gt;| Gap | 56 bits below target |&lt;br/&gt;&lt;br/&gt;The reseed function itself is trivial: `yasmarang_pad = mp_obj_get_int_truncated(arg)`. It does not initialize a cryptographic DRBG. It does not reset other state words. It does not provide periodic reseeding or prediction resistance.&lt;br/&gt;&lt;br/&gt;The secure element firmware that provides the reseed entropy is closed source. `shared/callgate.py` is a thin wrapper around `ckcc.gate()` calls. The 72-bit figure rests on trust in a closed system that cannot be independently audited from outside the chip.&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 6&lt;br/&gt;&lt;br/&gt;### The same key signed both commits&lt;br/&gt;&lt;br/&gt;Gray&#39;s commits to libngu, including the reseed PR, are signed with his subkey `F0E6CC6AFC16CF7B`, verified by raw PGP packet inspection. switck&#39;s commits are signed with Gray&#39;s primary key `A2DCD558C2BE5D7C`. The same GPG key is used across both identities.&lt;br/&gt;&lt;br/&gt;The fateful firmware commit `b18723dd` was the one commit Gray did not sign.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The test failures&lt;br/&gt;&lt;br/&gt;### What the test suite looked like at the time of the commit&lt;br/&gt;&lt;br/&gt;| Issue | Evidence | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Test RNG deliberately seeded | `conftest.py` line 13: `random.seed(42)` | [GitHub: testing/conftest.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;) |&lt;br/&gt;| Only assertion on seed generation | `shared/seed.py`: `assert len(set(seed)) &gt; 4` with comment `# TRNG failure` | GitHub API file diff |&lt;br/&gt;| Entropy test tests derivation, not generation | `testing/test_drv_entro.py` tests BIP-85 derivation from a hardcoded XPRV | [GitHub: testing/test_drv_entro.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;) |&lt;br/&gt;| No end-to-end path test | No test generates a seed with known entropy input and verifies output | Full test directory inspection (18 test files) |&lt;br/&gt;| No CI/CD | No `.github` directory | [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found) |&lt;br/&gt;&lt;br/&gt;The test suite assumed the RNG worked. It never verified it. A seed with 40 bits of real entropy still expands into well-distributed, unique-looking addresses. No statistical test run against the output can distinguish &#34;unpredictable&#34; from &#34;deterministic but unexamined.&#34;&lt;br/&gt;&lt;br/&gt;The hardware TRNG code existed in every affected binary. It was reviewed. It was intact. It was never called from the seed generation path. Block Engineering&#39;s analysis: &#34;reviews did not verify end-to-end symbol resolution and call reachability.&#34; Presence was mistaken for function.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), [808bits analysis](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Timeline of Gray&#39;s involvement&lt;br/&gt;&lt;br/&gt;| Date | Action | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2018-07-17 | Gray creates GPG key `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| **2021-03-01** | **Gray pushes `b18723dd` to Coldcard/firmware master. No PR, no review, no CI, no GPG signature. Changes seed generation to route through libngu (Yasmarang). Deletes GPLv3, replaces with MIT &#43; Commons Clause.** | [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;) |&lt;br/&gt;| 2021-03-02 to 03-09 | Gray continues committing to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-03-17 | Firmware v4.0.0 ships containing the vulnerability | [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5 |&lt;br/&gt;| 2022-01-12 | Gray opens PR #17 to libngu (hardware accelerated SHA256) from `coinkite/libngu` | [GitHub API: repos/switck/libngu/pulls/17](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;) |&lt;br/&gt;| **2022-03-11** | **Gray opens PR #18 to libngu: 32-bit reseed function** | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2022-03-15 | switck merges PR #18 | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2023-05-28 | Gray&#39;s GPG key expires | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| **2026-07-30** | **Attacker drains ~1,367 BTC ($88.6M) from 4,500&#43; addresses** | [808bits](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Blame allocation: Peter D. Gray&lt;br/&gt;&lt;br/&gt;1. **Authored the vulnerability.** Commit `b18723dd` changed seed generation from the hardware TRNG path to libngu, routing through Yasmarang. Verified by GitHub API commit metadata.&lt;br/&gt;&lt;br/&gt;2. **Shipped it with no process.** Direct push to master. No pull request. No code review. No CI. No GPG signature despite having a valid key. A 120-file, 5,488-line change to a system protecting billions of dollars, pushed with the message &#34;First pass w/ libNgU.&#34; Verified by GitHub commit page (single parent, no PR, no review elements, verification: unsigned).&lt;br/&gt;&lt;br/&gt;3. **Knew the library.** 19 commits to libngu starting 19 days before the integration. Coinkite maintained their own fork. He was not importing an unknown dependency. He was integrating a collaborator&#39;s code that he had been actively modifying.&lt;br/&gt;&lt;br/&gt;4. **Introduced the license change in the same commit.** Deleted GPLv3, replaced with MIT &#43; Commons Clause. The FSF considers this &#34;source-available,&#34; not open source. The restriction on commercial use could have limited independent security auditors and tools. Verified by GitHub API file diffs.&lt;br/&gt;&lt;br/&gt;5. **Authored the inadequate mitigation.** PR #18 (March 2022) added a 32-bit reseed that left Mk4/Q/Mk5 at ~72 bits, 56 bits below the 128-bit target. The reseed truncated 40 bytes of secure-element output to 4 bytes. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold. Verified by GitHub API PR metadata.&lt;br/&gt;&lt;br/&gt;6. **The one commit that needed signing was the one that was not signed.** Gray signed his libngu commits. switck signed their commits using Gray&#39;s key. But the firmware commit that integrated the vulnerable library, changed the license, and shipped to production was unsigned.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Sources&lt;br/&gt;&lt;br/&gt;- Block Engineering root-cause analysis: &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;&lt;br/&gt;- 808bits operational analysis: &lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;&lt;br/&gt;- GitHub API: commit b18723dd: &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub commit page: &lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex profile: &lt;a href=&#34;https://api.github.com/users/doc-hex&#34;&gt;https://api.github.com/users/doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex GPG keys: &lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck profile: &lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;&lt;br/&gt;- GitHub API: switck GPG keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck SSH keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu repo: &lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu commits by doc-hex: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #17: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #18: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;&lt;br/&gt;- GitHub API: coinkite/libngu fork: &lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware fork: &lt;a href=&#34;https://api.github.com/repos/switck/firmware&#34;&gt;https://api.github.com/repos/switck/firmware&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware commits: &lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;&lt;br/&gt;- GitHub API: peter-conalgo profile: &lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;&lt;br/&gt;- GitHub API: Coldcard/.github (Not Found): &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;&lt;br/&gt;- GitHub: conftest.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;&lt;br/&gt;- GitHub: test_drv_entro.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;&lt;br/&gt;- GitHub: COPYING-CC: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&#34;&gt;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&lt;/a&gt;&lt;br/&gt;- Parent commit .gitmodules: &lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;&lt;br/&gt;- GPG signature verification: switck commit `f7711c5522` contains key `A2DCD558C2BE5D7C` in raw PGP packet; doc-hex commit `61ffc74af1` contains key `F0E6CC6AFC16CF7B` in raw PGP packet &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T21:19:58Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswqwhyzc9s3066qzllre8tep2fxu3th3hc77ya3p5cp24ak80jkeqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq00fsmt</id>
    
      <title type="html">Starting to look like it. #nevent1q…gupf</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswqwhyzc9s3066qzllre8tep2fxu3th3hc77ya3p5cp24ak80jkeqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq00fsmt" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0jf0eatds2kcs7x0f8pychhtn64ykvqxsxnt538rc3yz7a0uge9cpzpmhxue69uhkummnw3ezuamfdejsxj77pf&#39;&gt;nevent1q…77pf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Starting to look like it.&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;/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqpzpmhxue69uhkummnw3ezuamfdejsz9nhwden5te0wfjkccte9ec8y6tdv9kzumn9wsq3gamnwvaz7tmjv4kxz7fwv3sk6atn9e5k7q3qeq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqxpqqqqqqz0fgupf&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…gupf&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also responsible for the code that added entropy on newer devices, but STILL fell below a reasonable threshold. This is super sketchy. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;—————-&lt;br/&gt;# Peter D. Gray and the Coldcard Entropy Incident&lt;br/&gt;&lt;br/&gt;## Executive summary&lt;br/&gt;&lt;br/&gt;Peter D. Gray, Coinkite engineer (GitHub: `doc-hex`, email: `peter@conalgo.com`), authored the commit that introduced the Coldcard entropy vulnerability and later authored the inadequate mitigation. On March 1, 2021, Gray pushed commit `b18723dd` directly to Coldcard&#39;s firmware master branch: a 120-file, 5,488-line change that replaced the hardware TRNG seed generation path with a call through the `libngu` library, which silently resolved to a non-cryptographic software PRNG called Yasmarang. The commit had no pull request, no code review, no CI pipeline, and no GPG signature despite Gray possessing a valid signing key. The same commit deleted the GPLv3 license and replaced it with MIT plus the Commons Clause.&lt;br/&gt;&lt;br/&gt;Gray was not a passive consumer of libngu. He was an active contributor with 19 commits to the library starting February 10, 2021, 19 days before the integration commit. The library&#39;s primary author, `switck`, had no independent GPG key and signed their own commits using Gray&#39;s GPG key (`A2DCD558C2BE5D7C`), verified by raw PGP signature packet inspection. The two were collaborators: Gray was pushing to switck&#39;s firmware fork by January 2021, and Coinkite maintained their own fork of switck&#39;s library.&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored PR #18 to libngu (March 11, 2022): a 32-bit reseed function that brought newer devices (Mk4, Q, Mk5) from ~40 bits of effective entropy to ~72 bits. The design target was 128 bits. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold.&lt;br/&gt;&lt;br/&gt;The bug survived five years until July 30, 2026, when an attacker drained approximately 1,367 BTC ($88.6 million) from 4,500&#43; addresses. The attacker never touched a single device.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Gray&#39;s relationship with libngu and switck&lt;br/&gt;&lt;br/&gt;### The GPG key&lt;br/&gt;&lt;br/&gt;Gray registered a GPG key on his GitHub account:&lt;br/&gt;&lt;br/&gt;| Property | Value | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Primary key ID | `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Subkey ID | `F0E6CC6AFC16CF7B` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Created | July 17, 2018 | GitHub API |&lt;br/&gt;| Expired | May 28, 2023 | GitHub API |&lt;br/&gt;&lt;br/&gt;switck has no GPG key registered on GitHub ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;)), no SSH keys ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;)), and uses only GitHub&#39;s noreply email. Location listed as &#34;Cyberspace.&#34;&lt;br/&gt;&lt;br/&gt;Despite switck having no registered key, switck&#39;s commits to libngu are GPG-signed. GitHub marks them `verified=False, reason=unknown_key` because the signing key is not registered to switck&#39;s account. Raw inspection of the PGP signature packets reveals the key ID:&lt;br/&gt;&lt;br/&gt;- switck commit `f7711c5522` (2024-03-30): raw PGP packet contains `A2DCD558C2BE5D7C`. This is Gray&#39;s primary key.&lt;br/&gt;- doc-hex commit `61ffc74af1` (2022-03-11): raw PGP packet contains `F0E6CC6AFC16CF7B`. This is Gray&#39;s subkey.&lt;br/&gt;&lt;br/&gt;Both key IDs belong to the same GPG key registered to doc-hex. switck does not have their own GPG key. switck is signing commits with Peter Gray&#39;s key.&lt;br/&gt;&lt;br/&gt;### The collaboration timeline&lt;br/&gt;&lt;br/&gt;| Date | Event | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2020-08-07 | switck creates GitHub account | [GitHub API: users/switck](&lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;) |&lt;br/&gt;| 2020-10-15 | switck creates libngu repo, forks Coldcard/firmware, forks micropython | [GitHub API: repos/switck/libngu](&lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork (release signing, bug fixes) | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) — commits by &#34;Peter D. Gray&#34; |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu same day. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;) (created 2021-02-10), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu (AES clone, env var tweaks, bip39 bugfix) | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;Gray had 19 total commits to libngu. He knew the library he was integrating.&lt;br/&gt;&lt;br/&gt;### The `peter-conalgo` identity&lt;br/&gt;&lt;br/&gt;The parent commit&#39;s `.gitmodules` referenced `github.com/peter-conalgo/trezor-crypto.git` as the `external/crypto` submodule. The GitHub account `peter-conalgo` was created April 22, 2021. The account name is &#34;peter,&#34; no other identity. Gray&#39;s email is `peter@conalgo.com`. The commit removed this submodule (Gray&#39;s personal trezor-crypto fork) and replaced it with switck&#39;s libngu.&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: users/peter-conalgo](&lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;), [parent commit .gitmodules](&lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The fateful commit: `b18723dd`&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/Coldcard/firmware`&lt;br/&gt;**SHA:** `b18723dd`&lt;br/&gt;**Author:** Peter D. Gray (`peter@conalgo.com`)&lt;br/&gt;**Date:** March 1, 2021, 14:03:03 UTC&lt;br/&gt;**Message:** &#34;First pass w/ libNgU&#34;&lt;br/&gt;**Parent:** `f456a88` (single parent: direct push, not a merge commit)&lt;br/&gt;**Files changed:** 120&lt;br/&gt;**Lines:** &#43;2,766 / -2,722&lt;br/&gt;**Pull request:** None&lt;br/&gt;**Code review:** None&lt;br/&gt;**CI:** None (no `.github` directory in repo)&lt;br/&gt;**GPG signature:** Unsigned, despite Gray having a valid key (created 2018, valid through May 2023)&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;), [GitHub commit page](&lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;), [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found)&lt;br/&gt;&lt;br/&gt;### What Gray changed&lt;br/&gt;&lt;br/&gt;| File | Change | Significance |&lt;br/&gt;|---|---|---|&lt;br/&gt;| `shared/random.py` | Changed `from ckcc import rng` to `import ngu`; set `bytes = ngu.random.bytes`. Comment still says &#34;crypto-quality rng.&#34; | Call path that resolved to Yasmarang instead of the hardware TRNG |&lt;br/&gt;| `shared/seed.py` | Changed `make_new_wallet()` from `rng_bytes(seed)` to `random.bytes(32)`. Changed `import tcc` to `import ngu` throughout. Changed `tcc.sha256(seed)` to `ngu.hash.sha256s(seed)`. | Seed generation function. Old path reached STM32 hardware TRNG. New path reached Yasmarang. |&lt;br/&gt;| `shared/drv_entro.py` | Changed `import stash, tcc, hmac, chains` to `import stash, ngu, chains` | BIP-85 entropy derivation path migrated |&lt;br/&gt;| `COPYING` | Deleted (674 lines, GPLv3) | Removed GPLv3 license |&lt;br/&gt;| `COPYING-CC` | Added (MIT &#43; Commons Clause) | Replaced GPLv3 with source-available license restricting commercial use |&lt;br/&gt;| `.gitmodules` | Removed `external/crypto` (`peter-conalgo/trezor-crypto`), removed `external/modcryptocurrency`, added `external/libngu` (`switck/libngu`) | Removed Gray&#39;s personal trezor-crypto fork, added switck&#39;s libngu |&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API file diffs from commit b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### The specific seed generation change&lt;br/&gt;&lt;br/&gt;Before (firmware v3.2.2):&lt;br/&gt;```python&lt;br/&gt;seed = bytearray(32)&lt;br/&gt;rng_bytes(seed)  # reaches ckcc.rng_bytes -&gt; STM32 hardware TRNG&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;After (commit b18723dd, shipped in v4.0.0):&lt;br/&gt;```python&lt;br/&gt;seed = random.bytes(32)  # reaches ngu.random.bytes -&gt; libngu -&gt; rng_get() -&gt; Yasmarang&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5&lt;br/&gt;&lt;br/&gt;### How the bug worked&lt;br/&gt;&lt;br/&gt;The bug required two pieces: a faulty preprocessor check in libngu (switck&#39;s code) and Gray&#39;s seed generation change that routed through it (Gray&#39;s code).&lt;br/&gt;&lt;br/&gt;**libngu&#39;s faulty check** (switck&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;br/&gt;#error &#34;get a HW TRNG plz&#34;&lt;br/&gt;#endif&lt;br/&gt;```&lt;br/&gt;`#ifndef` tests whether the macro exists, not whether it is enabled. Coldcard&#39;s board config defines `MICROPY_HW_ENABLE_RNG` as `0`. The macro exists. Its value is zero. The check passes. The build links Yasmarang.&lt;br/&gt;&lt;br/&gt;**Coldcard&#39;s board config** (Gray&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#define MICROPY_HW_ENABLE_RNG (0)&lt;br/&gt;```&lt;br/&gt;Coinkite disabled MicroPython&#39;s built-in RNG because they provide their own wrapper. But Gray&#39;s seed generation change called `ngu.random.bytes` instead of `ckcc.rng_bytes`, routing through the broken libngu path.&lt;br/&gt;&lt;br/&gt;Yasmarang was seeded from the MCU&#39;s 96-bit unique device identifier (factory metadata, not a secret), the SysTick counter (~80,000 possible values on Mk2/Mk3), and RTC registers (correlated timing values). None are cryptographic entropy sources. Collected once. Never reseeded.&lt;br/&gt;&lt;br/&gt;Effective entropy: ~40 bits on Mk2/Mk3 (design target: 128 bits). A 40-bit keyspace is searchable on commodity hardware.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), sections 1-4&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The reseed commit: PR #18&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored a mitigation.&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/switck/libngu`&lt;br/&gt;**PR:** #18&lt;br/&gt;**Title:** &#34;Add reseed function to ngu.random module&#34;&lt;br/&gt;**Author:** doc-hex (Peter D. Gray)&lt;br/&gt;**Submitted from:** `coinkite/libngu` fork&lt;br/&gt;**Opened:** March 11, 2022&lt;br/&gt;**Merged by:** switck on March 15, 2022&lt;br/&gt;&lt;br/&gt;Source: [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### What the reseed did&lt;br/&gt;&lt;br/&gt;```python&lt;br/&gt;a = callgate.read_rng(1)        # 32 bytes from SE1&lt;br/&gt;b = callgate.read_rng(2)        # 8 bytes from SE2&lt;br/&gt;n = ngu.hash.sha256d(a &#43; b)&lt;br/&gt;n, = ustruct.unpack(&#39;I&#39;, n[0:4])  # keeps only 4 bytes&lt;br/&gt;ngu.random.reseed(n)              # replaces one 32-bit state word&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;The reseed hashes 40 bytes of secure-element output with SHA256d, then truncates to 4 bytes. It replaces one 32-bit Yasmarang state word. Maximum 2^32 distinct reseed values.&lt;br/&gt;&lt;br/&gt;### Why the reseed was inadequate&lt;br/&gt;&lt;br/&gt;| Property | Value |&lt;br/&gt;|---|---|&lt;br/&gt;| Secure element output | 40 bytes |&lt;br/&gt;| Bytes retained after SHA256d | 4 (ustruct unpack &#39;I&#39;) |&lt;br/&gt;| Maximum distinct reseed values | 2^32 |&lt;br/&gt;| Effective entropy after reseed (Mk4/Q/Mk5) | ~72 bits |&lt;br/&gt;| Design target | 128 bits |&lt;br/&gt;| Gap | 56 bits below target |&lt;br/&gt;&lt;br/&gt;The reseed function itself is trivial: `yasmarang_pad = mp_obj_get_int_truncated(arg)`. It does not initialize a cryptographic DRBG. It does not reset other state words. It does not provide periodic reseeding or prediction resistance.&lt;br/&gt;&lt;br/&gt;The secure element firmware that provides the reseed entropy is closed source. `shared/callgate.py` is a thin wrapper around `ckcc.gate()` calls. The 72-bit figure rests on trust in a closed system that cannot be independently audited from outside the chip.&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 6&lt;br/&gt;&lt;br/&gt;### The same key signed both commits&lt;br/&gt;&lt;br/&gt;Gray&#39;s commits to libngu, including the reseed PR, are signed with his subkey `F0E6CC6AFC16CF7B`, verified by raw PGP packet inspection. switck&#39;s commits are signed with Gray&#39;s primary key `A2DCD558C2BE5D7C`. The same GPG key is used across both identities.&lt;br/&gt;&lt;br/&gt;The fateful firmware commit `b18723dd` was the one commit Gray did not sign.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The test failures&lt;br/&gt;&lt;br/&gt;### What the test suite looked like at the time of the commit&lt;br/&gt;&lt;br/&gt;| Issue | Evidence | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Test RNG deliberately seeded | `conftest.py` line 13: `random.seed(42)` | [GitHub: testing/conftest.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;) |&lt;br/&gt;| Only assertion on seed generation | `shared/seed.py`: `assert len(set(seed)) &gt; 4` with comment `# TRNG failure` | GitHub API file diff |&lt;br/&gt;| Entropy test tests derivation, not generation | `testing/test_drv_entro.py` tests BIP-85 derivation from a hardcoded XPRV | [GitHub: testing/test_drv_entro.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;) |&lt;br/&gt;| No end-to-end path test | No test generates a seed with known entropy input and verifies output | Full test directory inspection (18 test files) |&lt;br/&gt;| No CI/CD | No `.github` directory | [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found) |&lt;br/&gt;&lt;br/&gt;The test suite assumed the RNG worked. It never verified it. A seed with 40 bits of real entropy still expands into well-distributed, unique-looking addresses. No statistical test run against the output can distinguish &#34;unpredictable&#34; from &#34;deterministic but unexamined.&#34;&lt;br/&gt;&lt;br/&gt;The hardware TRNG code existed in every affected binary. It was reviewed. It was intact. It was never called from the seed generation path. Block Engineering&#39;s analysis: &#34;reviews did not verify end-to-end symbol resolution and call reachability.&#34; Presence was mistaken for function.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), [808bits analysis](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Timeline of Gray&#39;s involvement&lt;br/&gt;&lt;br/&gt;| Date | Action | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2018-07-17 | Gray creates GPG key `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| **2021-03-01** | **Gray pushes `b18723dd` to Coldcard/firmware master. No PR, no review, no CI, no GPG signature. Changes seed generation to route through libngu (Yasmarang). Deletes GPLv3, replaces with MIT &#43; Commons Clause.** | [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;) |&lt;br/&gt;| 2021-03-02 to 03-09 | Gray continues committing to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-03-17 | Firmware v4.0.0 ships containing the vulnerability | [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5 |&lt;br/&gt;| 2022-01-12 | Gray opens PR #17 to libngu (hardware accelerated SHA256) from `coinkite/libngu` | [GitHub API: repos/switck/libngu/pulls/17](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;) |&lt;br/&gt;| **2022-03-11** | **Gray opens PR #18 to libngu: 32-bit reseed function** | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2022-03-15 | switck merges PR #18 | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2023-05-28 | Gray&#39;s GPG key expires | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| **2026-07-30** | **Attacker drains ~1,367 BTC ($88.6M) from 4,500&#43; addresses** | [808bits](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Blame allocation: Peter D. Gray&lt;br/&gt;&lt;br/&gt;1. **Authored the vulnerability.** Commit `b18723dd` changed seed generation from the hardware TRNG path to libngu, routing through Yasmarang. Verified by GitHub API commit metadata.&lt;br/&gt;&lt;br/&gt;2. **Shipped it with no process.** Direct push to master. No pull request. No code review. No CI. No GPG signature despite having a valid key. A 120-file, 5,488-line change to a system protecting billions of dollars, pushed with the message &#34;First pass w/ libNgU.&#34; Verified by GitHub commit page (single parent, no PR, no review elements, verification: unsigned).&lt;br/&gt;&lt;br/&gt;3. **Knew the library.** 19 commits to libngu starting 19 days before the integration. Coinkite maintained their own fork. He was not importing an unknown dependency. He was integrating a collaborator&#39;s code that he had been actively modifying.&lt;br/&gt;&lt;br/&gt;4. **Introduced the license change in the same commit.** Deleted GPLv3, replaced with MIT &#43; Commons Clause. The FSF considers this &#34;source-available,&#34; not open source. The restriction on commercial use could have limited independent security auditors and tools. Verified by GitHub API file diffs.&lt;br/&gt;&lt;br/&gt;5. **Authored the inadequate mitigation.** PR #18 (March 2022) added a 32-bit reseed that left Mk4/Q/Mk5 at ~72 bits, 56 bits below the 128-bit target. The reseed truncated 40 bytes of secure-element output to 4 bytes. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold. Verified by GitHub API PR metadata.&lt;br/&gt;&lt;br/&gt;6. **The one commit that needed signing was the one that was not signed.** Gray signed his libngu commits. switck signed their commits using Gray&#39;s key. But the firmware commit that integrated the vulnerable library, changed the license, and shipped to production was unsigned.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Sources&lt;br/&gt;&lt;br/&gt;- Block Engineering root-cause analysis: &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;&lt;br/&gt;- 808bits operational analysis: &lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;&lt;br/&gt;- GitHub API: commit b18723dd: &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub commit page: &lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex profile: &lt;a href=&#34;https://api.github.com/users/doc-hex&#34;&gt;https://api.github.com/users/doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex GPG keys: &lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck profile: &lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;&lt;br/&gt;- GitHub API: switck GPG keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck SSH keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu repo: &lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu commits by doc-hex: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #17: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #18: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;&lt;br/&gt;- GitHub API: coinkite/libngu fork: &lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware fork: &lt;a href=&#34;https://api.github.com/repos/switck/firmware&#34;&gt;https://api.github.com/repos/switck/firmware&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware commits: &lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;&lt;br/&gt;- GitHub API: peter-conalgo profile: &lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;&lt;br/&gt;- GitHub API: Coldcard/.github (Not Found): &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;&lt;br/&gt;- GitHub: conftest.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;&lt;br/&gt;- GitHub: test_drv_entro.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;&lt;br/&gt;- GitHub: COPYING-CC: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&#34;&gt;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&lt;/a&gt;&lt;br/&gt;- Parent commit .gitmodules: &lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;&lt;br/&gt;- GPG signature verification: switck commit `f7711c5522` contains key `A2DCD558C2BE5D7C` in raw PGP packet; doc-hex commit `61ffc74af1` contains key `F0E6CC6AFC16CF7B` in raw PGP packet &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T19:18:47Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsv3ntldsh9uakye0cjkthc0gdtzwk92ccd99rvuefn0uecy5jl9eszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvcaj57</id>
    
      <title type="html">For sure. I don’t know if people aren’t talking about the ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsv3ntldsh9uakye0cjkthc0gdtzwk92ccd99rvuefn0uecy5jl9eszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvcaj57" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsryaxvv9rvgr9u3ece57yrw87j5n0mzgw0tqecscj0qf5es4x0f5spzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgv45uqy&#39;&gt;nevent1q…5uqy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;For sure. I don’t know if people aren’t talking about the path forward because these options aren’t possible or if we are just too caught up in the current state of apparently blindly trusting vendors!
    </content>
    <updated>2026-08-04T18:52:55Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsp8xyhv50vuctlntsh8fw9lgdwfe0wk2szhq77azjfzwyethvsxaqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpsq9fv</id>
    
      <title type="html">Thoughts here if you want to read. I am not an engineer so I ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsp8xyhv50vuctlntsh8fw9lgdwfe0wk2szhq77azjfzwyethvsxaqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpsq9fv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxg45npwg6escl7ke8y69822p4l8vvpqujr3w09pcur02ktnvnfgcpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhg86tlsh&#39;&gt;nevent1q…tlsh&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thoughts here if you want to read. I am not an engineer so I don’t know how feasible some of these proposals really are. &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;/nevent1qqsqzqful9uk23eavvjfq9fzyhmr9jj2ng8xrkwwr5n3fphwvnhkuvcpp4mhxue69uhkummn9ekx7mqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgqgswaehxw309ahx7um5wgh8w6twv5pzpjqt2fy0h68nj27rhfzsj8a5um3ttpersasph7g02wvjxe4np4eqqvzqqqr4guu4xkuc&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…xkuc&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; 
&lt;blockquote&gt;
&lt;p&gt;A cultural failure: execution-path trust over evaluation, and social reputation over development quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On July 30, 2026, &lt;a href=&#34;https://thehackernews.com/2026/08/coldcard-hardware-wallet-flaw-linked-to.html&#34;&gt;someone started emptying Bitcoin wallets&lt;/a&gt; that had been dormant for years. No phishing, no malware, no compromised exchange. A five-year-old firmware bug had made the seed phrases guessable, and the attacker derived the private keys offline and swept the first wave of funds before anyone knew there was a problem.&lt;/p&gt;

&lt;p&gt;This is not another write-up about the mechanics of the hack. The bug itself is almost boring: one check that tested whether a setting existed instead of whether it was turned on. What should raise eyebrows is that it lived for five years in open, widely-read code, inside the wallet the community trusted most, and nobody caught it. It went unnoticed because self-custody culture rewards the wrong things. It assumes a code path runs because the code is present, and it grades vendors on reputation instead of evidence. Those two habits, execution-path trust over verification and reputation over development practice, are the real vulnerability, and they will keep producing thefts like this one until the community trades trust for proof. What follows is less about Coldcard than about the standard that allowed it, and the one that has to replace it. The article closes with an example draft checklist that turns that standard into concrete questions you can put to any hardware wallet vendor.&lt;/p&gt;

&lt;p&gt;Social media has reached for the easy lesson: self-custody is too hard, go back to letting a custodian hold the keys. That the average person recoils from self-custody in the short term is probably unavoidable. If it becomes a long-term trend, that will be because the Bitcoin ecosystem failed to correct its flawed culture around security.&lt;/p&gt;

&lt;p&gt;Exchanges did not die after Mt. Gox and self-custody will not die after this. The exchange industry has evolved since Mt. Gox with multi-signature custody, proof-of-reserve practice, and regulatory structure that outlasted the operator who failed. Whether massive self-custody failures produce that kind of durable change is the open question. One-off audits are currently underway across every hardware wallet vendor, but the real lever is how we move forward when we talk about security in self-custody.&lt;/p&gt;

&lt;h2 id=&#34;the-bug-briefly-2&#34;&gt;The bug, briefly&lt;/h2&gt;

&lt;p&gt;Coldcard&amp;#39;s board config defined the macro &lt;code&gt;MICROPY_HW_ENABLE_RNG&lt;/code&gt; and set it to &lt;code&gt;0&lt;/code&gt;, because Coinkite supplies its own hardware RNG. A library the firmware migrated to in 2021 checked &lt;code&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;/code&gt;, which asks whether the macro exists, not whether it is switched on. The macro existed. The build linked MicroPython&amp;#39;s software fallback PRNG, a toy generator meant for chips with no hardware RNG at all. The real hardware RNG code stayed in every affected binary, reviewed and intact. Seed generation simply never called it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://blog.coinkite.com/coldcard-mk3-seed-generation-warning/&#34;&gt;Coinkite puts effective entropy&lt;/a&gt; on Mk2 and Mk3 devices running firmware v4.0.1 through v4.1.9 at roughly 40 bits against a 128-bit design target. Forty bits is a weekend on commodity hardware. &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;Block Engineering&amp;#39;s independent analysis&lt;/a&gt; is worse: depending on what an attacker already knows about the device UID and boot timing, the practical search space collapses toward 2^16, and the reseed on later models is capped at 32 bits because only four digest bytes ever reach it. &lt;a href=&#34;https://blog.coinkite.com/entropy-technical-backgrounder/&#34;&gt;Coinkite&amp;#39;s figure&lt;/a&gt; for Mk4, Q, and Mk5 is about 72 bits, still under the standard and inside the budget of a funded attacker.&lt;/p&gt;

&lt;p&gt;Entropy generation is the critical step in self-custody that has no replacement. The seed is the root of every key the wallet will ever derive, so a perfect PIN, textbook multisig, and a signing screen that shows exactly what you are approving all rest on top of it, and none of them can save a seed an attacker can guess. That is why this one step is worth staring at while the rest of the device goes unmentioned.&lt;/p&gt;

&lt;p&gt;That is the entire technical story, and it is the least interesting part of the incident. The bug is ordinary. What matters is that it shipped, passed review, survived a test suite, and sat in public source for five years underneath the device the community told everyone to buy.&lt;/p&gt;

&lt;h2 id=&#34;where-the-process-broke-2&#34;&gt;Where the process broke&lt;/h2&gt;

&lt;p&gt;The development practices at Coinkite failed to catch this. The commit that introduced the bug, &lt;code&gt;b18723dd&lt;/code&gt; on March 1, 2021, changed 120 files and 5,488 lines, swapped out the cryptographic primitives under seed generation and signing, and went straight to &lt;code&gt;master&lt;/code&gt; with the message &amp;#34;First pass w/ libNgU.&amp;#34; The public history shows a single-parent commit with no merge, no pull request, and no CI run. A change to seed generation reaching users with no formal, published review process is not a one-off slip; it is a process with limited gates and no transparency.&lt;/p&gt;

&lt;p&gt;Testing the output for entropy is nearly impossible, and that is the trap. The suite set &lt;code&gt;random.seed(42)&lt;/code&gt; for reproducibility, and the only runtime check asserted a handful of distinct byte values, which any deterministic generator passes. No statistical test on a finished seed can separate unpredictable from reproducible: a 40-bit seed still expands into unique, normal-looking addresses. Entropy is a property of the process, not the bytes. What is tractable is testing the path, which nobody did: confirm the hardware RNG is actually reached, and that known inputs produce known outputs. Block Engineering found the failure there in hours. The hardware RNG exported different function names than the library expected, so the call bound to MicroPython&amp;#39;s software generator instead, and the correct code sat present and unreachable in every binary. It is the unverified backup: file there, checksum fine, empty the day you restore from it.&lt;/p&gt;

&lt;p&gt;A closed secure element adds a variable you cannot account for. The reseed on Mk4, Q, and Mk5 comes from a chip whose firmware nobody outside Coinkite can audit, so the 72-bit figure rests on trust rather than measurement. Reproducible builds prove the shipped binary matches the public source, which matters, but they cannot tell you the source is correct, and they cannot let you feed known entropy into the secure element and check what comes back. Every closed component in the entropy path is one more thing taken on faith.&lt;/p&gt;

&lt;p&gt;Most importantly, the &amp;#34;grading&amp;#34; of Coinkite as a reliable provider was done on reputation. Coldcard was the default recommendation for years, sold on marketing, feature lists, and word of mouth, and that recommendation was never attached to anything a buyer could inspect. Nobody traced the call path because everybody assumed somebody already had. That is the habit that has to change. A recommendation should turn on the strength of the development team, whether the code and build can actually be audited, the quality of the tests, and how much trust the design removes from any single part. Reputation without clear evidence is nothing but trust.&lt;/p&gt;

&lt;h2 id=&#34;what-vendors-should-do-to-improve-validation-2&#34;&gt;What vendors should do to improve validation&lt;/h2&gt;

&lt;p&gt;None of these are hard asks. Most are a weekend of engineering time, and the first three would have increased the odds of catching the bug.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Require a pull request, a named reviewer, and a green CI run for any change touching cryptographic code.&lt;/strong&gt; No maintainer exemption, no direct pushes to the main branch, no &amp;#34;first pass&amp;#34; commits that migrate a crypto library. Coinkite cleared none of it for this change. Make sure discussions are publicly visible if code is visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add known-answer entropy tests to CI.&lt;/strong&gt; Feed a known entropy source into the device, generate a seed, and verify the output is a pure function of the input. Then disable the device&amp;#39;s own entropy and confirm the output changes. A working hardware RNG makes seeds depend on hardware entropy; a broken one makes them deterministic given a known input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify the call graph on the built binary, not the source.&lt;/strong&gt; Confirm at the linker level that the RNG symbol resolves to the hardware path. Reading the code cannot tell you this, which is exactly how five years went by.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emit generation-time evidence.&lt;/strong&gt; When a seed is created, the device should record which physical source each byte came from (the hardware RNG register, the secure element, the user&amp;#39;s dice) and confirm each was live, never the entropy values themselves, which are the seed. The record is about provenance, not quality: whitening makes even a broken generator&amp;#39;s output look random, so a statistical check passes on the exact fallback that caused this, and what cannot be faked is that the hardware path was actually read. Keep it as a signed, exportable/viewable attestation, and leave out any field that also feeds the seed, since a boot timestamp here would have leaked the timing the attack relied on. Sign it across the trust boundary: each component attests the other&amp;#39;s contribution, so one buggy component cannot forge both the seed and its own alibi. A birth certificate like that would let a user identify the exact code blocks responsible for their seed generation, instead of inferring it from a firmware version and their own memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-run AI-assisted audits on old code with current tooling on a fixed schedule.&lt;/strong&gt; Code that was clean under 2021 review methods is not clean now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;what-the-community-has-to-demand-2&#34;&gt;What the community has to demand&lt;/h2&gt;

&lt;p&gt;The audit wave now underway is the right instinct running on the wrong standard. Ledger has said its certified TRNG is unaffected. Trezor has said it does not share Coldcard&amp;#39;s code. Keystone, Foundation, and BitBox have issued similar statements. Every one of those is a claim, and Coldcard would have made the identical claim on any day of the last five years.&lt;/p&gt;

&lt;p&gt;The question each vendor needs to answer is narrow and checkable: can you trace the entropy path from source to seed, end to end, on the actual shipped binary, and show that the hardware RNG is reachable from &lt;code&gt;make_new_wallet&lt;/code&gt; or its equivalent? &amp;#34;We have a TRNG and it is in the code&amp;#34; is the answer that failed.&lt;/p&gt;

&lt;p&gt;Open-source vendors have an advantage in answering this question, and should use it. Producing that trace means publishing the source path, the symbol resolution on the built binary, and the known-answer test vectors, none of which exposes a proprietary secure-element design. The closed part can stay closed; the entropy path can still be shown. A vendor that answers &amp;#34;trust our certification&amp;#34; when it could publish the trace is choosing opacity it does not need, and that choice should count against it.&lt;/p&gt;

&lt;p&gt;Three levels of assurance need separate names, because collapsing them is how this happened.
- Source availability means you can read it.
- Reproducible builds mean you can confirm the binary matches what you read.
- End-to-end path verification means you can confirm the secure path actually executes.&lt;/p&gt;

&lt;p&gt;Coldcard had the first two. Almost every discussion of hardware wallet security treats the first two as sufficient, which is the problem we need to fix now.&lt;/p&gt;

&lt;p&gt;Two structural changes would make the validation process normal rather than heroic:
- One is a published audit framework with standard test vectors, so a vendor can be measured against a checklist that already exists instead of a checklist they wrote.
- The other is cross-vendor review or bug bounty program, funded jointly, on the argument that a design failure at any vendor damages every vendor&amp;#39;s customers.&lt;/p&gt;

&lt;p&gt;This is at least the second time a bug like this has produced weak seeds at scale. In 2023, Milk Sad (CVE-2023-39910) revealed that Libbitcoin Explorer&amp;#39;s &lt;code&gt;bx seed&lt;/code&gt; used a Mersenne Twister seeded from 32-bit &lt;code&gt;time()&lt;/code&gt;, exposing 120,000 keys. Same root cause, same cultural failure: open source, publicly documented, nobody auditing the entropy path. The response was to fix Libbitcoin, warn users, and move on. That response worked once and cannot work twice. Every wallet that generates keys needs its entropy path traced on every release, and the traces need to be published.&lt;/p&gt;

&lt;p&gt;Holders also have two levers to pull to mitigate risk in key generation: multi-vendor multisig and bring your own entropy (dice, coins, etc.). Both mechanisms reduce the reliance of wallet security on any single vendor&amp;#39;s implementation. In Coinkite&amp;#39;s case, multisig and dice-roll users are thought to be unaffected by this exploit. Critics will say that dice rolling can be unreliable. The reality is that the current state of industry means users either roll their own, or trust a vendor. The only way to actually improve this dynamic is to make it easier for users to verify the validity of entropy from a hardware wallet. Even with these options as part of the equation a robust future of self-custody heavily relies on the community getting the culture around vendor/code evaluation correct.&lt;/p&gt;

&lt;h2 id=&#34;the-pressing-challenge-of-ai-2&#34;&gt;The pressing challenge of AI&lt;/h2&gt;

&lt;p&gt;Everything above points one direction: transparency is the advantage. A vendor that shows its work, in the code and in the build, needs less trust from the buyer, and needing less trust is the entire point of self-custody. But open code cuts both ways. Anyone can read it, which means anyone can also hand it to a frontier model.&lt;/p&gt;

&lt;p&gt;Any code that has ever been public is now &lt;a href=&#34;https://news.bitcoin.com/featured/was-ai-responsible-for-finding-the-coldcard-security-flaw/&#34;&gt;scannable by an attacker with a current model&lt;/a&gt;, across the full commit history, faster than any human review team can work. The five-year dormancy window that let this bug survive is closing, and it closes for every project at once. A clean audit in 2024 says nothing about 2026, because the tool doing the reading keeps getting better. Auditing becomes maintenance, not a milestone.&lt;/p&gt;

&lt;p&gt;Hiding the source is the wrong reaction. Closed code delays attacker discovery, and delays defender discovery by more, because you find your own bugs only when the funds are already gone. The economics point the same way: AI review at scale runs into real token bills, and an open project can spread that cost across a community while a closed vendor pays alone and cuts corners in private. What fits the moment is a shared audit framework, one that lets the community hunt vulnerabilities early and often: full re-audits each time a more capable model ships, and AI-assisted review on every pull request, with human oversight and discussion before anything merges.&lt;/p&gt;

&lt;h2 id=&#34;moving-forward-2&#34;&gt;Moving Forward&lt;/h2&gt;

&lt;p&gt;It is tempting to lay this on Coinkite alone, or on the people who recommended the device for years. The blame is wider than that. Bitcoin worked. Self-custody worked. What failed sat around them: a critical bug in plain sight in public code, under a device holding a large share of the community&amp;#39;s savings, and no habit anywhere in the ecosystem was going to catch it.&lt;/p&gt;

&lt;p&gt;That culture is being rebuilt now and our discussions will shape it. Over the next few months the audits underway will continue in two possible directions: traced entropy paths, published test vectors, and symbol resolution checked against real binaries, &lt;strong&gt;or&lt;/strong&gt; another round of reassuring press releases from vendors. The Coldcard incident proved that the Bitcoin community had largely been trusting and not verifying, despite the common mantra to do the opposite.&lt;/p&gt;

&lt;p&gt;This is not the time to recoil from our stated values. It is the time to shift from trust to verification. One preprocessor check tested the wrong thing for five years and nobody looked, because nobody had to; reputation stood in for proof. The wallets that deserve trust after this are the ones that never ask for it, the ones that hand you the proof and let you run it yourself.&lt;/p&gt;

&lt;h2 id=&#34;appendix-example-hardware-evaluation-framework-2&#34;&gt;Appendix: Example Hardware Evaluation Framework&lt;/h2&gt;

&lt;p&gt;Everything above reduces to one question a buyer or reviewer can put to any vendor: can you show, not assert, that the secure path runs? The checklist below turns that into concrete asks. A vendor&amp;#39;s answers sort them into the three assurance levels, and a &amp;#34;no&amp;#34; in the entropy-path section should count for more than a polished answer everywhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assurance level&lt;/strong&gt;
- Is the firmware source available and complete, including the seed-generation path?
- Are builds reproducible, so you can rebuild and match the shipped binary byte for byte?
- Can they show end-to-end path verification, not just that the code exists?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The entropy path&lt;/strong&gt;
- Can they trace the path from source to seed on the actual shipped binary, and show the hardware RNG is reachable from the seed-generation function?
- Do they verify at the linker level that the RNG symbol resolves to the hardware path rather than a software fallback?
- Do they publish known-answer vectors from a test build that pins every entropy source (hardware RNG, secure element, user-supplied dice) to a fixed value, and show that changing each source changes the seed?
- Have they audited every preprocessor guard in the entropy path for the existence-versus-value distinction (&lt;code&gt;#ifndef X&lt;/code&gt; versus &lt;code&gt;#if X != 0&lt;/code&gt;)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development process&lt;/strong&gt;
- Are a pull request, a named reviewer, and a green CI run required for any change touching cryptographic code, with no direct-to-master exemptions?
- Are there commits that swapped cryptographic primitives without review or detailed discussion around the change?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;
- Do the tests cover seed-generation entropy, or only downstream behavior?
- Do they test the process (path reachability, known-answer vectors) rather than run statistics on output bytes, which a broken generator passes?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closed components&lt;/strong&gt;
- Which parts are closed (secure element, bootloader), and do any sit in the entropy path?
- For each closed component in that path, what exactly is taken on trust, and can they bound it, such as the real bit contribution of a reseed?
- Where you cannot inject a known value, can they at least show the component is load-bearing (force a reseed, confirm the output depends on it) and name what stays unverifiable?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation-time evidence&lt;/strong&gt;
- Does the device record or show provenance, which physical source the entropy came from during seed generation, without ever persisting the entropy values?
- Is the record a signed, exportable attestation that leaves out any field that also feeds the seed?
- Is it signed across a trust boundary, each component attesting the other&amp;#39;s contribution?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track record&lt;/strong&gt;
- After their last disclosure, did they publish a root cause and traces, or reassurances?
- Do they re-audit old code as more capable models ship?
- Does the license permit independent commercial auditing, or does it deter the people who would build tooling against it?&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T18:47:31Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqszk45whmss4wcyxd5m0ca8umvuu2vuqafd4fdq3mwlh44wyqsgmkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqewx74a</id>
    
      <title type="html">Even worse when you find out switck and doc-hex were also ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqszk45whmss4wcyxd5m0ca8umvuu2vuqafd4fdq3mwlh44wyqsgmkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqewx74a" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdfpdfyfrxvh5lnpuv67n3peygn2g9hwy0qzjlqpdx7wejxmuz2jcpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgdpg6c4&#39;&gt;nevent1q…g6c4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Even worse when you find out switck and doc-hex were also responsible for the commits that raised the entropy on the mk4,5, but still left them way under the expected 128 bit threshold. &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;/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgqgswaehxw309ahx7um5wgh8w6twv5q3gamnwvaz7tmjv4kxz7fwv3sk6atn9e5k7q3qeq94yj8maree90pm53gfr76wdc44su3cwcqmly848xfrv6es6usqxpqqqqqqz8msqj3&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…sqj3&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also responsible for the code that added entropy on newer devices, but STILL fell below a reasonable threshold. This is super sketchy. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;—————-&lt;br/&gt;# Peter D. Gray and the Coldcard Entropy Incident&lt;br/&gt;&lt;br/&gt;## Executive summary&lt;br/&gt;&lt;br/&gt;Peter D. Gray, Coinkite engineer (GitHub: `doc-hex`, email: `peter@conalgo.com`), authored the commit that introduced the Coldcard entropy vulnerability and later authored the inadequate mitigation. On March 1, 2021, Gray pushed commit `b18723dd` directly to Coldcard&#39;s firmware master branch: a 120-file, 5,488-line change that replaced the hardware TRNG seed generation path with a call through the `libngu` library, which silently resolved to a non-cryptographic software PRNG called Yasmarang. The commit had no pull request, no code review, no CI pipeline, and no GPG signature despite Gray possessing a valid signing key. The same commit deleted the GPLv3 license and replaced it with MIT plus the Commons Clause.&lt;br/&gt;&lt;br/&gt;Gray was not a passive consumer of libngu. He was an active contributor with 19 commits to the library starting February 10, 2021, 19 days before the integration commit. The library&#39;s primary author, `switck`, had no independent GPG key and signed their own commits using Gray&#39;s GPG key (`A2DCD558C2BE5D7C`), verified by raw PGP signature packet inspection. The two were collaborators: Gray was pushing to switck&#39;s firmware fork by January 2021, and Coinkite maintained their own fork of switck&#39;s library.&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored PR #18 to libngu (March 11, 2022): a 32-bit reseed function that brought newer devices (Mk4, Q, Mk5) from ~40 bits of effective entropy to ~72 bits. The design target was 128 bits. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold.&lt;br/&gt;&lt;br/&gt;The bug survived five years until July 30, 2026, when an attacker drained approximately 1,367 BTC ($88.6 million) from 4,500&#43; addresses. The attacker never touched a single device.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Gray&#39;s relationship with libngu and switck&lt;br/&gt;&lt;br/&gt;### The GPG key&lt;br/&gt;&lt;br/&gt;Gray registered a GPG key on his GitHub account:&lt;br/&gt;&lt;br/&gt;| Property | Value | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Primary key ID | `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Subkey ID | `F0E6CC6AFC16CF7B` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Created | July 17, 2018 | GitHub API |&lt;br/&gt;| Expired | May 28, 2023 | GitHub API |&lt;br/&gt;&lt;br/&gt;switck has no GPG key registered on GitHub ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;)), no SSH keys ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;)), and uses only GitHub&#39;s noreply email. Location listed as &#34;Cyberspace.&#34;&lt;br/&gt;&lt;br/&gt;Despite switck having no registered key, switck&#39;s commits to libngu are GPG-signed. GitHub marks them `verified=False, reason=unknown_key` because the signing key is not registered to switck&#39;s account. Raw inspection of the PGP signature packets reveals the key ID:&lt;br/&gt;&lt;br/&gt;- switck commit `f7711c5522` (2024-03-30): raw PGP packet contains `A2DCD558C2BE5D7C`. This is Gray&#39;s primary key.&lt;br/&gt;- doc-hex commit `61ffc74af1` (2022-03-11): raw PGP packet contains `F0E6CC6AFC16CF7B`. This is Gray&#39;s subkey.&lt;br/&gt;&lt;br/&gt;Both key IDs belong to the same GPG key registered to doc-hex. switck does not have their own GPG key. switck is signing commits with Peter Gray&#39;s key.&lt;br/&gt;&lt;br/&gt;### The collaboration timeline&lt;br/&gt;&lt;br/&gt;| Date | Event | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2020-08-07 | switck creates GitHub account | [GitHub API: users/switck](&lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;) |&lt;br/&gt;| 2020-10-15 | switck creates libngu repo, forks Coldcard/firmware, forks micropython | [GitHub API: repos/switck/libngu](&lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork (release signing, bug fixes) | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) — commits by &#34;Peter D. Gray&#34; |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu same day. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;) (created 2021-02-10), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu (AES clone, env var tweaks, bip39 bugfix) | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;Gray had 19 total commits to libngu. He knew the library he was integrating.&lt;br/&gt;&lt;br/&gt;### The `peter-conalgo` identity&lt;br/&gt;&lt;br/&gt;The parent commit&#39;s `.gitmodules` referenced `github.com/peter-conalgo/trezor-crypto.git` as the `external/crypto` submodule. The GitHub account `peter-conalgo` was created April 22, 2021. The account name is &#34;peter,&#34; no other identity. Gray&#39;s email is `peter@conalgo.com`. The commit removed this submodule (Gray&#39;s personal trezor-crypto fork) and replaced it with switck&#39;s libngu.&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: users/peter-conalgo](&lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;), [parent commit .gitmodules](&lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The fateful commit: `b18723dd`&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/Coldcard/firmware`&lt;br/&gt;**SHA:** `b18723dd`&lt;br/&gt;**Author:** Peter D. Gray (`peter@conalgo.com`)&lt;br/&gt;**Date:** March 1, 2021, 14:03:03 UTC&lt;br/&gt;**Message:** &#34;First pass w/ libNgU&#34;&lt;br/&gt;**Parent:** `f456a88` (single parent: direct push, not a merge commit)&lt;br/&gt;**Files changed:** 120&lt;br/&gt;**Lines:** &#43;2,766 / -2,722&lt;br/&gt;**Pull request:** None&lt;br/&gt;**Code review:** None&lt;br/&gt;**CI:** None (no `.github` directory in repo)&lt;br/&gt;**GPG signature:** Unsigned, despite Gray having a valid key (created 2018, valid through May 2023)&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;), [GitHub commit page](&lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;), [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found)&lt;br/&gt;&lt;br/&gt;### What Gray changed&lt;br/&gt;&lt;br/&gt;| File | Change | Significance |&lt;br/&gt;|---|---|---|&lt;br/&gt;| `shared/random.py` | Changed `from ckcc import rng` to `import ngu`; set `bytes = ngu.random.bytes`. Comment still says &#34;crypto-quality rng.&#34; | Call path that resolved to Yasmarang instead of the hardware TRNG |&lt;br/&gt;| `shared/seed.py` | Changed `make_new_wallet()` from `rng_bytes(seed)` to `random.bytes(32)`. Changed `import tcc` to `import ngu` throughout. Changed `tcc.sha256(seed)` to `ngu.hash.sha256s(seed)`. | Seed generation function. Old path reached STM32 hardware TRNG. New path reached Yasmarang. |&lt;br/&gt;| `shared/drv_entro.py` | Changed `import stash, tcc, hmac, chains` to `import stash, ngu, chains` | BIP-85 entropy derivation path migrated |&lt;br/&gt;| `COPYING` | Deleted (674 lines, GPLv3) | Removed GPLv3 license |&lt;br/&gt;| `COPYING-CC` | Added (MIT &#43; Commons Clause) | Replaced GPLv3 with source-available license restricting commercial use |&lt;br/&gt;| `.gitmodules` | Removed `external/crypto` (`peter-conalgo/trezor-crypto`), removed `external/modcryptocurrency`, added `external/libngu` (`switck/libngu`) | Removed Gray&#39;s personal trezor-crypto fork, added switck&#39;s libngu |&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API file diffs from commit b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### The specific seed generation change&lt;br/&gt;&lt;br/&gt;Before (firmware v3.2.2):&lt;br/&gt;```python&lt;br/&gt;seed = bytearray(32)&lt;br/&gt;rng_bytes(seed)  # reaches ckcc.rng_bytes -&gt; STM32 hardware TRNG&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;After (commit b18723dd, shipped in v4.0.0):&lt;br/&gt;```python&lt;br/&gt;seed = random.bytes(32)  # reaches ngu.random.bytes -&gt; libngu -&gt; rng_get() -&gt; Yasmarang&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5&lt;br/&gt;&lt;br/&gt;### How the bug worked&lt;br/&gt;&lt;br/&gt;The bug required two pieces: a faulty preprocessor check in libngu (switck&#39;s code) and Gray&#39;s seed generation change that routed through it (Gray&#39;s code).&lt;br/&gt;&lt;br/&gt;**libngu&#39;s faulty check** (switck&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;br/&gt;#error &#34;get a HW TRNG plz&#34;&lt;br/&gt;#endif&lt;br/&gt;```&lt;br/&gt;`#ifndef` tests whether the macro exists, not whether it is enabled. Coldcard&#39;s board config defines `MICROPY_HW_ENABLE_RNG` as `0`. The macro exists. Its value is zero. The check passes. The build links Yasmarang.&lt;br/&gt;&lt;br/&gt;**Coldcard&#39;s board config** (Gray&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#define MICROPY_HW_ENABLE_RNG (0)&lt;br/&gt;```&lt;br/&gt;Coinkite disabled MicroPython&#39;s built-in RNG because they provide their own wrapper. But Gray&#39;s seed generation change called `ngu.random.bytes` instead of `ckcc.rng_bytes`, routing through the broken libngu path.&lt;br/&gt;&lt;br/&gt;Yasmarang was seeded from the MCU&#39;s 96-bit unique device identifier (factory metadata, not a secret), the SysTick counter (~80,000 possible values on Mk2/Mk3), and RTC registers (correlated timing values). None are cryptographic entropy sources. Collected once. Never reseeded.&lt;br/&gt;&lt;br/&gt;Effective entropy: ~40 bits on Mk2/Mk3 (design target: 128 bits). A 40-bit keyspace is searchable on commodity hardware.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), sections 1-4&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The reseed commit: PR #18&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored a mitigation.&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/switck/libngu`&lt;br/&gt;**PR:** #18&lt;br/&gt;**Title:** &#34;Add reseed function to ngu.random module&#34;&lt;br/&gt;**Author:** doc-hex (Peter D. Gray)&lt;br/&gt;**Submitted from:** `coinkite/libngu` fork&lt;br/&gt;**Opened:** March 11, 2022&lt;br/&gt;**Merged by:** switck on March 15, 2022&lt;br/&gt;&lt;br/&gt;Source: [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### What the reseed did&lt;br/&gt;&lt;br/&gt;```python&lt;br/&gt;a = callgate.read_rng(1)        # 32 bytes from SE1&lt;br/&gt;b = callgate.read_rng(2)        # 8 bytes from SE2&lt;br/&gt;n = ngu.hash.sha256d(a &#43; b)&lt;br/&gt;n, = ustruct.unpack(&#39;I&#39;, n[0:4])  # keeps only 4 bytes&lt;br/&gt;ngu.random.reseed(n)              # replaces one 32-bit state word&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;The reseed hashes 40 bytes of secure-element output with SHA256d, then truncates to 4 bytes. It replaces one 32-bit Yasmarang state word. Maximum 2^32 distinct reseed values.&lt;br/&gt;&lt;br/&gt;### Why the reseed was inadequate&lt;br/&gt;&lt;br/&gt;| Property | Value |&lt;br/&gt;|---|---|&lt;br/&gt;| Secure element output | 40 bytes |&lt;br/&gt;| Bytes retained after SHA256d | 4 (ustruct unpack &#39;I&#39;) |&lt;br/&gt;| Maximum distinct reseed values | 2^32 |&lt;br/&gt;| Effective entropy after reseed (Mk4/Q/Mk5) | ~72 bits |&lt;br/&gt;| Design target | 128 bits |&lt;br/&gt;| Gap | 56 bits below target |&lt;br/&gt;&lt;br/&gt;The reseed function itself is trivial: `yasmarang_pad = mp_obj_get_int_truncated(arg)`. It does not initialize a cryptographic DRBG. It does not reset other state words. It does not provide periodic reseeding or prediction resistance.&lt;br/&gt;&lt;br/&gt;The secure element firmware that provides the reseed entropy is closed source. `shared/callgate.py` is a thin wrapper around `ckcc.gate()` calls. The 72-bit figure rests on trust in a closed system that cannot be independently audited from outside the chip.&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 6&lt;br/&gt;&lt;br/&gt;### The same key signed both commits&lt;br/&gt;&lt;br/&gt;Gray&#39;s commits to libngu, including the reseed PR, are signed with his subkey `F0E6CC6AFC16CF7B`, verified by raw PGP packet inspection. switck&#39;s commits are signed with Gray&#39;s primary key `A2DCD558C2BE5D7C`. The same GPG key is used across both identities.&lt;br/&gt;&lt;br/&gt;The fateful firmware commit `b18723dd` was the one commit Gray did not sign.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The test failures&lt;br/&gt;&lt;br/&gt;### What the test suite looked like at the time of the commit&lt;br/&gt;&lt;br/&gt;| Issue | Evidence | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Test RNG deliberately seeded | `conftest.py` line 13: `random.seed(42)` | [GitHub: testing/conftest.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;) |&lt;br/&gt;| Only assertion on seed generation | `shared/seed.py`: `assert len(set(seed)) &gt; 4` with comment `# TRNG failure` | GitHub API file diff |&lt;br/&gt;| Entropy test tests derivation, not generation | `testing/test_drv_entro.py` tests BIP-85 derivation from a hardcoded XPRV | [GitHub: testing/test_drv_entro.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;) |&lt;br/&gt;| No end-to-end path test | No test generates a seed with known entropy input and verifies output | Full test directory inspection (18 test files) |&lt;br/&gt;| No CI/CD | No `.github` directory | [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found) |&lt;br/&gt;&lt;br/&gt;The test suite assumed the RNG worked. It never verified it. A seed with 40 bits of real entropy still expands into well-distributed, unique-looking addresses. No statistical test run against the output can distinguish &#34;unpredictable&#34; from &#34;deterministic but unexamined.&#34;&lt;br/&gt;&lt;br/&gt;The hardware TRNG code existed in every affected binary. It was reviewed. It was intact. It was never called from the seed generation path. Block Engineering&#39;s analysis: &#34;reviews did not verify end-to-end symbol resolution and call reachability.&#34; Presence was mistaken for function.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), [808bits analysis](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Timeline of Gray&#39;s involvement&lt;br/&gt;&lt;br/&gt;| Date | Action | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2018-07-17 | Gray creates GPG key `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| **2021-03-01** | **Gray pushes `b18723dd` to Coldcard/firmware master. No PR, no review, no CI, no GPG signature. Changes seed generation to route through libngu (Yasmarang). Deletes GPLv3, replaces with MIT &#43; Commons Clause.** | [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;) |&lt;br/&gt;| 2021-03-02 to 03-09 | Gray continues committing to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-03-17 | Firmware v4.0.0 ships containing the vulnerability | [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5 |&lt;br/&gt;| 2022-01-12 | Gray opens PR #17 to libngu (hardware accelerated SHA256) from `coinkite/libngu` | [GitHub API: repos/switck/libngu/pulls/17](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;) |&lt;br/&gt;| **2022-03-11** | **Gray opens PR #18 to libngu: 32-bit reseed function** | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2022-03-15 | switck merges PR #18 | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2023-05-28 | Gray&#39;s GPG key expires | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| **2026-07-30** | **Attacker drains ~1,367 BTC ($88.6M) from 4,500&#43; addresses** | [808bits](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Blame allocation: Peter D. Gray&lt;br/&gt;&lt;br/&gt;1. **Authored the vulnerability.** Commit `b18723dd` changed seed generation from the hardware TRNG path to libngu, routing through Yasmarang. Verified by GitHub API commit metadata.&lt;br/&gt;&lt;br/&gt;2. **Shipped it with no process.** Direct push to master. No pull request. No code review. No CI. No GPG signature despite having a valid key. A 120-file, 5,488-line change to a system protecting billions of dollars, pushed with the message &#34;First pass w/ libNgU.&#34; Verified by GitHub commit page (single parent, no PR, no review elements, verification: unsigned).&lt;br/&gt;&lt;br/&gt;3. **Knew the library.** 19 commits to libngu starting 19 days before the integration. Coinkite maintained their own fork. He was not importing an unknown dependency. He was integrating a collaborator&#39;s code that he had been actively modifying.&lt;br/&gt;&lt;br/&gt;4. **Introduced the license change in the same commit.** Deleted GPLv3, replaced with MIT &#43; Commons Clause. The FSF considers this &#34;source-available,&#34; not open source. The restriction on commercial use could have limited independent security auditors and tools. Verified by GitHub API file diffs.&lt;br/&gt;&lt;br/&gt;5. **Authored the inadequate mitigation.** PR #18 (March 2022) added a 32-bit reseed that left Mk4/Q/Mk5 at ~72 bits, 56 bits below the 128-bit target. The reseed truncated 40 bytes of secure-element output to 4 bytes. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold. Verified by GitHub API PR metadata.&lt;br/&gt;&lt;br/&gt;6. **The one commit that needed signing was the one that was not signed.** Gray signed his libngu commits. switck signed their commits using Gray&#39;s key. But the firmware commit that integrated the vulnerable library, changed the license, and shipped to production was unsigned.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Sources&lt;br/&gt;&lt;br/&gt;- Block Engineering root-cause analysis: &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;&lt;br/&gt;- 808bits operational analysis: &lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;&lt;br/&gt;- GitHub API: commit b18723dd: &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub commit page: &lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex profile: &lt;a href=&#34;https://api.github.com/users/doc-hex&#34;&gt;https://api.github.com/users/doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex GPG keys: &lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck profile: &lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;&lt;br/&gt;- GitHub API: switck GPG keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck SSH keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu repo: &lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu commits by doc-hex: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #17: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #18: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;&lt;br/&gt;- GitHub API: coinkite/libngu fork: &lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware fork: &lt;a href=&#34;https://api.github.com/repos/switck/firmware&#34;&gt;https://api.github.com/repos/switck/firmware&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware commits: &lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;&lt;br/&gt;- GitHub API: peter-conalgo profile: &lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;&lt;br/&gt;- GitHub API: Coldcard/.github (Not Found): &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;&lt;br/&gt;- GitHub: conftest.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;&lt;br/&gt;- GitHub: test_drv_entro.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;&lt;br/&gt;- GitHub: COPYING-CC: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&#34;&gt;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&lt;/a&gt;&lt;br/&gt;- Parent commit .gitmodules: &lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;&lt;br/&gt;- GPG signature verification: switck commit `f7711c5522` contains key `A2DCD558C2BE5D7C` in raw PGP packet; doc-hex commit `61ffc74af1` contains key `F0E6CC6AFC16CF7B` in raw PGP packet &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T18:40:28Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8qqtaknhrcm939074h0x5c6kq23sgmrd6wur6tgymguudkfsehyczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqa4lv4q</id>
    
      <title type="html">👀 #nevent1q…em39</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8qqtaknhrcm939074h0x5c6kq23sgmrd6wur6tgymguudkfsehyczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqa4lv4q" />
    <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;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;/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqcyqqqqqqgpzpmhxue69uhkummnw3ezuamfdejsaeem39&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…em39&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also responsible for the code that added entropy on newer devices, but STILL fell below a reasonable threshold. This is super sketchy. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;—————-&lt;br/&gt;# Peter D. Gray and the Coldcard Entropy Incident&lt;br/&gt;&lt;br/&gt;## Executive summary&lt;br/&gt;&lt;br/&gt;Peter D. Gray, Coinkite engineer (GitHub: `doc-hex`, email: `peter@conalgo.com`), authored the commit that introduced the Coldcard entropy vulnerability and later authored the inadequate mitigation. On March 1, 2021, Gray pushed commit `b18723dd` directly to Coldcard&#39;s firmware master branch: a 120-file, 5,488-line change that replaced the hardware TRNG seed generation path with a call through the `libngu` library, which silently resolved to a non-cryptographic software PRNG called Yasmarang. The commit had no pull request, no code review, no CI pipeline, and no GPG signature despite Gray possessing a valid signing key. The same commit deleted the GPLv3 license and replaced it with MIT plus the Commons Clause.&lt;br/&gt;&lt;br/&gt;Gray was not a passive consumer of libngu. He was an active contributor with 19 commits to the library starting February 10, 2021, 19 days before the integration commit. The library&#39;s primary author, `switck`, had no independent GPG key and signed their own commits using Gray&#39;s GPG key (`A2DCD558C2BE5D7C`), verified by raw PGP signature packet inspection. The two were collaborators: Gray was pushing to switck&#39;s firmware fork by January 2021, and Coinkite maintained their own fork of switck&#39;s library.&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored PR #18 to libngu (March 11, 2022): a 32-bit reseed function that brought newer devices (Mk4, Q, Mk5) from ~40 bits of effective entropy to ~72 bits. The design target was 128 bits. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold.&lt;br/&gt;&lt;br/&gt;The bug survived five years until July 30, 2026, when an attacker drained approximately 1,367 BTC ($88.6 million) from 4,500&#43; addresses. The attacker never touched a single device.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Gray&#39;s relationship with libngu and switck&lt;br/&gt;&lt;br/&gt;### The GPG key&lt;br/&gt;&lt;br/&gt;Gray registered a GPG key on his GitHub account:&lt;br/&gt;&lt;br/&gt;| Property | Value | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Primary key ID | `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Subkey ID | `F0E6CC6AFC16CF7B` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Created | July 17, 2018 | GitHub API |&lt;br/&gt;| Expired | May 28, 2023 | GitHub API |&lt;br/&gt;&lt;br/&gt;switck has no GPG key registered on GitHub ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;)), no SSH keys ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;)), and uses only GitHub&#39;s noreply email. Location listed as &#34;Cyberspace.&#34;&lt;br/&gt;&lt;br/&gt;Despite switck having no registered key, switck&#39;s commits to libngu are GPG-signed. GitHub marks them `verified=False, reason=unknown_key` because the signing key is not registered to switck&#39;s account. Raw inspection of the PGP signature packets reveals the key ID:&lt;br/&gt;&lt;br/&gt;- switck commit `f7711c5522` (2024-03-30): raw PGP packet contains `A2DCD558C2BE5D7C`. This is Gray&#39;s primary key.&lt;br/&gt;- doc-hex commit `61ffc74af1` (2022-03-11): raw PGP packet contains `F0E6CC6AFC16CF7B`. This is Gray&#39;s subkey.&lt;br/&gt;&lt;br/&gt;Both key IDs belong to the same GPG key registered to doc-hex. switck does not have their own GPG key. switck is signing commits with Peter Gray&#39;s key.&lt;br/&gt;&lt;br/&gt;### The collaboration timeline&lt;br/&gt;&lt;br/&gt;| Date | Event | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2020-08-07 | switck creates GitHub account | [GitHub API: users/switck](&lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;) |&lt;br/&gt;| 2020-10-15 | switck creates libngu repo, forks Coldcard/firmware, forks micropython | [GitHub API: repos/switck/libngu](&lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork (release signing, bug fixes) | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) — commits by &#34;Peter D. Gray&#34; |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu same day. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;) (created 2021-02-10), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu (AES clone, env var tweaks, bip39 bugfix) | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;Gray had 19 total commits to libngu. He knew the library he was integrating.&lt;br/&gt;&lt;br/&gt;### The `peter-conalgo` identity&lt;br/&gt;&lt;br/&gt;The parent commit&#39;s `.gitmodules` referenced `github.com/peter-conalgo/trezor-crypto.git` as the `external/crypto` submodule. The GitHub account `peter-conalgo` was created April 22, 2021. The account name is &#34;peter,&#34; no other identity. Gray&#39;s email is `peter@conalgo.com`. The commit removed this submodule (Gray&#39;s personal trezor-crypto fork) and replaced it with switck&#39;s libngu.&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: users/peter-conalgo](&lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;), [parent commit .gitmodules](&lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The fateful commit: `b18723dd`&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/Coldcard/firmware`&lt;br/&gt;**SHA:** `b18723dd`&lt;br/&gt;**Author:** Peter D. Gray (`peter@conalgo.com`)&lt;br/&gt;**Date:** March 1, 2021, 14:03:03 UTC&lt;br/&gt;**Message:** &#34;First pass w/ libNgU&#34;&lt;br/&gt;**Parent:** `f456a88` (single parent: direct push, not a merge commit)&lt;br/&gt;**Files changed:** 120&lt;br/&gt;**Lines:** &#43;2,766 / -2,722&lt;br/&gt;**Pull request:** None&lt;br/&gt;**Code review:** None&lt;br/&gt;**CI:** None (no `.github` directory in repo)&lt;br/&gt;**GPG signature:** Unsigned, despite Gray having a valid key (created 2018, valid through May 2023)&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;), [GitHub commit page](&lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;), [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found)&lt;br/&gt;&lt;br/&gt;### What Gray changed&lt;br/&gt;&lt;br/&gt;| File | Change | Significance |&lt;br/&gt;|---|---|---|&lt;br/&gt;| `shared/random.py` | Changed `from ckcc import rng` to `import ngu`; set `bytes = ngu.random.bytes`. Comment still says &#34;crypto-quality rng.&#34; | Call path that resolved to Yasmarang instead of the hardware TRNG |&lt;br/&gt;| `shared/seed.py` | Changed `make_new_wallet()` from `rng_bytes(seed)` to `random.bytes(32)`. Changed `import tcc` to `import ngu` throughout. Changed `tcc.sha256(seed)` to `ngu.hash.sha256s(seed)`. | Seed generation function. Old path reached STM32 hardware TRNG. New path reached Yasmarang. |&lt;br/&gt;| `shared/drv_entro.py` | Changed `import stash, tcc, hmac, chains` to `import stash, ngu, chains` | BIP-85 entropy derivation path migrated |&lt;br/&gt;| `COPYING` | Deleted (674 lines, GPLv3) | Removed GPLv3 license |&lt;br/&gt;| `COPYING-CC` | Added (MIT &#43; Commons Clause) | Replaced GPLv3 with source-available license restricting commercial use |&lt;br/&gt;| `.gitmodules` | Removed `external/crypto` (`peter-conalgo/trezor-crypto`), removed `external/modcryptocurrency`, added `external/libngu` (`switck/libngu`) | Removed Gray&#39;s personal trezor-crypto fork, added switck&#39;s libngu |&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API file diffs from commit b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### The specific seed generation change&lt;br/&gt;&lt;br/&gt;Before (firmware v3.2.2):&lt;br/&gt;```python&lt;br/&gt;seed = bytearray(32)&lt;br/&gt;rng_bytes(seed)  # reaches ckcc.rng_bytes -&gt; STM32 hardware TRNG&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;After (commit b18723dd, shipped in v4.0.0):&lt;br/&gt;```python&lt;br/&gt;seed = random.bytes(32)  # reaches ngu.random.bytes -&gt; libngu -&gt; rng_get() -&gt; Yasmarang&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5&lt;br/&gt;&lt;br/&gt;### How the bug worked&lt;br/&gt;&lt;br/&gt;The bug required two pieces: a faulty preprocessor check in libngu (switck&#39;s code) and Gray&#39;s seed generation change that routed through it (Gray&#39;s code).&lt;br/&gt;&lt;br/&gt;**libngu&#39;s faulty check** (switck&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;br/&gt;#error &#34;get a HW TRNG plz&#34;&lt;br/&gt;#endif&lt;br/&gt;```&lt;br/&gt;`#ifndef` tests whether the macro exists, not whether it is enabled. Coldcard&#39;s board config defines `MICROPY_HW_ENABLE_RNG` as `0`. The macro exists. Its value is zero. The check passes. The build links Yasmarang.&lt;br/&gt;&lt;br/&gt;**Coldcard&#39;s board config** (Gray&#39;s code):&lt;br/&gt;```c&lt;br/&gt;#define MICROPY_HW_ENABLE_RNG (0)&lt;br/&gt;```&lt;br/&gt;Coinkite disabled MicroPython&#39;s built-in RNG because they provide their own wrapper. But Gray&#39;s seed generation change called `ngu.random.bytes` instead of `ckcc.rng_bytes`, routing through the broken libngu path.&lt;br/&gt;&lt;br/&gt;Yasmarang was seeded from the MCU&#39;s 96-bit unique device identifier (factory metadata, not a secret), the SysTick counter (~80,000 possible values on Mk2/Mk3), and RTC registers (correlated timing values). None are cryptographic entropy sources. Collected once. Never reseeded.&lt;br/&gt;&lt;br/&gt;Effective entropy: ~40 bits on Mk2/Mk3 (design target: 128 bits). A 40-bit keyspace is searchable on commodity hardware.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), sections 1-4&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The reseed commit: PR #18&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored a mitigation.&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/switck/libngu`&lt;br/&gt;**PR:** #18&lt;br/&gt;**Title:** &#34;Add reseed function to ngu.random module&#34;&lt;br/&gt;**Author:** doc-hex (Peter D. Gray)&lt;br/&gt;**Submitted from:** `coinkite/libngu` fork&lt;br/&gt;**Opened:** March 11, 2022&lt;br/&gt;**Merged by:** switck on March 15, 2022&lt;br/&gt;&lt;br/&gt;Source: [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### What the reseed did&lt;br/&gt;&lt;br/&gt;```python&lt;br/&gt;a = callgate.read_rng(1)        # 32 bytes from SE1&lt;br/&gt;b = callgate.read_rng(2)        # 8 bytes from SE2&lt;br/&gt;n = ngu.hash.sha256d(a &#43; b)&lt;br/&gt;n, = ustruct.unpack(&#39;I&#39;, n[0:4])  # keeps only 4 bytes&lt;br/&gt;ngu.random.reseed(n)              # replaces one 32-bit state word&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;The reseed hashes 40 bytes of secure-element output with SHA256d, then truncates to 4 bytes. It replaces one 32-bit Yasmarang state word. Maximum 2^32 distinct reseed values.&lt;br/&gt;&lt;br/&gt;### Why the reseed was inadequate&lt;br/&gt;&lt;br/&gt;| Property | Value |&lt;br/&gt;|---|---|&lt;br/&gt;| Secure element output | 40 bytes |&lt;br/&gt;| Bytes retained after SHA256d | 4 (ustruct unpack &#39;I&#39;) |&lt;br/&gt;| Maximum distinct reseed values | 2^32 |&lt;br/&gt;| Effective entropy after reseed (Mk4/Q/Mk5) | ~72 bits |&lt;br/&gt;| Design target | 128 bits |&lt;br/&gt;| Gap | 56 bits below target |&lt;br/&gt;&lt;br/&gt;The reseed function itself is trivial: `yasmarang_pad = mp_obj_get_int_truncated(arg)`. It does not initialize a cryptographic DRBG. It does not reset other state words. It does not provide periodic reseeding or prediction resistance.&lt;br/&gt;&lt;br/&gt;The secure element firmware that provides the reseed entropy is closed source. `shared/callgate.py` is a thin wrapper around `ckcc.gate()` calls. The 72-bit figure rests on trust in a closed system that cannot be independently audited from outside the chip.&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 6&lt;br/&gt;&lt;br/&gt;### The same key signed both commits&lt;br/&gt;&lt;br/&gt;Gray&#39;s commits to libngu, including the reseed PR, are signed with his subkey `F0E6CC6AFC16CF7B`, verified by raw PGP packet inspection. switck&#39;s commits are signed with Gray&#39;s primary key `A2DCD558C2BE5D7C`. The same GPG key is used across both identities.&lt;br/&gt;&lt;br/&gt;The fateful firmware commit `b18723dd` was the one commit Gray did not sign.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The test failures&lt;br/&gt;&lt;br/&gt;### What the test suite looked like at the time of the commit&lt;br/&gt;&lt;br/&gt;| Issue | Evidence | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Test RNG deliberately seeded | `conftest.py` line 13: `random.seed(42)` | [GitHub: testing/conftest.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;) |&lt;br/&gt;| Only assertion on seed generation | `shared/seed.py`: `assert len(set(seed)) &gt; 4` with comment `# TRNG failure` | GitHub API file diff |&lt;br/&gt;| Entropy test tests derivation, not generation | `testing/test_drv_entro.py` tests BIP-85 derivation from a hardcoded XPRV | [GitHub: testing/test_drv_entro.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;) |&lt;br/&gt;| No end-to-end path test | No test generates a seed with known entropy input and verifies output | Full test directory inspection (18 test files) |&lt;br/&gt;| No CI/CD | No `.github` directory | [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found) |&lt;br/&gt;&lt;br/&gt;The test suite assumed the RNG worked. It never verified it. A seed with 40 bits of real entropy still expands into well-distributed, unique-looking addresses. No statistical test run against the output can distinguish &#34;unpredictable&#34; from &#34;deterministic but unexamined.&#34;&lt;br/&gt;&lt;br/&gt;The hardware TRNG code existed in every affected binary. It was reviewed. It was intact. It was never called from the seed generation path. Block Engineering&#39;s analysis: &#34;reviews did not verify end-to-end symbol resolution and call reachability.&#34; Presence was mistaken for function.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), [808bits analysis](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Timeline of Gray&#39;s involvement&lt;br/&gt;&lt;br/&gt;| Date | Action | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2018-07-17 | Gray creates GPG key `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&#39;s firmware fork | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&#39;s libngu. Gray makes first commit to libngu. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| **2021-03-01** | **Gray pushes `b18723dd` to Coldcard/firmware master. No PR, no review, no CI, no GPG signature. Changes seed generation to route through libngu (Yasmarang). Deletes GPLv3, replaces with MIT &#43; Commons Clause.** | [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;) |&lt;br/&gt;| 2021-03-02 to 03-09 | Gray continues committing to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-03-17 | Firmware v4.0.0 ships containing the vulnerability | [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5 |&lt;br/&gt;| 2022-01-12 | Gray opens PR #17 to libngu (hardware accelerated SHA256) from `coinkite/libngu` | [GitHub API: repos/switck/libngu/pulls/17](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;) |&lt;br/&gt;| **2022-03-11** | **Gray opens PR #18 to libngu: 32-bit reseed function** | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2022-03-15 | switck merges PR #18 | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2023-05-28 | Gray&#39;s GPG key expires | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| **2026-07-30** | **Attacker drains ~1,367 BTC ($88.6M) from 4,500&#43; addresses** | [808bits](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Blame allocation: Peter D. Gray&lt;br/&gt;&lt;br/&gt;1. **Authored the vulnerability.** Commit `b18723dd` changed seed generation from the hardware TRNG path to libngu, routing through Yasmarang. Verified by GitHub API commit metadata.&lt;br/&gt;&lt;br/&gt;2. **Shipped it with no process.** Direct push to master. No pull request. No code review. No CI. No GPG signature despite having a valid key. A 120-file, 5,488-line change to a system protecting billions of dollars, pushed with the message &#34;First pass w/ libNgU.&#34; Verified by GitHub commit page (single parent, no PR, no review elements, verification: unsigned).&lt;br/&gt;&lt;br/&gt;3. **Knew the library.** 19 commits to libngu starting 19 days before the integration. Coinkite maintained their own fork. He was not importing an unknown dependency. He was integrating a collaborator&#39;s code that he had been actively modifying.&lt;br/&gt;&lt;br/&gt;4. **Introduced the license change in the same commit.** Deleted GPLv3, replaced with MIT &#43; Commons Clause. The FSF considers this &#34;source-available,&#34; not open source. The restriction on commercial use could have limited independent security auditors and tools. Verified by GitHub API file diffs.&lt;br/&gt;&lt;br/&gt;5. **Authored the inadequate mitigation.** PR #18 (March 2022) added a 32-bit reseed that left Mk4/Q/Mk5 at ~72 bits, 56 bits below the 128-bit target. The reseed truncated 40 bytes of secure-element output to 4 bytes. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold. Verified by GitHub API PR metadata.&lt;br/&gt;&lt;br/&gt;6. **The one commit that needed signing was the one that was not signed.** Gray signed his libngu commits. switck signed their commits using Gray&#39;s key. But the firmware commit that integrated the vulnerable library, changed the license, and shipped to production was unsigned.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Sources&lt;br/&gt;&lt;br/&gt;- Block Engineering root-cause analysis: &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;&lt;br/&gt;- 808bits operational analysis: &lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;&lt;br/&gt;- GitHub API: commit b18723dd: &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub commit page: &lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex profile: &lt;a href=&#34;https://api.github.com/users/doc-hex&#34;&gt;https://api.github.com/users/doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex GPG keys: &lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck profile: &lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;&lt;br/&gt;- GitHub API: switck GPG keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck SSH keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu repo: &lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu commits by doc-hex: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #17: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #18: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;&lt;br/&gt;- GitHub API: coinkite/libngu fork: &lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware fork: &lt;a href=&#34;https://api.github.com/repos/switck/firmware&#34;&gt;https://api.github.com/repos/switck/firmware&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware commits: &lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;&lt;br/&gt;- GitHub API: peter-conalgo profile: &lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;&lt;br/&gt;- GitHub API: Coldcard/.github (Not Found): &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;&lt;br/&gt;- GitHub: conftest.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;&lt;br/&gt;- GitHub: test_drv_entro.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;&lt;br/&gt;- GitHub: COPYING-CC: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&#34;&gt;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&lt;/a&gt;&lt;br/&gt;- Parent commit .gitmodules: &lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;&lt;br/&gt;- GPG signature verification: switck commit `f7711c5522` contains key `A2DCD558C2BE5D7C` in raw PGP packet; doc-hex commit `61ffc74af1` contains key `F0E6CC6AFC16CF7B` in raw PGP packet &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T18:31:58Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5rfkp7</id>
    
      <title type="html">Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsqm206xy5wuknjwfthd3t6ue5xcrpp2syd45ny0mdwxuge35p5msqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5rfkp7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdu7xc3e3t5azcvn00c7xzychra36ae5g40wm2d7m0mrdkr06fcqqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhguwnc9d&#39;&gt;nevent1q…nc9d&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Oh shit… from Kimi K3. Smoking gun. Looks like doc-hex was also responsible for the code that added entropy on newer devices, but STILL fell below a reasonable threshold. This is super sketchy. &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;—————-&lt;br/&gt;# Peter D. Gray and the Coldcard Entropy Incident&lt;br/&gt;&lt;br/&gt;## Executive summary&lt;br/&gt;&lt;br/&gt;Peter D. Gray, Coinkite engineer (GitHub: `doc-hex`, email: `peter@conalgo.com`), authored the commit that introduced the Coldcard entropy vulnerability and later authored the inadequate mitigation. On March 1, 2021, Gray pushed commit `b18723dd` directly to Coldcard&amp;#39;s firmware master branch: a 120-file, 5,488-line change that replaced the hardware TRNG seed generation path with a call through the `libngu` library, which silently resolved to a non-cryptographic software PRNG called Yasmarang. The commit had no pull request, no code review, no CI pipeline, and no GPG signature despite Gray possessing a valid signing key. The same commit deleted the GPLv3 license and replaced it with MIT plus the Commons Clause.&lt;br/&gt;&lt;br/&gt;Gray was not a passive consumer of libngu. He was an active contributor with 19 commits to the library starting February 10, 2021, 19 days before the integration commit. The library&amp;#39;s primary author, `switck`, had no independent GPG key and signed their own commits using Gray&amp;#39;s GPG key (`A2DCD558C2BE5D7C`), verified by raw PGP signature packet inspection. The two were collaborators: Gray was pushing to switck&amp;#39;s firmware fork by January 2021, and Coinkite maintained their own fork of switck&amp;#39;s library.&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored PR #18 to libngu (March 11, 2022): a 32-bit reseed function that brought newer devices (Mk4, Q, Mk5) from ~40 bits of effective entropy to ~72 bits. The design target was 128 bits. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold.&lt;br/&gt;&lt;br/&gt;The bug survived five years until July 30, 2026, when an attacker drained approximately 1,367 BTC ($88.6 million) from 4,500&#43; addresses. The attacker never touched a single device.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Gray&amp;#39;s relationship with libngu and switck&lt;br/&gt;&lt;br/&gt;### The GPG key&lt;br/&gt;&lt;br/&gt;Gray registered a GPG key on his GitHub account:&lt;br/&gt;&lt;br/&gt;| Property | Value | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Primary key ID | `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Subkey ID | `F0E6CC6AFC16CF7B` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| Created | July 17, 2018 | GitHub API |&lt;br/&gt;| Expired | May 28, 2023 | GitHub API |&lt;br/&gt;&lt;br/&gt;switck has no GPG key registered on GitHub ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;)), no SSH keys ([API returns empty](&lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;)), and uses only GitHub&amp;#39;s noreply email. Location listed as &amp;#34;Cyberspace.&amp;#34;&lt;br/&gt;&lt;br/&gt;Despite switck having no registered key, switck&amp;#39;s commits to libngu are GPG-signed. GitHub marks them `verified=False, reason=unknown_key` because the signing key is not registered to switck&amp;#39;s account. Raw inspection of the PGP signature packets reveals the key ID:&lt;br/&gt;&lt;br/&gt;- switck commit `f7711c5522` (2024-03-30): raw PGP packet contains `A2DCD558C2BE5D7C`. This is Gray&amp;#39;s primary key.&lt;br/&gt;- doc-hex commit `61ffc74af1` (2022-03-11): raw PGP packet contains `F0E6CC6AFC16CF7B`. This is Gray&amp;#39;s subkey.&lt;br/&gt;&lt;br/&gt;Both key IDs belong to the same GPG key registered to doc-hex. switck does not have their own GPG key. switck is signing commits with Peter Gray&amp;#39;s key.&lt;br/&gt;&lt;br/&gt;### The collaboration timeline&lt;br/&gt;&lt;br/&gt;| Date | Event | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2020-08-07 | switck creates GitHub account | [GitHub API: users/switck](&lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;) |&lt;br/&gt;| 2020-10-15 | switck creates libngu repo, forks Coldcard/firmware, forks micropython | [GitHub API: repos/switck/libngu](&lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&amp;#39;s firmware fork (release signing, bug fixes) | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) — commits by &amp;#34;Peter D. Gray&amp;#34; |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&amp;#39;s libngu. Gray makes first commit to libngu same day. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;) (created 2021-02-10), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu (AES clone, env var tweaks, bip39 bugfix) | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;Gray had 19 total commits to libngu. He knew the library he was integrating.&lt;br/&gt;&lt;br/&gt;### The `peter-conalgo` identity&lt;br/&gt;&lt;br/&gt;The parent commit&amp;#39;s `.gitmodules` referenced `github.com/peter-conalgo/trezor-crypto.git` as the `external/crypto` submodule. The GitHub account `peter-conalgo` was created April 22, 2021. The account name is &amp;#34;peter,&amp;#34; no other identity. Gray&amp;#39;s email is `peter@conalgo.com`. The commit removed this submodule (Gray&amp;#39;s personal trezor-crypto fork) and replaced it with switck&amp;#39;s libngu.&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: users/peter-conalgo](&lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;), [parent commit .gitmodules](&lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The fateful commit: `b18723dd`&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/Coldcard/firmware`&lt;br/&gt;**SHA:** `b18723dd`&lt;br/&gt;**Author:** Peter D. Gray (`peter@conalgo.com`)&lt;br/&gt;**Date:** March 1, 2021, 14:03:03 UTC&lt;br/&gt;**Message:** &amp;#34;First pass w/ libNgU&amp;#34;&lt;br/&gt;**Parent:** `f456a88` (single parent: direct push, not a merge commit)&lt;br/&gt;**Files changed:** 120&lt;br/&gt;**Lines:** &#43;2,766 / -2,722&lt;br/&gt;**Pull request:** None&lt;br/&gt;**Code review:** None&lt;br/&gt;**CI:** None (no `.github` directory in repo)&lt;br/&gt;**GPG signature:** Unsigned, despite Gray having a valid key (created 2018, valid through May 2023)&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;), [GitHub commit page](&lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;), [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found)&lt;br/&gt;&lt;br/&gt;### What Gray changed&lt;br/&gt;&lt;br/&gt;| File | Change | Significance |&lt;br/&gt;|---|---|---|&lt;br/&gt;| `shared/random.py` | Changed `from ckcc import rng` to `import ngu`; set `bytes = ngu.random.bytes`. Comment still says &amp;#34;crypto-quality rng.&amp;#34; | Call path that resolved to Yasmarang instead of the hardware TRNG |&lt;br/&gt;| `shared/seed.py` | Changed `make_new_wallet()` from `rng_bytes(seed)` to `random.bytes(32)`. Changed `import tcc` to `import ngu` throughout. Changed `tcc.sha256(seed)` to `ngu.hash.sha256s(seed)`. | Seed generation function. Old path reached STM32 hardware TRNG. New path reached Yasmarang. |&lt;br/&gt;| `shared/drv_entro.py` | Changed `import stash, tcc, hmac, chains` to `import stash, ngu, chains` | BIP-85 entropy derivation path migrated |&lt;br/&gt;| `COPYING` | Deleted (674 lines, GPLv3) | Removed GPLv3 license |&lt;br/&gt;| `COPYING-CC` | Added (MIT &#43; Commons Clause) | Replaced GPLv3 with source-available license restricting commercial use |&lt;br/&gt;| `.gitmodules` | Removed `external/crypto` (`peter-conalgo/trezor-crypto`), removed `external/modcryptocurrency`, added `external/libngu` (`switck/libngu`) | Removed Gray&amp;#39;s personal trezor-crypto fork, added switck&amp;#39;s libngu |&lt;br/&gt;&lt;br/&gt;Sources: [GitHub API file diffs from commit b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### The specific seed generation change&lt;br/&gt;&lt;br/&gt;Before (firmware v3.2.2):&lt;br/&gt;```python&lt;br/&gt;seed = bytearray(32)&lt;br/&gt;rng_bytes(seed)  # reaches ckcc.rng_bytes -&amp;gt; STM32 hardware TRNG&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;After (commit b18723dd, shipped in v4.0.0):&lt;br/&gt;```python&lt;br/&gt;seed = random.bytes(32)  # reaches ngu.random.bytes -&amp;gt; libngu -&amp;gt; rng_get() -&amp;gt; Yasmarang&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5&lt;br/&gt;&lt;br/&gt;### How the bug worked&lt;br/&gt;&lt;br/&gt;The bug required two pieces: a faulty preprocessor check in libngu (switck&amp;#39;s code) and Gray&amp;#39;s seed generation change that routed through it (Gray&amp;#39;s code).&lt;br/&gt;&lt;br/&gt;**libngu&amp;#39;s faulty check** (switck&amp;#39;s code):&lt;br/&gt;```c&lt;br/&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;br/&gt;#error &amp;#34;get a HW TRNG plz&amp;#34;&lt;br/&gt;#endif&lt;br/&gt;```&lt;br/&gt;`#ifndef` tests whether the macro exists, not whether it is enabled. Coldcard&amp;#39;s board config defines `MICROPY_HW_ENABLE_RNG` as `0`. The macro exists. Its value is zero. The check passes. The build links Yasmarang.&lt;br/&gt;&lt;br/&gt;**Coldcard&amp;#39;s board config** (Gray&amp;#39;s code):&lt;br/&gt;```c&lt;br/&gt;#define MICROPY_HW_ENABLE_RNG (0)&lt;br/&gt;```&lt;br/&gt;Coinkite disabled MicroPython&amp;#39;s built-in RNG because they provide their own wrapper. But Gray&amp;#39;s seed generation change called `ngu.random.bytes` instead of `ckcc.rng_bytes`, routing through the broken libngu path.&lt;br/&gt;&lt;br/&gt;Yasmarang was seeded from the MCU&amp;#39;s 96-bit unique device identifier (factory metadata, not a secret), the SysTick counter (~80,000 possible values on Mk2/Mk3), and RTC registers (correlated timing values). None are cryptographic entropy sources. Collected once. Never reseeded.&lt;br/&gt;&lt;br/&gt;Effective entropy: ~40 bits on Mk2/Mk3 (design target: 128 bits). A 40-bit keyspace is searchable on commodity hardware.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), sections 1-4&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The reseed commit: PR #18&lt;br/&gt;&lt;br/&gt;Thirteen months after introducing the vulnerability, Gray authored a mitigation.&lt;br/&gt;&lt;br/&gt;**Repository:** `github.com/switck/libngu`&lt;br/&gt;**PR:** #18&lt;br/&gt;**Title:** &amp;#34;Add reseed function to ngu.random module&amp;#34;&lt;br/&gt;**Author:** doc-hex (Peter D. Gray)&lt;br/&gt;**Submitted from:** `coinkite/libngu` fork&lt;br/&gt;**Opened:** March 11, 2022&lt;br/&gt;**Merged by:** switck on March 15, 2022&lt;br/&gt;&lt;br/&gt;Source: [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;### What the reseed did&lt;br/&gt;&lt;br/&gt;```python&lt;br/&gt;a = callgate.read_rng(1)        # 32 bytes from SE1&lt;br/&gt;b = callgate.read_rng(2)        # 8 bytes from SE2&lt;br/&gt;n = ngu.hash.sha256d(a &#43; b)&lt;br/&gt;n, = ustruct.unpack(&amp;#39;I&amp;#39;, n[0:4])  # keeps only 4 bytes&lt;br/&gt;ngu.random.reseed(n)              # replaces one 32-bit state word&lt;br/&gt;```&lt;br/&gt;&lt;br/&gt;The reseed hashes 40 bytes of secure-element output with SHA256d, then truncates to 4 bytes. It replaces one 32-bit Yasmarang state word. Maximum 2^32 distinct reseed values.&lt;br/&gt;&lt;br/&gt;### Why the reseed was inadequate&lt;br/&gt;&lt;br/&gt;| Property | Value |&lt;br/&gt;|---|---|&lt;br/&gt;| Secure element output | 40 bytes |&lt;br/&gt;| Bytes retained after SHA256d | 4 (ustruct unpack &amp;#39;I&amp;#39;) |&lt;br/&gt;| Maximum distinct reseed values | 2^32 |&lt;br/&gt;| Effective entropy after reseed (Mk4/Q/Mk5) | ~72 bits |&lt;br/&gt;| Design target | 128 bits |&lt;br/&gt;| Gap | 56 bits below target |&lt;br/&gt;&lt;br/&gt;The reseed function itself is trivial: `yasmarang_pad = mp_obj_get_int_truncated(arg)`. It does not initialize a cryptographic DRBG. It does not reset other state words. It does not provide periodic reseeding or prediction resistance.&lt;br/&gt;&lt;br/&gt;The secure element firmware that provides the reseed entropy is closed source. `shared/callgate.py` is a thin wrapper around `ckcc.gate()` calls. The 72-bit figure rests on trust in a closed system that cannot be independently audited from outside the chip.&lt;br/&gt;&lt;br/&gt;Source: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 6&lt;br/&gt;&lt;br/&gt;### The same key signed both commits&lt;br/&gt;&lt;br/&gt;Gray&amp;#39;s commits to libngu, including the reseed PR, are signed with his subkey `F0E6CC6AFC16CF7B`, verified by raw PGP packet inspection. switck&amp;#39;s commits are signed with Gray&amp;#39;s primary key `A2DCD558C2BE5D7C`. The same GPG key is used across both identities.&lt;br/&gt;&lt;br/&gt;The fateful firmware commit `b18723dd` was the one commit Gray did not sign.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## The test failures&lt;br/&gt;&lt;br/&gt;### What the test suite looked like at the time of the commit&lt;br/&gt;&lt;br/&gt;| Issue | Evidence | Source |&lt;br/&gt;|---|---|---|&lt;br/&gt;| Test RNG deliberately seeded | `conftest.py` line 13: `random.seed(42)` | [GitHub: testing/conftest.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;) |&lt;br/&gt;| Only assertion on seed generation | `shared/seed.py`: `assert len(set(seed)) &amp;gt; 4` with comment `# TRNG failure` | GitHub API file diff |&lt;br/&gt;| Entropy test tests derivation, not generation | `testing/test_drv_entro.py` tests BIP-85 derivation from a hardcoded XPRV | [GitHub: testing/test_drv_entro.py](&lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;) |&lt;br/&gt;| No end-to-end path test | No test generates a seed with known entropy input and verifies output | Full test directory inspection (18 test files) |&lt;br/&gt;| No CI/CD | No `.github` directory | [GitHub API: contents/.github](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;) (Not Found) |&lt;br/&gt;&lt;br/&gt;The test suite assumed the RNG worked. It never verified it. A seed with 40 bits of real entropy still expands into well-distributed, unique-looking addresses. No statistical test run against the output can distinguish &amp;#34;unpredictable&amp;#34; from &amp;#34;deterministic but unexamined.&amp;#34;&lt;br/&gt;&lt;br/&gt;The hardware TRNG code existed in every affected binary. It was reviewed. It was intact. It was never called from the seed generation path. Block Engineering&amp;#39;s analysis: &amp;#34;reviews did not verify end-to-end symbol resolution and call reachability.&amp;#34; Presence was mistaken for function.&lt;br/&gt;&lt;br/&gt;Sources: [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), [808bits analysis](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Timeline of Gray&amp;#39;s involvement&lt;br/&gt;&lt;br/&gt;| Date | Action | Evidence |&lt;br/&gt;|---|---|---|&lt;br/&gt;| 2018-07-17 | Gray creates GPG key `A2DCD558C2BE5D7C` | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| 2021-01-08 | Gray commits appear in switck&amp;#39;s firmware fork | [GitHub API: repos/switck/firmware/commits](&lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 | Coinkite forks switck&amp;#39;s libngu. Gray makes first commit to libngu. | [GitHub API: repos/coinkite/libngu](&lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;), [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-02-10 to 02-26 | Gray makes multiple commits to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| **2021-03-01** | **Gray pushes `b18723dd` to Coldcard/firmware master. No PR, no review, no CI, no GPG signature. Changes seed generation to route through libngu (Yasmarang). Deletes GPLv3, replaces with MIT &#43; Commons Clause.** | [GitHub API: commits/b18723dd](&lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;) |&lt;br/&gt;| 2021-03-02 to 03-09 | Gray continues committing to libngu | [GitHub API: libngu commits by doc-hex](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;) |&lt;br/&gt;| 2021-03-17 | Firmware v4.0.0 ships containing the vulnerability | [Block Engineering analysis](&lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;), section 5 |&lt;br/&gt;| 2022-01-12 | Gray opens PR #17 to libngu (hardware accelerated SHA256) from `coinkite/libngu` | [GitHub API: repos/switck/libngu/pulls/17](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;) |&lt;br/&gt;| **2022-03-11** | **Gray opens PR #18 to libngu: 32-bit reseed function** | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2022-03-15 | switck merges PR #18 | [GitHub API: repos/switck/libngu/pulls/18](&lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;) |&lt;br/&gt;| 2023-05-28 | Gray&amp;#39;s GPG key expires | [GitHub API: users/doc-hex/gpg_keys](&lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;) |&lt;br/&gt;| **2026-07-30** | **Attacker drains ~1,367 BTC ($88.6M) from 4,500&#43; addresses** | [808bits](&lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;) |&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Blame allocation: Peter D. Gray&lt;br/&gt;&lt;br/&gt;1. **Authored the vulnerability.** Commit `b18723dd` changed seed generation from the hardware TRNG path to libngu, routing through Yasmarang. Verified by GitHub API commit metadata.&lt;br/&gt;&lt;br/&gt;2. **Shipped it with no process.** Direct push to master. No pull request. No code review. No CI. No GPG signature despite having a valid key. A 120-file, 5,488-line change to a system protecting billions of dollars, pushed with the message &amp;#34;First pass w/ libNgU.&amp;#34; Verified by GitHub commit page (single parent, no PR, no review elements, verification: unsigned).&lt;br/&gt;&lt;br/&gt;3. **Knew the library.** 19 commits to libngu starting 19 days before the integration. Coinkite maintained their own fork. He was not importing an unknown dependency. He was integrating a collaborator&amp;#39;s code that he had been actively modifying.&lt;br/&gt;&lt;br/&gt;4. **Introduced the license change in the same commit.** Deleted GPLv3, replaced with MIT &#43; Commons Clause. The FSF considers this &amp;#34;source-available,&amp;#34; not open source. The restriction on commercial use could have limited independent security auditors and tools. Verified by GitHub API file diffs.&lt;br/&gt;&lt;br/&gt;5. **Authored the inadequate mitigation.** PR #18 (March 2022) added a 32-bit reseed that left Mk4/Q/Mk5 at ~72 bits, 56 bits below the 128-bit target. The reseed truncated 40 bytes of secure-element output to 4 bytes. The person who introduced the vulnerability also wrote the fix that left users still below the security threshold. Verified by GitHub API PR metadata.&lt;br/&gt;&lt;br/&gt;6. **The one commit that needed signing was the one that was not signed.** Gray signed his libngu commits. switck signed their commits using Gray&amp;#39;s key. But the firmware commit that integrated the vulnerable library, changed the license, and shipped to production was unsigned.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;## Sources&lt;br/&gt;&lt;br/&gt;- Block Engineering root-cause analysis: &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&lt;/a&gt;&lt;br/&gt;- 808bits operational analysis: &lt;a href=&#34;https://808bits.com/articles/coldcard-entropy-failure-lessons/&#34;&gt;https://808bits.com/articles/coldcard-entropy-failure-lessons/&lt;/a&gt;&lt;br/&gt;- GitHub API: commit b18723dd: &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&#34;&gt;https://api.github.com/repos/Coldcard/firmware/commits/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub commit page: &lt;a href=&#34;https://github.com/Coldcard/firmware/commit/b18723dd&#34;&gt;https://github.com/Coldcard/firmware/commit/b18723dd&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex profile: &lt;a href=&#34;https://api.github.com/users/doc-hex&#34;&gt;https://api.github.com/users/doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: doc-hex GPG keys: &lt;a href=&#34;https://api.github.com/users/doc-hex/gpg_keys&#34;&gt;https://api.github.com/users/doc-hex/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck profile: &lt;a href=&#34;https://api.github.com/users/switck&#34;&gt;https://api.github.com/users/switck&lt;/a&gt;&lt;br/&gt;- GitHub API: switck GPG keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/gpg_keys&#34;&gt;https://api.github.com/users/switck/gpg_keys&lt;/a&gt;&lt;br/&gt;- GitHub API: switck SSH keys (empty): &lt;a href=&#34;https://api.github.com/users/switck/keys&#34;&gt;https://api.github.com/users/switck/keys&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu repo: &lt;a href=&#34;https://api.github.com/repos/switck/libngu&#34;&gt;https://api.github.com/repos/switck/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu commits by doc-hex: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&#34;&gt;https://api.github.com/repos/switck/libngu/commits?author=doc-hex&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #17: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/17&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/17&lt;/a&gt;&lt;br/&gt;- GitHub API: libngu PR #18: &lt;a href=&#34;https://api.github.com/repos/switck/libngu/pulls/18&#34;&gt;https://api.github.com/repos/switck/libngu/pulls/18&lt;/a&gt;&lt;br/&gt;- GitHub API: coinkite/libngu fork: &lt;a href=&#34;https://api.github.com/repos/coinkite/libngu&#34;&gt;https://api.github.com/repos/coinkite/libngu&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware fork: &lt;a href=&#34;https://api.github.com/repos/switck/firmware&#34;&gt;https://api.github.com/repos/switck/firmware&lt;/a&gt;&lt;br/&gt;- GitHub API: switck/firmware commits: &lt;a href=&#34;https://api.github.com/repos/switck/firmware/commits&#34;&gt;https://api.github.com/repos/switck/firmware/commits&lt;/a&gt;&lt;br/&gt;- GitHub API: peter-conalgo profile: &lt;a href=&#34;https://api.github.com/users/peter-conalgo&#34;&gt;https://api.github.com/users/peter-conalgo&lt;/a&gt;&lt;br/&gt;- GitHub API: Coldcard/.github (Not Found): &lt;a href=&#34;https://api.github.com/repos/Coldcard/firmware/contents/.github&#34;&gt;https://api.github.com/repos/Coldcard/firmware/contents/.github&lt;/a&gt;&lt;br/&gt;- GitHub: conftest.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/conftest.py&lt;/a&gt;&lt;br/&gt;- GitHub: test_drv_entro.py: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&#34;&gt;https://github.com/Coldcard/firmware/blob/b18723dd/testing/test_drv_entro.py&lt;/a&gt;&lt;br/&gt;- GitHub: COPYING-CC: &lt;a href=&#34;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&#34;&gt;https://github.com/Coldcard/firmware/blob/master/COPYING-CC&lt;/a&gt;&lt;br/&gt;- Parent commit .gitmodules: &lt;a href=&#34;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&#34;&gt;https://raw.githubusercontent.com/Coldcard/firmware/f456a88/.gitmodules&lt;/a&gt;&lt;br/&gt;- GPG signature verification: switck commit `f7711c5522` contains key `A2DCD558C2BE5D7C` in raw PGP packet; doc-hex commit `61ffc74af1` contains key `F0E6CC6AFC16CF7B` in raw PGP packet
    </content>
    <updated>2026-08-04T18:31:03Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqstyxy4w6z9nz5ht5lcfuu702cpn7663rhfms522srelt9mt8a0tcczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqlkfgy7</id>
    
      <title type="html">@npub1h8n…rpev @npub1vwy…zugd you may find this interesting ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqstyxy4w6z9nz5ht5lcfuu702cpn7663rhfms522srelt9mt8a0tcczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqlkfgy7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsyrpundflq9ufycfuvuah30l3lk9m255hfl4hk8y70kmd9r277c6cpzpmhxue69uhkummnw3ezuamfdejs47nmzd&#39;&gt;nevent1q…nmzd&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1h8nk2346qezka5cpm8jjh3yl5j88pf4ly2ptu7s6uu55wcfqy0wq36rpev&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;TheGuySwann&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1h8n…rpev&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1vwymuey3u7mf860ndrkw3r7dz30s0srg6tqmhtjzg7umtm6rn5eq2qzugd&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Nunyabidness&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1vwy…zugd&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; you may find this interesting as folks who are helping drive the conversation around sovereignty - would be curious your feedback/thoughts
    </content>
    <updated>2026-08-04T17:58:24Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrph65levlxvqcevjd5cjlhx7kwcl56tq2ny9zs70q52ajjjh08xqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqsumf6h</id>
    
      <title type="html">Makes sense. I just posted an article with some ideas - ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrph65levlxvqcevjd5cjlhx7kwcl56tq2ny9zs70q52ajjjh08xqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqsumf6h" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsxjl9gz6tadmwrc7ufrr3p5swmhtvqflemj40enut56tj2mspl6tspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhg2qmetu&#39;&gt;nevent1q…metu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Makes sense. I just posted an article with some ideas - brainstorming with Kimi - on the topic. Seems like there are standards we should be pushing for like tracing the execution path through binaries and even showing / attesting to the entropy sources executed during seed generation. All mechanisms that should be thoroughly tested in the codebase. &lt;br/&gt;&lt;br/&gt;Obviously this only works for vendors with the code available, but it seems like it would be a significant improvement in traceability and increase the ability of end-users to validate the security claims.
    </content>
    <updated>2026-08-04T17:17:58Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsyrpundflq9ufycfuvuah30l3lk9m255hfl4hk8y70kmd9r277c6czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvvc09y</id>
    
      <title type="html">I wrote a brief review about the cultural shift that HAS to ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsyrpundflq9ufycfuvuah30l3lk9m255hfl4hk8y70kmd9r277c6czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvvc09y" />
    <content type="html">
      I wrote a brief review about the cultural shift that HAS to happen within the bitcoin space to ensure self-custody is successful. The biggest community failure leading up to the ColdCard incident was an inability to recognize the problem - masked by advertising and social reputation. It is quite literally the opposite of “don’t trust, verify” and it is something we should be able to fix as long as we shift our expectations.&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;/note1qyqne7tev4rn6ceyjq2jyf0kxt9y4xswv8vuu8f8zjrwue80dcesxmxeqk&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1qyq…xeqk&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; 
&lt;blockquote&gt;
&lt;p&gt;A cultural failure: execution-path trust over evaluation, and social reputation over development quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On July 30, 2026, &lt;a href=&#34;https://thehackernews.com/2026/08/coldcard-hardware-wallet-flaw-linked-to.html&#34;&gt;someone started emptying Bitcoin wallets&lt;/a&gt; that had been dormant for years. No phishing, no malware, no compromised exchange. A five-year-old firmware bug had made the seed phrases guessable, and the attacker derived the private keys offline and swept the first wave of funds before anyone knew there was a problem.&lt;/p&gt;

&lt;p&gt;This is not another write-up about the mechanics of the hack. The bug itself is almost boring: one check that tested whether a setting existed instead of whether it was turned on. What should raise eyebrows is that it lived for five years in open, widely-read code, inside the wallet the community trusted most, and nobody caught it. It went unnoticed because self-custody culture rewards the wrong things. It assumes a code path runs because the code is present, and it grades vendors on reputation instead of evidence. Those two habits, execution-path trust over verification and reputation over development practice, are the real vulnerability, and they will keep producing thefts like this one until the community trades trust for proof. What follows is less about Coldcard than about the standard that allowed it, and the one that has to replace it. The article closes with an example draft checklist that turns that standard into concrete questions you can put to any hardware wallet vendor.&lt;/p&gt;

&lt;p&gt;Social media has reached for the easy lesson: self-custody is too hard, go back to letting a custodian hold the keys. That the average person recoils from self-custody in the short term is probably unavoidable. If it becomes a long-term trend, that will be because the Bitcoin ecosystem failed to correct its flawed culture around security.&lt;/p&gt;

&lt;p&gt;Exchanges did not die after Mt. Gox and self-custody will not die after this. The exchange industry has evolved since Mt. Gox with multi-signature custody, proof-of-reserve practice, and regulatory structure that outlasted the operator who failed. Whether massive self-custody failures produce that kind of durable change is the open question. One-off audits are currently underway across every hardware wallet vendor, but the real lever is how we move forward when we talk about security in self-custody.&lt;/p&gt;

&lt;h2 id=&#34;the-bug-briefly-5&#34;&gt;The bug, briefly&lt;/h2&gt;

&lt;p&gt;Coldcard&amp;#39;s board config defined the macro &lt;code&gt;MICROPY_HW_ENABLE_RNG&lt;/code&gt; and set it to &lt;code&gt;0&lt;/code&gt;, because Coinkite supplies its own hardware RNG. A library the firmware migrated to in 2021 checked &lt;code&gt;#ifndef MICROPY_HW_ENABLE_RNG&lt;/code&gt;, which asks whether the macro exists, not whether it is switched on. The macro existed. The build linked MicroPython&amp;#39;s software fallback PRNG, a toy generator meant for chips with no hardware RNG at all. The real hardware RNG code stayed in every affected binary, reviewed and intact. Seed generation simply never called it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://blog.coinkite.com/coldcard-mk3-seed-generation-warning/&#34;&gt;Coinkite puts effective entropy&lt;/a&gt; on Mk2 and Mk3 devices running firmware v4.0.1 through v4.1.9 at roughly 40 bits against a 128-bit design target. Forty bits is a weekend on commodity hardware. &lt;a href=&#34;https://engineering.block.xyz/blog/predictable-rng-fallback-and-32-bit-reseed-in-coldcard-firmware&#34;&gt;Block Engineering&amp;#39;s independent analysis&lt;/a&gt; is worse: depending on what an attacker already knows about the device UID and boot timing, the practical search space collapses toward 2^16, and the reseed on later models is capped at 32 bits because only four digest bytes ever reach it. &lt;a href=&#34;https://blog.coinkite.com/entropy-technical-backgrounder/&#34;&gt;Coinkite&amp;#39;s figure&lt;/a&gt; for Mk4, Q, and Mk5 is about 72 bits, still under the standard and inside the budget of a funded attacker.&lt;/p&gt;

&lt;p&gt;Entropy generation is the critical step in self-custody that has no replacement. The seed is the root of every key the wallet will ever derive, so a perfect PIN, textbook multisig, and a signing screen that shows exactly what you are approving all rest on top of it, and none of them can save a seed an attacker can guess. That is why this one step is worth staring at while the rest of the device goes unmentioned.&lt;/p&gt;

&lt;p&gt;That is the entire technical story, and it is the least interesting part of the incident. The bug is ordinary. What matters is that it shipped, passed review, survived a test suite, and sat in public source for five years underneath the device the community told everyone to buy.&lt;/p&gt;

&lt;h2 id=&#34;where-the-process-broke-5&#34;&gt;Where the process broke&lt;/h2&gt;

&lt;p&gt;The development practices at Coinkite failed to catch this. The commit that introduced the bug, &lt;code&gt;b18723dd&lt;/code&gt; on March 1, 2021, changed 120 files and 5,488 lines, swapped out the cryptographic primitives under seed generation and signing, and went straight to &lt;code&gt;master&lt;/code&gt; with the message &amp;#34;First pass w/ libNgU.&amp;#34; The public history shows a single-parent commit with no merge, no pull request, and no CI run. A change to seed generation reaching users with no formal, published review process is not a one-off slip; it is a process with limited gates and no transparency.&lt;/p&gt;

&lt;p&gt;Testing the output for entropy is nearly impossible, and that is the trap. The suite set &lt;code&gt;random.seed(42)&lt;/code&gt; for reproducibility, and the only runtime check asserted a handful of distinct byte values, which any deterministic generator passes. No statistical test on a finished seed can separate unpredictable from reproducible: a 40-bit seed still expands into unique, normal-looking addresses. Entropy is a property of the process, not the bytes. What is tractable is testing the path, which nobody did: confirm the hardware RNG is actually reached, and that known inputs produce known outputs. Block Engineering found the failure there in hours. The hardware RNG exported different function names than the library expected, so the call bound to MicroPython&amp;#39;s software generator instead, and the correct code sat present and unreachable in every binary. It is the unverified backup: file there, checksum fine, empty the day you restore from it.&lt;/p&gt;

&lt;p&gt;A closed secure element adds a variable you cannot account for. The reseed on Mk4, Q, and Mk5 comes from a chip whose firmware nobody outside Coinkite can audit, so the 72-bit figure rests on trust rather than measurement. Reproducible builds prove the shipped binary matches the public source, which matters, but they cannot tell you the source is correct, and they cannot let you feed known entropy into the secure element and check what comes back. Every closed component in the entropy path is one more thing taken on faith.&lt;/p&gt;

&lt;p&gt;Most importantly, the &amp;#34;grading&amp;#34; of Coinkite as a reliable provider was done on reputation. Coldcard was the default recommendation for years, sold on marketing, feature lists, and word of mouth, and that recommendation was never attached to anything a buyer could inspect. Nobody traced the call path because everybody assumed somebody already had. That is the habit that has to change. A recommendation should turn on the strength of the development team, whether the code and build can actually be audited, the quality of the tests, and how much trust the design removes from any single part. Reputation without clear evidence is nothing but trust.&lt;/p&gt;

&lt;h2 id=&#34;what-vendors-should-do-to-improve-validation-5&#34;&gt;What vendors should do to improve validation&lt;/h2&gt;

&lt;p&gt;None of these are hard asks. Most are a weekend of engineering time, and the first three would have increased the odds of catching the bug.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Require a pull request, a named reviewer, and a green CI run for any change touching cryptographic code.&lt;/strong&gt; No maintainer exemption, no direct pushes to the main branch, no &amp;#34;first pass&amp;#34; commits that migrate a crypto library. Coinkite cleared none of it for this change. Make sure discussions are publicly visible if code is visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add known-answer entropy tests to CI.&lt;/strong&gt; Feed a known entropy source into the device, generate a seed, and verify the output is a pure function of the input. Then disable the device&amp;#39;s own entropy and confirm the output changes. A working hardware RNG makes seeds depend on hardware entropy; a broken one makes them deterministic given a known input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify the call graph on the built binary, not the source.&lt;/strong&gt; Confirm at the linker level that the RNG symbol resolves to the hardware path. Reading the code cannot tell you this, which is exactly how five years went by.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emit generation-time evidence.&lt;/strong&gt; When a seed is created, the device should record which physical source each byte came from (the hardware RNG register, the secure element, the user&amp;#39;s dice) and confirm each was live, never the entropy values themselves, which are the seed. The record is about provenance, not quality: whitening makes even a broken generator&amp;#39;s output look random, so a statistical check passes on the exact fallback that caused this, and what cannot be faked is that the hardware path was actually read. Keep it as a signed, exportable/viewable attestation, and leave out any field that also feeds the seed, since a boot timestamp here would have leaked the timing the attack relied on. Sign it across the trust boundary: each component attests the other&amp;#39;s contribution, so one buggy component cannot forge both the seed and its own alibi. A birth certificate like that would let a user identify the exact code blocks responsible for their seed generation, instead of inferring it from a firmware version and their own memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-run AI-assisted audits on old code with current tooling on a fixed schedule.&lt;/strong&gt; Code that was clean under 2021 review methods is not clean now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;what-the-community-has-to-demand-5&#34;&gt;What the community has to demand&lt;/h2&gt;

&lt;p&gt;The audit wave now underway is the right instinct running on the wrong standard. Ledger has said its certified TRNG is unaffected. Trezor has said it does not share Coldcard&amp;#39;s code. Keystone, Foundation, and BitBox have issued similar statements. Every one of those is a claim, and Coldcard would have made the identical claim on any day of the last five years.&lt;/p&gt;

&lt;p&gt;The question each vendor needs to answer is narrow and checkable: can you trace the entropy path from source to seed, end to end, on the actual shipped binary, and show that the hardware RNG is reachable from &lt;code&gt;make_new_wallet&lt;/code&gt; or its equivalent? &amp;#34;We have a TRNG and it is in the code&amp;#34; is the answer that failed.&lt;/p&gt;

&lt;p&gt;Open-source vendors have an advantage in answering this question, and should use it. Producing that trace means publishing the source path, the symbol resolution on the built binary, and the known-answer test vectors, none of which exposes a proprietary secure-element design. The closed part can stay closed; the entropy path can still be shown. A vendor that answers &amp;#34;trust our certification&amp;#34; when it could publish the trace is choosing opacity it does not need, and that choice should count against it.&lt;/p&gt;

&lt;p&gt;Three levels of assurance need separate names, because collapsing them is how this happened.
- Source availability means you can read it.
- Reproducible builds mean you can confirm the binary matches what you read.
- End-to-end path verification means you can confirm the secure path actually executes.&lt;/p&gt;

&lt;p&gt;Coldcard had the first two. Almost every discussion of hardware wallet security treats the first two as sufficient, which is the problem we need to fix now.&lt;/p&gt;

&lt;p&gt;Two structural changes would make the validation process normal rather than heroic:
- One is a published audit framework with standard test vectors, so a vendor can be measured against a checklist that already exists instead of a checklist they wrote.
- The other is cross-vendor review or bug bounty program, funded jointly, on the argument that a design failure at any vendor damages every vendor&amp;#39;s customers.&lt;/p&gt;

&lt;p&gt;This is at least the second time a bug like this has produced weak seeds at scale. In 2023, Milk Sad (CVE-2023-39910) revealed that Libbitcoin Explorer&amp;#39;s &lt;code&gt;bx seed&lt;/code&gt; used a Mersenne Twister seeded from 32-bit &lt;code&gt;time()&lt;/code&gt;, exposing 120,000 keys. Same root cause, same cultural failure: open source, publicly documented, nobody auditing the entropy path. The response was to fix Libbitcoin, warn users, and move on. That response worked once and cannot work twice. Every wallet that generates keys needs its entropy path traced on every release, and the traces need to be published.&lt;/p&gt;

&lt;p&gt;Holders also have two levers to pull to mitigate risk in key generation: multi-vendor multisig and bring your own entropy (dice, coins, etc.). Both mechanisms reduce the reliance of wallet security on any single vendor&amp;#39;s implementation. In Coinkite&amp;#39;s case, multisig and dice-roll users are thought to be unaffected by this exploit. Critics will say that dice rolling can be unreliable. The reality is that the current state of industry means users either roll their own, or trust a vendor. The only way to actually improve this dynamic is to make it easier for users to verify the validity of entropy from a hardware wallet. Even with these options as part of the equation a robust future of self-custody heavily relies on the community getting the culture around vendor/code evaluation correct.&lt;/p&gt;

&lt;h2 id=&#34;the-pressing-challenge-of-ai-5&#34;&gt;The pressing challenge of AI&lt;/h2&gt;

&lt;p&gt;Everything above points one direction: transparency is the advantage. A vendor that shows its work, in the code and in the build, needs less trust from the buyer, and needing less trust is the entire point of self-custody. But open code cuts both ways. Anyone can read it, which means anyone can also hand it to a frontier model.&lt;/p&gt;

&lt;p&gt;Any code that has ever been public is now &lt;a href=&#34;https://news.bitcoin.com/featured/was-ai-responsible-for-finding-the-coldcard-security-flaw/&#34;&gt;scannable by an attacker with a current model&lt;/a&gt;, across the full commit history, faster than any human review team can work. The five-year dormancy window that let this bug survive is closing, and it closes for every project at once. A clean audit in 2024 says nothing about 2026, because the tool doing the reading keeps getting better. Auditing becomes maintenance, not a milestone.&lt;/p&gt;

&lt;p&gt;Hiding the source is the wrong reaction. Closed code delays attacker discovery, and delays defender discovery by more, because you find your own bugs only when the funds are already gone. The economics point the same way: AI review at scale runs into real token bills, and an open project can spread that cost across a community while a closed vendor pays alone and cuts corners in private. What fits the moment is a shared audit framework, one that lets the community hunt vulnerabilities early and often: full re-audits each time a more capable model ships, and AI-assisted review on every pull request, with human oversight and discussion before anything merges.&lt;/p&gt;

&lt;h2 id=&#34;moving-forward-5&#34;&gt;Moving Forward&lt;/h2&gt;

&lt;p&gt;It is tempting to lay this on Coinkite alone, or on the people who recommended the device for years. The blame is wider than that. Bitcoin worked. Self-custody worked. What failed sat around them: a critical bug in plain sight in public code, under a device holding a large share of the community&amp;#39;s savings, and no habit anywhere in the ecosystem was going to catch it.&lt;/p&gt;

&lt;p&gt;That culture is being rebuilt now and our discussions will shape it. Over the next few months the audits underway will continue in two possible directions: traced entropy paths, published test vectors, and symbol resolution checked against real binaries, &lt;strong&gt;or&lt;/strong&gt; another round of reassuring press releases from vendors. The Coldcard incident proved that the Bitcoin community had largely been trusting and not verifying, despite the common mantra to do the opposite.&lt;/p&gt;

&lt;p&gt;This is not the time to recoil from our stated values. It is the time to shift from trust to verification. One preprocessor check tested the wrong thing for five years and nobody looked, because nobody had to; reputation stood in for proof. The wallets that deserve trust after this are the ones that never ask for it, the ones that hand you the proof and let you run it yourself.&lt;/p&gt;

&lt;h2 id=&#34;appendix-example-hardware-evaluation-framework-5&#34;&gt;Appendix: Example Hardware Evaluation Framework&lt;/h2&gt;

&lt;p&gt;Everything above reduces to one question a buyer or reviewer can put to any vendor: can you show, not assert, that the secure path runs? The checklist below turns that into concrete asks. A vendor&amp;#39;s answers sort them into the three assurance levels, and a &amp;#34;no&amp;#34; in the entropy-path section should count for more than a polished answer everywhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assurance level&lt;/strong&gt;
- Is the firmware source available and complete, including the seed-generation path?
- Are builds reproducible, so you can rebuild and match the shipped binary byte for byte?
- Can they show end-to-end path verification, not just that the code exists?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The entropy path&lt;/strong&gt;
- Can they trace the path from source to seed on the actual shipped binary, and show the hardware RNG is reachable from the seed-generation function?
- Do they verify at the linker level that the RNG symbol resolves to the hardware path rather than a software fallback?
- Do they publish known-answer vectors from a test build that pins every entropy source (hardware RNG, secure element, user-supplied dice) to a fixed value, and show that changing each source changes the seed?
- Have they audited every preprocessor guard in the entropy path for the existence-versus-value distinction (&lt;code&gt;#ifndef X&lt;/code&gt; versus &lt;code&gt;#if X != 0&lt;/code&gt;)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development process&lt;/strong&gt;
- Are a pull request, a named reviewer, and a green CI run required for any change touching cryptographic code, with no direct-to-master exemptions?
- Are there commits that swapped cryptographic primitives without review or detailed discussion around the change?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;
- Do the tests cover seed-generation entropy, or only downstream behavior?
- Do they test the process (path reachability, known-answer vectors) rather than run statistics on output bytes, which a broken generator passes?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closed components&lt;/strong&gt;
- Which parts are closed (secure element, bootloader), and do any sit in the entropy path?
- For each closed component in that path, what exactly is taken on trust, and can they bound it, such as the real bit contribution of a reseed?
- Where you cannot inject a known value, can they at least show the component is load-bearing (force a reseed, confirm the output depends on it) and name what stays unverifiable?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation-time evidence&lt;/strong&gt;
- Does the device record or show provenance, which physical source the entropy came from during seed generation, without ever persisting the entropy values?
- Is the record a signed, exportable attestation that leaves out any field that also feeds the seed?
- Is it signed across a trust boundary, each component attesting the other&amp;#39;s contribution?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track record&lt;/strong&gt;
- After their last disclosure, did they publish a root cause and traces, or reassurances?
- Do they re-audit old code as more capable models ship?
- Does the license permit independent commercial auditing, or does it deter the people who would build tooling against it?&lt;/p&gt;
 &lt;/blockquote&gt;
    </content>
    <updated>2026-08-04T15:26:02Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs07tahpu7rnrw3h6jj2w3g6w5kazf4yl4uahdzy0rknlm79fu8d3czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgv0kvr</id>
    
      <title type="html">So did anyone in that thread actually do a code review along with ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs07tahpu7rnrw3h6jj2w3g6w5kazf4yl4uahdzy0rknlm79fu8d3czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgv0kvr" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqxs9e22d07wyst7l5477f29hnjupn5j66kfxn8ytcntc7kc90rxspp4mhxue69uhkummn9ekx7mq0d7jsn&#39;&gt;nevent1q…7jsn&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;So did anyone in that thread actually do a code review along with the claims? Or was the bug just that easy to miss that it wasn’t found even given such a specific question? I’ve got some ideas I’m working on to share about a path forward and so I’m genuinely very curious about how this snuck by for 5 years
    </content>
    <updated>2026-08-04T12:57:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqszhzqg70k0t6xlpnemhvc3hkn6hseypxczxmmt394j0z62znlwlhczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqau8545</id>
    
      <title type="html">Open questions to the bitcoin community: - why did we not trust ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqszhzqg70k0t6xlpnemhvc3hkn6hseypxczxmmt394j0z62znlwlhczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqau8545" />
    <content type="html">
      Open questions to the bitcoin community:&lt;br/&gt;- why did we not trust the banks, but we trusted hardware providers like coinkite? Was this purely an education gap about seeds or was it a double standard?&lt;br/&gt;- how did we not catch a software error in a critical piece of code that was “source-available”? Are there bounty programs for vulnerabilities like this? If not, why not?&lt;br/&gt;- why don’t more hardware wallets directly support dice rolls? I know seedsigner does, but is that it now that the coldcard is toast? Are these paths thoroughly tested for reliability?
    </content>
    <updated>2026-08-03T13:27:57Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxdf708erpynl3q8ldr3ftzpr07z7p2rxcahah6739qn3cckv4d4gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3g7zxq</id>
    
      <title type="html">Generally agree, but camera entropy is not a good idea to use for ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxdf708erpynl3q8ldr3ftzpr07z7p2rxcahah6739qn3cckv4d4gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3g7zxq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqu9ddk0w52x9muk2uwka69c7k6gcxkrmxryvystuuusgy3ysmv4cpz3mhxue69uhhyetvv9ujuerpd46hxtnfdufz27ta&#39;&gt;nevent1q…27ta&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Generally agree, but camera entropy is not a good idea to use for real funds. I believe seedsigner says this themselves. &lt;br/&gt;&lt;br/&gt;For example, the seed signer software doesn’t have any threshold for entropy so a plain black image would potentially generate a low entropy seed.
    </content>
    <updated>2026-08-03T13:13:25Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8n7rdj05rlmrfn3wf6v49jdj439huwvjfz9vrx2t59yhvtsae2agzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqpxner</id>
    
      <title type="html">Thanks for sharing this!</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8n7rdj05rlmrfn3wf6v49jdj439huwvjfz9vrx2t59yhvtsae2agzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqpxner" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs0swufc60x3umjet3kwpa798jnr5d2wd97wgur8t93nyet2jxal3cpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtzqc3t&#39;&gt;nevent1q…qc3t&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Thanks for sharing this!
    </content>
    <updated>2026-08-02T18:53:44Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqszgnwyfn0l52h4dpp05yk6jsk8a8mttqyyjuuc0gewhvwqzhymsyqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3euaf5</id>
    
      <title type="html">Multisig &#43; health checks FTW!</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqszgnwyfn0l52h4dpp05yk6jsk8a8mttqyyjuuc0gewhvwqzhymsyqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3euaf5" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfw0k7u5dldlvzt7e63sjjydjuvtskq2z9582maf5k4gny8hv7e5spzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhg3vp700&#39;&gt;nevent1q…p700&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Multisig &#43; health checks FTW!
    </content>
    <updated>2026-07-31T18:03:45Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs25jg5y27tte0turvre68vgek0l9j3lr670nary8s6lq2zvn8649gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmr93nf</id>
    
      <title type="html">This. This wasn’t a cold card problem… this was a putting ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs25jg5y27tte0turvre68vgek0l9j3lr670nary8s6lq2zvn8649gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmr93nf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfjvzdw27lc30kx3em25qv7ev8ctyffwcmcmun097fut8wj4lap6cpz4mhxue69uhk2er9dchxummnw3ezumrpdejqsmgl4c&#39;&gt;nevent1q…gl4c&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This. This wasn’t a cold card problem… this was a putting your trust in the vendor software problem. I would argue leaning heavily on something like bitkey actually makes this worse.&lt;br/&gt;&lt;br/&gt;Yes it solves other problems, but this same exploit can, and will, happen to other vendors. Actually… didn’t it already happen to jade? Roll dice, use multiple vendors.
    </content>
    <updated>2026-07-31T15:26:56Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9wpppg3k6fhxrfp3uf34vyfr0dguhla7awmtrkfcanr4cjhqhuuczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0327et</id>
    
      <title type="html">For sure. Definitely a trade off between doing everything on your ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9wpppg3k6fhxrfp3uf34vyfr0dguhla7awmtrkfcanr4cjhqhuuczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0327et" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsva83l84ajxe8ljjy68uglp6t20z634s07vzul3tpnnkd7y74yjdcpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgpku3sa&#39;&gt;nevent1q…u3sa&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;For sure. Definitely a trade off between doing everything on your own, but there are some spots (like rolling dice) where you can easily reduce risk without increasing your risk of making a mistake. Only way you can do that is to understand the potential risks and where you are putting trust in a vendor
    </content>
    <updated>2026-07-31T15:03:47Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswmhtxed0pygadn2ze0z9ga0vaekyz29uz3hqg0c62zf6ghz29sqczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqyy83j5</id>
    
      <title type="html">Seems like a good time to remind folks of the great multisig ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswmhtxed0pygadn2ze0z9ga0vaekyz29uz3hqg0c62zf6ghz29sqczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqyy83j5" />
    <content type="html">
      Seems like a good time to remind folks of the great multisig guide from seedsigner. Even if you don’t have a seedsigner there are some great bitcoin security tidbits in here like the section on “Creating Secure Private Keys in a Trust-Minimized Way”.&lt;br/&gt;&lt;br/&gt;The ColdCard exploit is a great reminder of the importance of minizing vendor risk. The same exploit could have been found in SeedSigner or any other vendor. If you aren’t making an effort to take vendor risk out of each part of the process then you should re-evaluate your strategy. &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://seedsigner.com/seedsigner-independent-custody-guide/&#34;&gt;https://seedsigner.com/seedsigner-independent-custody-guide/&lt;/a&gt;
    </content>
    <updated>2026-07-31T14:51:09Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs2r6clck8hm5hrzmynunegjlpsyw5ke3d5ewplwsq4mw8j2flcwsqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqa7f3jg</id>
    
      <title type="html">👍 I’ve been a happy customer, but can’t speak much beyond ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs2r6clck8hm5hrzmynunegjlpsyw5ke3d5ewplwsq4mw8j2flcwsqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqa7f3jg" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2vm450mzhn683cwwfm0zkck7w8l2x6cv8jxmqexmf3nr2dlnue2cpz3mhxue69uhhyetvv9ujuerpd46hxtnfdual9lfr&#39;&gt;nevent1q…9lfr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;👍 I’ve been a happy customer, but can’t speak much beyond what I know as an end user
    </content>
    <updated>2026-07-31T14:41:07Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswdkhxhtf66al7xzjm6lwe92dact93yx70pvhp2apfrj4rweev7jczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzfedx3</id>
    
      <title type="html">😂</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswdkhxhtf66al7xzjm6lwe92dact93yx70pvhp2apfrj4rweev7jczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzfedx3" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs07dgjl940mrq24ea06fxhqq3992h7hhf3hr9v0ttw2w9966aek0qpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgc327g9&#39;&gt;nevent1q…27g9&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;😂
    </content>
    <updated>2026-07-31T14:22:25Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsgpfadsk2lgygfnsv3vcjnkk32y6vu6tkt02cqng76dfn6qzkpnpgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqejlrgq</id>
    
      <title type="html">Any issues with nunchuck? Any reason they weren’t mentioned or ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsgpfadsk2lgygfnsv3vcjnkk32y6vu6tkt02cqng76dfn6qzkpnpgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqejlrgq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9nx655t40ek0w655lfs6my8sjrch7e20q5c8pfvkvwzf5jr5zm6gpp4mhxue69uhkummn9ekx7mqnths6d&#39;&gt;nevent1q…hs6d&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Any issues with nunchuck? Any reason they weren’t mentioned or just can’t mention them all?
    </content>
    <updated>2026-07-31T14:17:51Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsv7mtf2c8ufzyfk45huhaahh9twj5evajc0k8vfcl2k8tv7h4w5wszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqxfqvl</id>
    
      <title type="html">Geographically spread out multisig with dice rolls is the way to ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsv7mtf2c8ufzyfk45huhaahh9twj5evajc0k8vfcl2k8tv7h4w5wszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqxfqvl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8mkw7xnkc9fh04dfl8wmy2mxqwj5wsx5wkjgnwvxj29d8rffudpspz3mhxue69uhhyetvv9ujuerpd46hxtnfdut87t3e&#39;&gt;nevent1q…7t3e&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Geographically spread out multisig with dice rolls is the way to go. My next investment is a second stateless signer to reduce vendor risk
    </content>
    <updated>2026-07-31T14:12:56Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9z9z229hyzugvf8g5jne5lrxwya372kl7elfg62em8pk8nv2zs5qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5y4r2u</id>
    
      <title type="html">Very interesting, very buggy</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9z9z229hyzugvf8g5jne5lrxwya372kl7elfg62em8pk8nv2zs5qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq5y4r2u" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqrqrnlkedzpnces5jw83qj526vh622hgkuqapxnv3cyj0sr2yssgpp4mhxue69uhkummn9ekx7mqc5d0wg&#39;&gt;nevent1q…d0wg&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Very interesting, very buggy
    </content>
    <updated>2026-07-29T12:52:03Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqstjtuahwh48dfdvg3u7s585zr9yh22zjukag0svlg9kkg9g26dawszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq32tflr</id>
    
      <title type="html">So now that we’re all running agents… who has hindsight wired ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqstjtuahwh48dfdvg3u7s585zr9yh22zjukag0svlg9kkg9g26dawszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq32tflr" />
    <content type="html">
      So now that we’re all running agents… who has hindsight wired in for memory? If you don’t you’re missing out.
    </content>
    <updated>2026-07-28T13:10:49Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsgfwvzx5rzperdtq6z50u5mm2xu3ukawuqcvh5xtuj04nkqrer48szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq4ppdxj</id>
    
      <title type="html">Congrats!</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsgfwvzx5rzperdtq6z50u5mm2xu3ukawuqcvh5xtuj04nkqrer48szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq4ppdxj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqp32x49w8mqg8t4sn5tk3gkhqrdakx0djxzxtcjr8qgjwh6y3cpz3mhxue69uhhyetvv9ujuerpd46hxtnfdukxwc2s&#39;&gt;nevent1q…wc2s&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Congrats!
    </content>
    <updated>2026-07-28T02:33:01Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsqrvc8vpuvf7u94efztxg753znez34n7e7ax7ezyuee00vfamdrqqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0sue8c</id>
    
      <title type="html">Makes sense!</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsqrvc8vpuvf7u94efztxg753znez34n7e7ax7ezyuee00vfamdrqqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0sue8c" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2v4kqzaznregpdqsv5umpg0rfuf53g5egfkp5j0e3d44f0guamfcpp4mhxue69uhkummn9ekx7mqyc6mxd&#39;&gt;nevent1q…6mxd&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Makes sense!
    </content>
    <updated>2026-07-28T02:23:20Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsgv8ex35xncr8v0zk6q0jpm390xcelaecuufhtvnghmcu5fp08cqczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgathhs</id>
    
      <title type="html">Also apologies with hammering your repo with issues/PRs - bridge ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsgv8ex35xncr8v0zk6q0jpm390xcelaecuufhtvnghmcu5fp08cqczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgathhs" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9hc5kjvjn4y56hawz8fypvkh4ykpv83gg4m23krmpyhj4zrk6thsf3h7wp&#39;&gt;nevent1q…h7wp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Also apologies with hammering your repo with issues/PRs - bridge is working great though! A great stopgap since the openai compatible harnesses are currently broken in buzz. Thanks for building this!
    </content>
    <updated>2026-07-26T20:49:46Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9hc5kjvjn4y56hawz8fypvkh4ykpv83gg4m23krmpyhj4zrk6thszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqc4s40l</id>
    
      <title type="html">I got this bridge working today and it seems fantastic. Biggest ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9hc5kjvjn4y56hawz8fypvkh4ykpv83gg4m23krmpyhj4zrk6thszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqc4s40l" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw3sgs8sk3g730xtajcq2hd42u8mlspwwc9yn0seyvvcef7wssrrqw0gwdz&#39;&gt;nevent1q…gwdz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I got this bridge working today and it seems fantastic. Biggest hurdle for me right now is easily adding the agent into my self-hosted relay. The buzz desktop app does not let me add a member by pub key and the CLI doesn’t expose the invite claim mechanism to Hermes. When I first got this working the relay admin was totally open, which is obviously not the right solution. I opened an issue on the buzz repo here: &lt;a href=&#34;https://github.com/block/buzz/issues/3014&#34;&gt;https://github.com/block/buzz/issues/3014&lt;/a&gt;
    </content>
    <updated>2026-07-26T18:39:03Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsznx95dp8x325p99nyt3s0hlrr5f9fxx46hl3ane6gh9fzwyc4vgszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqnyyx5z</id>
    
      <title type="html">It does look like the code generally follows the established nips ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsznx95dp8x325p99nyt3s0hlrr5f9fxx46hl3ane6gh9fzwyc4vgszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqnyyx5z" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqspas2cz4w0a774z7rzgfp2tk0cvyamny5j33rjnyqxmxz807lm3wqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdunm6wnp&#39;&gt;nevent1q…6wnp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It does look like the code generally follows the established nips used by ngit. Everything is just hard coded to a single relay right now. Guessing that will change as it stabilizes
    </content>
    <updated>2026-07-25T18:18:25Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsge58mqsrfw9v0j5g4v2hexfpnvf0cg52sxywtxlsmf9zfynzjvvszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq7ph4rc</id>
    
      <title type="html">As far as I can tell the current implementation is 1 relay per ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsge58mqsrfw9v0j5g4v2hexfpnvf0cg52sxywtxlsmf9zfynzjvvszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq7ph4rc" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2yvm05zgjzrv46elc34fsggf8f27a8694757wxhva98c5c68q5egpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgzwqa3v&#39;&gt;nevent1q…qa3v&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;As far as I can tell the current implementation is 1 relay per community. The name of the community actually has to match the name of the host in the code. It’s very clear much of Buzz is an early implementation so hopefully this will change. Some of the ngit functionality would also make a lot more sense with more relay flexibility.
    </content>
    <updated>2026-07-25T18:16:32Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqspas2cz4w0a774z7rzgfp2tk0cvyamny5j33rjnyqxmxz807lm3wqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqr8rqq7</id>
    
      <title type="html">I know we are all caught up in the agent hype, but did anyone ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqspas2cz4w0a774z7rzgfp2tk0cvyamny5j33rjnyqxmxz807lm3wqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqr8rqq7" />
    <content type="html">
      I know we are all caught up in the agent hype, but did anyone recognize that this is blocks attempt to fully. Replace the GitHub interface? Not sure how I feel about it yet - wish it was integrated with existing git over nostr solutions that are more decentralized.&lt;br/&gt;&lt;br/&gt;Hopefully some discussion to come.
    </content>
    <updated>2026-07-25T18:00:00Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8q6ng3sl0yw582hp0zwt26px0jyhe42aqt2fxx2n9ch6tyk9ensgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqkmma7f</id>
    
      <title type="html">This will be helpful… the harness management is a little all ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8q6ng3sl0yw582hp0zwt26px0jyhe42aqt2fxx2n9ch6tyk9ensgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqkmma7f" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw3sgs8sk3g730xtajcq2hd42u8mlspwwc9yn0seyvvcef7wssrrqw0gwdz&#39;&gt;nevent1q…gwdz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This will be helpful… the harness management is a little all over the place right now with buzz.
    </content>
    <updated>2026-07-25T17:56:50Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsw4lkykx0g05me4jlp372yr7dum4p0a03m564ap8tyythd9gqjatgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqd0tm6l</id>
    
      <title type="html">Buzz desktop is super buggy but I will try to keep this up to ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsw4lkykx0g05me4jlp372yr7dum4p0a03m564ap8tyythd9gqjatgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqd0tm6l" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstm0fgg8pcwak7xgekh4ym37yvphf6nzdx07azuzzza2l0glf3egstdrnh4&#39;&gt;nevent1q…rnh4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Buzz desktop is super buggy but I will try to keep this up to date.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/armstrys/buzz-relay-thin.git&#34;&gt;https://github.com/armstrys/buzz-relay-thin.git&lt;/a&gt;
    </content>
    <updated>2026-07-25T17:55:32Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsfwea27z7pt8xhc6q4fdc96308hksl2vxzyap9emmm8lf9cr8lugqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqwwcws6</id>
    
      <title type="html">Me too! I hope the “One community, one relay” design is short ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsfwea27z7pt8xhc6q4fdc96308hksl2vxzyap9emmm8lf9cr8lugqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqwwcws6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8x2uvdh7yepkc9rgmkce6ngefnlzvghya69wkdl43tw0yh8cypfqhgsq6y&#39;&gt;nevent1q…sq6y&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Me too! I hope the “One community, one relay” design is short term though. Seems restrictive.
    </content>
    <updated>2026-07-25T17:37:45Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsyuyeq3z4akpmayvln7ear3z58c7sfzeqfjwl9vnm7ektg653ktdgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3lhutz</id>
    
      <title type="html">Yeah that’s where I am at. Was able to get in running on ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsyuyeq3z4akpmayvln7ear3z58c7sfzeqfjwl9vnm7ektg653ktdgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq3lhutz" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsf293hexa8ldtezm3fmfz2vrdrhje364j9gtuuhmwmxw8akk8fknqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdu9akdpn&#39;&gt;nevent1q…kdpn&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yeah that’s where I am at. Was able to get in running on Ubuntu, but even now the latest desktop app seems to be completely rejecting it
    </content>
    <updated>2026-07-25T16:50:01Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsp9e7c2deczf7xjx2a45fzf860h6zz2klw7pxn2ma3cr80882lzsszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq7hr848</id>
    
      <title type="html">Surprised no one had made this yet… Let’s test out buzz! ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsp9e7c2deczf7xjx2a45fzf860h6zz2klw7pxn2ma3cr80882lzsszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq7hr848" />
    <content type="html">
      Surprised no one had made this yet… Let’s test out buzz!&lt;br/&gt;&lt;br/&gt;nostr.communities.buzz.xyz
    </content>
    <updated>2026-07-25T15:33:22Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsq88nv8xny4zqph5kwyum64wun7e62egw87m8kat5eydchk3r4p4szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqm4kh03</id>
    
      <title type="html">Don’t blame you :)</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsq88nv8xny4zqph5kwyum64wun7e62egw87m8kat5eydchk3r4p4szyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqm4kh03" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswnja202hn7k4ptderqulc8yjfmzvzry458apm8cct243tk6myjrqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgy5wwpk&#39;&gt;nevent1q…wwpk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Don’t blame you :)
    </content>
    <updated>2026-07-25T15:20:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0u5mepr682fwkyx2fdaxnd4mq24855hrjwaekjccesd6r339vh7gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq59w9kg</id>
    
      <title type="html">I should get myself a physical cookbook… I do find myself doing ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0u5mepr682fwkyx2fdaxnd4mq24855hrjwaekjccesd6r339vh7gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq59w9kg" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsr2q4xal0seclt0w4qn4qd3vlpllwkhuxpshlkr6eu26aywxthegspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgxavfg8&#39;&gt;nevent1q…vfg8&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I should get myself a physical cookbook… I do find myself doing a lot of NYT recipes! Kenji Lopez-Alt is typically my go to any time I’m looking for a new recipe though. He nails the food science and methods testing. &lt;br/&gt;&lt;br/&gt;This was the first time I’d tried mayo on turkey, but it makes sense and it worked pretty well!
    </content>
    <updated>2026-07-25T14:33:32Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs95hkmf4thvs5ztxtpltuen7gfnft35k69tygp263j7dhmhevh60qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpedatg</id>
    
      <title type="html">Did you have much trouble getting the relay running?</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs95hkmf4thvs5ztxtpltuen7gfnft35k69tygp263j7dhmhevh60qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpedatg" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrqtwe6tk5ttvsss74me5762c9dqpzg5z5cpz90r42cxn4nvn449gpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgfphh8m&#39;&gt;nevent1q…hh8m&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Did you have much trouble getting the relay running?
    </content>
    <updated>2026-07-25T14:24:22Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs8payefz4f50nszw73xg05z97cu062t8rwcvnzavcexk54q0xdr9qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqajdxnu</id>
    
      <title type="html">Reminds me of one of my favorite turkey recipes. The herbed mayo ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs8payefz4f50nszw73xg05z97cu062t8rwcvnzavcexk54q0xdr9qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqajdxnu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsylu9ulznmrkt2jn0w04g05jscpune97gccgtwfkjnupmwqur8r6cpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupa8fj7&#39;&gt;nevent1q…8fj7&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Reminds me of one of my favorite turkey recipes. The herbed mayo is killer for leftover sandwiches. &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://cooking.nytimes.com/recipes/1023623-mayo-roasted-thanksgiving-turkey-with-gravy&#34;&gt;https://cooking.nytimes.com/recipes/1023623-mayo-roasted-thanksgiving-turkey-with-gravy&lt;/a&gt;
    </content>
    <updated>2026-07-25T14:20:30Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9xuvn2q9cy9d0jylw4kk55vgl9tc7vvwrn7dvs680lvwplrauqfszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqf72s7j</id>
    
      <title type="html">Rolling your own is always fun but it may be worth keeping any ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9xuvn2q9cy9d0jylw4kk55vgl9tc7vvwrn7dvs680lvwplrauqfszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqf72s7j" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs9xh3auhn3hn867dy4f4trgmjt766k8qzvtmhxr7n3efd0xvd5nwspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgfe4pss&#39;&gt;nevent1q…4pss&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Rolling your own is always fun but it may be worth keeping any eye on Buzz now that it exists. Certainly will fill the gap for coworking though it may miss on many other needs
    </content>
    <updated>2026-07-25T14:12:54Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs026yfamd0z0d8g4nnsrqkc3qezxgszqx8cvyaqpnxpky7a3verfczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6ehqpu</id>
    
      <title type="html">GitHub readme isn’t bad. This video also gives a pretty ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs026yfamd0z0d8g4nnsrqkc3qezxgszqx8cvyaqpnxpky7a3verfczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6ehqpu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsq23wp5eu5cryjues0dhwlptywxzxtuexrx9txffxns3rd7wkq88cpp4mhxue69uhkummn9ekx7mqvtuqk4&#39;&gt;nevent1q…uqk4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;GitHub readme isn’t bad. This video also gives a pretty full-featured view. &lt;a href=&#34;https://youtu.be/g8dQBSKIGyc?is=bb_W9SCLufBPqQOC&#34;&gt;https://youtu.be/g8dQBSKIGyc?is=bb_W9SCLufBPqQOC&lt;/a&gt;
    </content>
    <updated>2026-07-25T14:10:22Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsxwnf88zaukkhmu2sgnu0462eqkfneazkjxcav4n52mnj6qtg597qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6gf4s3</id>
    
      <title type="html">Lots of folks saying Fable is a planner and Opus is a workhorse. ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsxwnf88zaukkhmu2sgnu0462eqkfneazkjxcav4n52mnj6qtg597qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6gf4s3" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs07atxwjpcuwvlke4ae58tep2qqeszsjvvrl4grh6dc2yu7kwf2agpz3mhxue69uhhyetvv9ujuerpd46hxtnfduffra6l&#39;&gt;nevent1q…ra6l&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Lots of folks saying Fable is a planner and Opus is a workhorse. There’s gotta be some key difference I would think…
    </content>
    <updated>2026-07-25T14:08:36Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqstahwj98v8z2v35tj3dmx757cxkznqdp6cunm3y4z983tag00w6jczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpzju00</id>
    
      <title type="html">I found it hard to get a buzz relay started so I set up a repo to ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqstahwj98v8z2v35tj3dmx757cxkznqdp6cunm3y4z983tag00w6jczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpzju00" />
    <content type="html">
      I found it hard to get a buzz relay started so I set up a repo to do it quickly and easily. Quick path to self-hosting buzz instead of going hosted.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/armstrys/buzz-relay-thin&#34;&gt;https://github.com/armstrys/buzz-relay-thin&lt;/a&gt;
    </content>
    <updated>2026-07-25T07:27:15Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrvflczg2d50mwsh9s39mvv3ksdzm7gej27xhhhcq8a7sdwukkmtszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq9p309n</id>
    
      <title type="html">It’s possible you can use an existing nostr relay actually. I ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrvflczg2d50mwsh9s39mvv3ksdzm7gej27xhhhcq8a7sdwukkmtszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq9p309n" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvk5hus7k3t8t7nr0zxrkdhxfjy8sdww44qahm78vkwy50e0vaq7qpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgznm4g3&#39;&gt;nevent1q…m4g3&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;It’s possible you can use an existing nostr relay actually. I didn’t have one running already. &lt;br/&gt;&lt;br/&gt;It does look like my issue with the agents was being caused by an open issue for self hosted relays on Mac. &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/block/buzz/issues/2641&#34;&gt;https://github.com/block/buzz/issues/2641&lt;/a&gt;
    </content>
    <updated>2026-07-24T21:16:21Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs9jauhpgnsq6kpz0krnxc7ngg6ssf3ul7zjmc90jgzq4nez9nqtnszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqglalgq</id>
    
      <title type="html">Wild that DAMN. was almost a decade ago.</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs9jauhpgnsq6kpz0krnxc7ngg6ssf3ul7zjmc90jgzq4nez9nqtnszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqglalgq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqrkft5ftxsm6h9v6ncp3kg55pt8r3kr7tlmdqxt7dfvlsc7qktsspz3mhxue69uhhyetvv9ujuerpd46hxtnfduz8dyt4&#39;&gt;nevent1q…dyt4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Wild that DAMN. was almost a decade ago.
    </content>
    <updated>2026-07-24T16:37:26Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsyf7t4dwjzt6pw9hml3sz3xr4v8mpv6as5q67qxp8t3uadr0dszzqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqq3ttj7</id>
    
      <title type="html">FWIW, Claude did help me get the local relay running in docker by ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsyf7t4dwjzt6pw9hml3sz3xr4v8mpv6as5q67qxp8t3uadr0dszzqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqq3ttj7" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqspkrzt0ycd6ehagwqn9skvljpnv9a7zcxgs7539xe5wkmllaj8gkgpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgkt2shs&#39;&gt;nevent1q…2shs&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;FWIW, Claude did help me get the local relay running in docker by cloning the buzz repo. Having issues getting the Claude code harness to respond, but overall it is working! Does seem very cool. Would be great if you could bootstrap a relay from the UI
    </content>
    <updated>2026-07-24T16:35:44Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqspkrzt0ycd6ehagwqn9skvljpnv9a7zcxgs7539xe5wkmllaj8gkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0w4yvu</id>
    
      <title type="html">Okay thanks. I’ll dig a bit deeper. Testing on a work laptop so ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqspkrzt0ycd6ehagwqn9skvljpnv9a7zcxgs7539xe5wkmllaj8gkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0w4yvu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgthzpmr5fskxmthwxv9vggmqjdrz8x95lhqj5uqt87j0dru8496spp4mhxue69uhkummn9ekx7mqmh3qhm&#39;&gt;nevent1q…3qhm&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Okay thanks. I’ll dig a bit deeper. Testing on a work laptop so sensitive to outgoing connections. Primary onboarding doesn’t seem to have an option but maybe I just need to get under the hood
    </content>
    <updated>2026-07-24T14:42:53Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0vhspkyu5up4myc9h67stzlm2pc6slc75wnxghc44h6ynssf7amczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqyv354x</id>
    
      <title type="html">Was super excited about buzz because it read like the relay was ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0vhspkyu5up4myc9h67stzlm2pc6slc75wnxghc44h6ynssf7amczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqyv354x" />
    <content type="html">
      Was super excited about buzz because it read like the relay was self hosted by default but during set up it is asking for sign in to a hosted relay. Any way around this?
    </content>
    <updated>2026-07-24T14:31:29Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsz6aas34vtqcqqpj4qa789t79vzea7xkthtp5kqs3qtvl3hnnulsqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgrhhuj</id>
    
      <title type="html">I am just running a local searxng instance in docker and it works ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsz6aas34vtqcqqpj4qa789t79vzea7xkthtp5kqs3qtvl3hnnulsqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgrhhuj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszk43y0ptupr5y0vgycdek6kcde4cwvyxlcptl44mf5xe7mnscfjspz3mhxue69uhhyetvv9ujuerpd46hxtnfdu6dljv2&#39;&gt;nevent1q…ljv2&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I am just running a local searxng instance in docker and it works great. Some agents support natively, some I need to make a simple web search skill that teaches it how to query. &lt;br/&gt;&lt;br/&gt;You control the search endpoints and the infra. Agent can help you set it up.
    </content>
    <updated>2026-07-21T14:23:52Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqspemj8awtrya628jkz6alsxntu6ceh5fhpy75xwlz8ure5phfhwwgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvpz4ep</id>
    
      <title type="html">npx skills add https://github.com/JuliusBrussee/caveman --skill ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqspemj8awtrya628jkz6alsxntu6ceh5fhpy75xwlz8ure5phfhwwgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqvpz4ep" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqms7x40vu96svzsat7pn9zdzjppjw99lrn5p58ca7u2dy3plzscpp4mhxue69uhkummn9ekx7mq56ytdp&#39;&gt;nevent1q…ytdp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;npx skills add &lt;a href=&#34;https://github.com/JuliusBrussee/caveman&#34;&gt;https://github.com/JuliusBrussee/caveman&lt;/a&gt; --skill caveman
    </content>
    <updated>2026-07-14T13:10:00Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsqqms7x40vu96svzsat7pn9zdzjppjw99lrn5p58ca7u2dy3plzsczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqac5d6a</id>
    
      <title type="html">Have you tried the caveman skill?</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsqqms7x40vu96svzsat7pn9zdzjppjw99lrn5p58ca7u2dy3plzsczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqac5d6a" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqstfhpp62wjpzuy0n7mrhm45st0ngtkrcuv8l79rq6mm37y5h40ugspzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgjel87q&#39;&gt;nevent1q…l87q&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Have you tried the caveman skill?
    </content>
    <updated>2026-07-14T13:07:06Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0chl2wpqt4cypzq8hn2nyrxkwjt3atmazt0nvl0dlmq6cyyptx2czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqv6kgu0</id>
    
      <title type="html">We also learned a shit ton about what shouldn’t be done on ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0chl2wpqt4cypzq8hn2nyrxkwjt3atmazt0nvl0dlmq6cyyptx2czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqv6kgu0" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrp9rszyk0yzevhdj8ukvdvj0m5w5krcjaljzwrz52xw35du3fzzspp4mhxue69uhkummn9ekx7mqaajgnx&#39;&gt;nevent1q…jgnx&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;We also learned a shit ton about what shouldn’t be done on blockchain. They now get to fight a different battle with clearer context
    </content>
    <updated>2026-07-13T01:24:18Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsdj6eyct3576jsklna7z9sguf36rp0ct9qtg27s0hk8v3plsa88vczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqdk2z80</id>
    
      <title type="html">No it doesn’t it partners with a payment processor like visa to ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsdj6eyct3576jsklna7z9sguf36rp0ct9qtg27s0hk8v3plsa88vczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqdk2z80" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqspylakeljqvgwv2hd2sh6pg2swzm32t6dskx0s55k9p4egml85tlqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgr7ee83&#39;&gt;nevent1q…ee83&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;No it doesn’t it partners with a payment processor like visa to do that. Look at your debit cards.
    </content>
    <updated>2026-07-10T14:13:02Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsg3cqsh266clmzucgva2kaaqp79xtv28rxxrrkrnapehvj82pufmgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpspcys</id>
    
      <title type="html">Still unsure if helpful or if stupid. Agent skill that allows ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsg3cqsh266clmzucgva2kaaqp79xtv28rxxrrkrnapehvj82pufmgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqpspcys" />
    <content type="html">
      Still unsure if helpful or if stupid. Agent skill that allows docker deployments directly from a GitHub repo. Agent writes code. Human sets up infra. Automation deploys services.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/linksawakening/docker-git-deploy#how-it-works&#34;&gt;https://github.com/linksawakening/docker-git-deploy#how-it-works&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;1. **Install the skill.** The human asks the agent to install this skill.&lt;br/&gt;2. **State the goal.** The human asks the agent to deploy services X, Y, Z to a server.&lt;br/&gt;3. **Scope it.** The agent asks about the current server, explains the minimum requirements for install, and explains the git access involved — the **agent needs write** access to create and push the deployment repo, while the **server only needs read-only** access to pull it. Any Git host works (GitHub, GitLab, Bitbucket, self-hosted).&lt;br/&gt;4. **Create the deployment repo.** The agent generates a pure-config repo from the starter (compose files, service definitions, `.env.example`) and pushes it to the git remote.&lt;br/&gt;5. **Bootstrap the server.** The agent hands the human a one-line install command to run as root on the server; it clones the repo and installs the systemd timer. The agent also explains **which secrets and environment values each service needs** (derived from the repo&amp;#39;s `.env.example`) and **how to create the `.env`** on the host — e.g. `cp .env.example .env` and then fill in real values. The deploy is skipped until `.env` exists, and secrets never live in the repo. The agent helps troubleshoot but never needs access to the server  itself.&lt;br/&gt;6. **Ongoing adjustments and new services.** From then on, the human asks the  agent to add a service or change config, and the agent commits it to the repo and merges to `main` — from any location, with no server access. The server polls `origin/main` on its timer and applies the change automatically, reconciling with `docker compose up -d --wait` and rolling back if a new version fails to become healthy. The human&amp;#39;s **only** manual step is updating `.env` on the server — and only when the agent says a new or changed service needs a new secret.&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;/note157kgzaq0y35g0s3zrafhc0f8k0r4pll3vygf2msrym847hxnyf9qxacyzx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note157k…cyzx&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; New idea in testing:&lt;br/&gt;&lt;br/&gt;Agent skill that helps you set up a home lab docker deployment that periodically pulls its config from a git repo. &lt;br/&gt;&lt;br/&gt;Agent sets up framework and service configuration you review and production server pulls with no direct agent access. &lt;br/&gt;&lt;br/&gt;Want to add or configure new services? Make requests and edits on your local device and they deploy server side with minimal editing on server. &lt;br/&gt;&lt;br/&gt;Server stays lean and deployments are all version controlled. &lt;br/&gt;&lt;br/&gt;Will share code after more testing in action. &lt;/blockquote&gt;
    </content>
    <updated>2026-07-10T02:24:03Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrdtzupna4awkm98jtf4shf5qamvazu6nfuywrz4jn4ju067qsl8gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqte3pkn</id>
    
      <title type="html">Precisely! Just saying I think it’s the same with nostr (to an ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrdtzupna4awkm98jtf4shf5qamvazu6nfuywrz4jn4ju067qsl8gzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqte3pkn" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswh08etecq6hl7m5zx40266gkhs3nj5pvnudmc9f7gc7r8866g80spz3mhxue69uhhyetvv9ujuerpd46hxtnfdulh9dlc&#39;&gt;nevent1q…9dlc&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Precisely! Just saying I think it’s the same with nostr (to an extent)
    </content>
    <updated>2026-07-09T13:31:18Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrldgwujngzw9trg4l5r43rur7a2s9a4fvyc8ev0yfvkhflegsvxqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqx0ggcv</id>
    
      <title type="html">My guess is that they will burn hot and fade away. The only ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrldgwujngzw9trg4l5r43rur7a2s9a4fvyc8ev0yfvkhflegsvxqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqx0ggcv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsprtrjd9sewf30wraewuqh7rspdahvf5y8e243k3dc72w34fhexxcpz4mhxue69uhk2er9dchxummnw3ezumrpdejqznpd4e&#39;&gt;nevent1q…pd4e&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;My guess is that they will burn hot and fade away. The only question is where nostr sits when they burn out and leave some social scars. &lt;br/&gt;&lt;br/&gt;Glad we have folks like you contributing to the cause with the right intentions!
    </content>
    <updated>2026-07-09T05:30:50Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsytpjpm5w2hzmq88lq3mf5456h77kdqp037cghu05pu7tmrk0rcaczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq639nfc</id>
    
      <title type="html">I think the good news is that the foundation is right. Nostr is ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsytpjpm5w2hzmq88lq3mf5456h77kdqp037cghu05pu7tmrk0rcaczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq639nfc" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfp9zlp3rpwu36cyqvw6s8hzk7qcrecqtqz7lklggva95pw58trrcpz3mhxue69uhhyetvv9ujuerpd46hxtnfdur3wgph&#39;&gt;nevent1q…wgph&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I think the good news is that the foundation is right. Nostr is so modular and based on simple cryptographic primitives with such little consensus that the most decentralized and free version should always exist. &lt;br/&gt;&lt;br/&gt;At this point it seems inevitable that true decentralization and freedom comes at a cost that most folks won’t accept. My biggest hope is that we can at least make the decentralized and free options popular enough that the bigger, convenient platforms are effectively forced to be interoperable. The fun part is figuring out what levers we have to do that… maximizing numbers is a big part, but not the whole story - if the content is better or more diverse then other networks will be forced to adopt.
    </content>
    <updated>2026-07-09T05:04:08Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsgqr2c2vehl22x4t4uanmazgpslkv2vl35hcse783w7smta277h5czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqtr2zdx</id>
    
      <title type="html">The mathematically optimal solution is probably something like ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsgqr2c2vehl22x4t4uanmazgpslkv2vl35hcse783w7smta277h5czyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqtr2zdx" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsdl7mwukgf89lewyk8ty4208rxw3qqxstxu9v0crgssrwsd5daycqprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctvmq0a5u&#39;&gt;nevent1q…0a5u&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;The mathematically optimal solution is probably something like quadratic voting, but how do you actually implement that in a political system in practice. Interesting book about it called radical markets (trigger warning for anyone who spent time arguing with the ETH bros on the topic)
    </content>
    <updated>2026-07-09T04:54:12Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsysmqmr2k7ftpf3m9gap7clu2jxgmdjynac8670u8afrq72ntezmczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqg8q4f9</id>
    
      <title type="html">I’ll definitely be rooting for Morocco and Norway over others! ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsysmqmr2k7ftpf3m9gap7clu2jxgmdjynac8670u8afrq72ntezmczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqg8q4f9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrl29despdqypytd5c3pvzdhpycpuvuwuh853g53jgk002j88573gpp4mhxue69uhkummn9ekx7mqpxywas&#39;&gt;nevent1q…ywas&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I’ll definitely be rooting for Morocco and Norway over others! I think Morocco would feel the most refreshing even though Norway is a less common winner. Would like to see Morocco make it all the way after a decade of success
    </content>
    <updated>2026-07-09T04:43:10Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqszuv69dr20xukv7g057whep8xmn37ztvq3fslxz8f4lx8heeqejfszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqllt34g</id>
    
      <title type="html">Funny how many people use decentralized open source tools and ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqszuv69dr20xukv7g057whep8xmn37ztvq3fslxz8f4lx8heeqejfszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqllt34g" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2s4sk5ze3rutzyuxr455h7wp7a468faty5zx6ujvqhmu3l2lr7zqprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctvnf57ax&#39;&gt;nevent1q…57ax&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Funny how many people use decentralized open source tools and don’t realize that the developers have no product to sell. It’s open source….&lt;br/&gt;&lt;br/&gt;Terrible take.
    </content>
    <updated>2026-07-09T04:40:52Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs057pn3ssmerv4ms444ea4cwc48ujajktav4xl7g4c3sfykvrdrcqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqedalgw</id>
    
      <title type="html">Literally same metal failure most crypto bros made/make when ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs057pn3ssmerv4ms444ea4cwc48ujajktav4xl7g4c3sfykvrdrcqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqedalgw" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvhasdh3pwzn4p529l0dzfmcnle5drqeq8rwp66kpnehaz4kzq30gpz4mhxue69uhk2er9dchxummnw3ezumrpdejq5lddr0&#39;&gt;nevent1q…ddr0&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Literally same metal failure most crypto bros made/make when falling for VC-backed tokens over bitcoin. The whole point is that it’s simple, it’s cheap, and you don’t need crazy server farms to keep it running. When you fall into the trap of thinking faster/prettier is better without examining the cost you have lost the plot.
    </content>
    <updated>2026-07-09T04:37:35Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs20typws8jg6y8cg3p75mu85nm836sllckzyy4dcpjdn6ltnfjyjszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmu7pjk</id>
    
      <title type="html">New idea in testing: Agent skill that helps you set up a home lab ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs20typws8jg6y8cg3p75mu85nm836sllckzyy4dcpjdn6ltnfjyjszyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqmu7pjk" />
    <content type="html">
      New idea in testing:&lt;br/&gt;&lt;br/&gt;Agent skill that helps you set up a home lab docker deployment that periodically pulls its config from a git repo. &lt;br/&gt;&lt;br/&gt;Agent sets up framework and service configuration you review and production server pulls with no direct agent access. &lt;br/&gt;&lt;br/&gt;Want to add or configure new services? Make requests and edits on your local device and they deploy server side with minimal editing on server. &lt;br/&gt;&lt;br/&gt;Server stays lean and deployments are all version controlled. &lt;br/&gt;&lt;br/&gt;Will share code after more testing in action.
    </content>
    <updated>2026-07-09T03:44:09Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs2t0whknml4ew2esupp0yum3644eg34zfeq07vjvvt9w009pdvwwgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0dpuc9</id>
    
      <title type="html">1 T-shirt is in fact 1 T-shirt.</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs2t0whknml4ew2esupp0yum3644eg34zfeq07vjvvt9w009pdvwwgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq0dpuc9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszmza37upsr7za4tsc7p5cglq43v6jd94y65tc50gj58keysyaphcpp4mhxue69uhkummn9ekx7mq62t366&#39;&gt;nevent1q…t366&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;1 T-shirt is in fact 1 T-shirt.
    </content>
    <updated>2026-07-07T13:02:28Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0pyh657t9pkhjwjhfqvkl4tcd7vkmglkflzvrw64s9pd8n3v7hngzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzlgk4w</id>
    
      <title type="html">Fair. Like a true ‘Merican 🇺🇸</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0pyh657t9pkhjwjhfqvkl4tcd7vkmglkflzvrw64s9pd8n3v7hngzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqzlgk4w" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqqqyuesxtvd4hghwgjsx6veks6tgnsul6t5vrknhysvex5f6yvucprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctvk63fn3&#39;&gt;nevent1q…3fn3&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Fair. Like a true ‘Merican 🇺🇸
    </content>
    <updated>2026-07-07T03:58:45Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsrele82zc2rpgkql8ytzju2gtsv5tm64avr6gysyfxtqt42nz778qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6zl9e3</id>
    
      <title type="html">😂 let’s all at least root for being able to say something ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsrele82zc2rpgkql8ytzju2gtsv5tm64avr6gysyfxtqt42nz778qzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjq6zl9e3" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgj3dashpvj7mvsc84r0eweeqj5ktrgk5cnw50t465zhnadl2wn5gpzpmhxue69uhkummnw3ezuamfdejse4sce4&#39;&gt;nevent1q…sce4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;😂 let’s all at least root for being able to say something new like “Africa won”
    </content>
    <updated>2026-07-07T03:55:51Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqswgmgtd5eevzh99uxwkepml78tc77ecsxkhnn49hnxzwsuw48nhmgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgkpeav</id>
    
      <title type="html">Need pics of the finished product!</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqswgmgtd5eevzh99uxwkepml78tc77ecsxkhnn49hnxzwsuw48nhmgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqgkpeav" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsffvnzfvhm4hvcugwv0vyj33wz2zapznn6l4tq3keurhjys0xv39cpz3mhxue69uhhyetvv9ujuerpd46hxtnfdunc93lx&#39;&gt;nevent1q…93lx&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Need pics of the finished product!
    </content>
    <updated>2026-07-06T03:17:50Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsqrvtwq6kzr3zhvaqgamscjxzavmezez7c57sk29ju73m20txsrkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqw2wn8q</id>
    
      <title type="html">The open source tool set for running local agents has really ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsqrvtwq6kzr3zhvaqgamscjxzavmezez7c57sk29ju73m20txsrkgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqw2wn8q" />
    <content type="html">
      The open source tool set for running local agents has really improved. Setting up Hermes with access to tools like Hindsight has been a game changer. Also a great feedback loop in that the improved agent quality makes managing self-hosted tools easier and then makes the quality of the agent interaction stronger. Getting more fun by the day!
    </content>
    <updated>2026-07-05T19:49:22Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqstugej4p0h59wrp30p2f9z95sqaewn77x4vdugm4ufc2wxpjg6lsgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqlkeq4g</id>
    
      <title type="html">I mean I only saw from 80 on but Cape Verde kept that game close ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqstugej4p0h59wrp30p2f9z95sqaewn77x4vdugm4ufc2wxpjg6lsgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqlkeq4g" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsv24gdykejqc4tmnkqhw2pjtpw6a0tdg9lqtne75vya2ps04ymt0qpz3mhxue69uhhyetvv9ujuerpd46hxtnfdurey0cl&#39;&gt;nevent1q…y0cl&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I mean I only saw from 80 on but Cape Verde kept that game close and well played from then until 120. Almost put in an equalizer a couple of times. Hard to beat the excitement of the ending from games like Croatia/Portugal, but I think it delivered pretty consistently high quality soccer
    </content>
    <updated>2026-07-04T03:47:15Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqsgmuctgvcgqtl9p4cfjuenuh08x6ajr8lnwm3c6gmsjxpr78ztfhczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqsmjvje</id>
    
      <title type="html">This might have been the best game of the World Cup so far. ...</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqsgmuctgvcgqtl9p4cfjuenuh08x6ajr8lnwm3c6gmsjxpr78ztfhczyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqsmjvje" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsp6lk3txuejfm3tvfk8mg47v6v8n8xeduc9fjjgnvcn3ggm7fmjkswapa0g&#39;&gt;nevent1q…pa0g&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This might have been the best game of the World Cup so far. Incredible from Cape Verde!
    </content>
    <updated>2026-07-04T00:51:04Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqs0y3uurhkrdtty5503x99x29ckz0wgq6caxj926dshp3zjvmse8hqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqdq5pmw</id>
    
      <title type="html">I’ve used both and Hermes definitely felt much more stable</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqs0y3uurhkrdtty5503x99x29ckz0wgq6caxj926dshp3zjvmse8hqzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqdq5pmw" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2hy2jcqhl0fz4mquqrzkcd8dl8mt7qsnx3rr0re2fg7u29fy5tsspz3mhxue69uhhyetvv9ujuerpd46hxtnfdumlm2sr&#39;&gt;nevent1q…m2sr&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I’ve used both and Hermes definitely felt much more stable
    </content>
    <updated>2026-06-29T16:49:58Z</updated>
  </entry>

  <entry>
    <id>https://njump.cloud.vinney.xyz/nevent1qqspcsllyc2zre0k9ntl6l60j6x5w32jq0vlxkxvwew37d7506gylhgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqwqun6</id>
    
      <title type="html">🫡</title>
    
    <link rel="alternate" href="https://njump.cloud.vinney.xyz/nevent1qqspcsllyc2zre0k9ntl6l60j6x5w32jq0vlxkxvwew37d7506gylhgzyryqk5jgl0508y4u8wj9py0mfehzkkrj8pmqr0us75ueydntxrtjqqwqun6" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsd5xt072gql0dslg380gc2w578fqqrscdgsqgg2zqk6adrurdh4qqprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctvvkpe9g&#39;&gt;nevent1q…pe9g&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;🫡
    </content>
    <updated>2026-06-28T23:37:08Z</updated>
  </entry>

</feed>