<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Melvin Carvalho</title>
    <description>The latest articles on DEV Community by Melvin Carvalho (@melvincarvalho).</description>
    <link>https://dev.to/melvincarvalho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F448014%2F8c938ffb-fe97-4763-a32c-acb329fb32d1.jpg</url>
      <title>DEV Community: Melvin Carvalho</title>
      <link>https://dev.to/melvincarvalho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/melvincarvalho"/>
    <language>en</language>
    <item>
      <title>The Web's Missing Piece: How DID-Nostr Quietly Solves Social Portability</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Thu, 28 Aug 2025 09:13:13 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/the-webs-missing-piece-how-did-nostr-quietly-solves-social-portability-1bg</link>
      <guid>https://dev.to/melvincarvalho/the-webs-missing-piece-how-did-nostr-quietly-solves-social-portability-1bg</guid>
      <description>&lt;p&gt;&lt;em&gt;After decades of platform lock-in, the first truly portable social graph standard has arrived. It's simpler than you might expect—and more important than it first appears.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Facebook Lesson We Forgot
&lt;/h2&gt;

&lt;p&gt;Facebook's original genius wasn't the blue interface or the poke button. It was recognizing that &lt;strong&gt;social graphs are infrastructure&lt;/strong&gt;—and the most valuable applications are built on top of that infrastructure.&lt;/p&gt;

&lt;p&gt;Facebook started with university email directories and social networks that already existed. They digitized and centralized those relationships, then created an ecosystem where third-party developers could build on that social foundation. The result was extraordinary: social games that generated billions in revenue, payment systems that worked because they understood relationships, targeted advertising that leveraged social context, and recommendation engines that knew who you trusted.&lt;/p&gt;

&lt;p&gt;The entire social web economy emerged from applications built on Facebook's social graph API.&lt;/p&gt;

&lt;p&gt;But then Facebook closed the ecosystem. The API became restricted, then neutered, then largely eliminated. The social graph that had enabled so much innovation became a proprietary asset, locked away behind corporate walls.&lt;/p&gt;

&lt;p&gt;For the first time since Facebook's early days, we have something similar: an open social graph that scales with adoption. Except this time, &lt;strong&gt;no one can close it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem We've Normalized
&lt;/h2&gt;

&lt;p&gt;Your Twitter followers can't follow you to LinkedIn. Your Instagram connections don't transfer to TikTok. Your professional network on one platform stays trapped there forever.&lt;/p&gt;

&lt;p&gt;This isn't a technical limitation—it's a business model. Social platforms create value by making it costly to leave. Your social graph becomes a kind of digital mortgage, binding you to platforms long after they've stopped serving your interests.&lt;/p&gt;

&lt;p&gt;We've accepted this as inevitable. But what if the fundamental assumption is wrong?&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is DID-Nostr?
&lt;/h2&gt;

&lt;p&gt;DID-Nostr is a W3C specification that bridges two technologies: Decentralized Identifiers (DIDs) and the Nostr protocol. At its core, it does something deceptively simple: it makes your social connections part of your identity, not part of any platform.&lt;/p&gt;

&lt;p&gt;Here's what a DID-Nostr identity looks like:&lt;/p&gt;

&lt;p&gt;Identity: &lt;code&gt;did:nostr:124c0fa99407182ece5a24fad9b7f6674902fc422843d3128d38a0afbee0fdd2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Profile: &lt;a href="https://alice.com/.well-known/did/nostr/124c0fa9" rel="noopener noreferrer"&gt;https://alice.com/.well-known/did/nostr/124c0fa9&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;Social Graph: Built into the identity document itself&lt;/p&gt;

&lt;p&gt;Your social connections become as portable as your email address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Native Nostr: Why Standards Matter
&lt;/h2&gt;

&lt;p&gt;Nostr users might wonder: "We already have portable identities and social graphs. What does DID-Nostr add?"&lt;/p&gt;

&lt;p&gt;The answer lies in &lt;strong&gt;scale and interoperability beyond relay networks&lt;/strong&gt;. While Nostr creates portable social relationships within its ecosystem, DID-Nostr transforms those relationships into web infrastructure that scales horizontally across every technology stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beyond Relay Dependencies&lt;/strong&gt;: DID documents can be served from traditional web servers, CDNs, IPFS, or any HTTP endpoint. Your social graph doesn't depend on relay uptime or relay discovery. It works with the same caching, load balancing, and global distribution infrastructure that serves the modern web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infinite Scale Through Web Infrastructure&lt;/strong&gt;: Instead of querying multiple relays and aggregating responses, applications make single HTTP requests to cached endpoints. This transforms social graph discovery from an expensive, real-time operation into a fast, cacheable web request. The same infrastructure that serves billions of web pages can now serve billions of social relationships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Universal Interoperability&lt;/strong&gt;: Any application can use your social graph without running Nostr clients or managing WebSocket connections. Traditional web apps can offer social features through standard HTTP APIs. Your social graph works with &lt;strong&gt;anything that speaks HTTP&lt;/strong&gt;—which is everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ecosystem That Becomes Possible
&lt;/h2&gt;

&lt;p&gt;Remember what developers built on Facebook's social graph before it was locked down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Games&lt;/strong&gt;: FarmVille, Mafia Wars, and thousands of others that generated billions by leveraging friend networks for gameplay, competition, and viral growth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Commerce&lt;/strong&gt;: Applications that used trust relationships to enable peer-to-peer transactions, group buying, and social proof for purchases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Discovery&lt;/strong&gt;: Recommendation engines that surfaced content based on what your friends shared, liked, and engaged with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Login&lt;/strong&gt;: Universal authentication that worked across thousands of websites by leveraging Facebook's identity platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Targeted Services&lt;/strong&gt;: Applications that could offer personalized experiences by understanding your social context and relationship patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group Coordination&lt;/strong&gt;: Tools for organizing events, managing communities, and facilitating group decisions based on real social relationships.&lt;/p&gt;

&lt;p&gt;Now imagine all of that—but &lt;strong&gt;decentralized, open, and resistent to shut down&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decentralized Social Games&lt;/strong&gt;: Games that use your portable social graph for multiplayer experiences, leaderboards, and viral mechanics—without depending on any single platform or risking account suspension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peer-to-Peer Payments&lt;/strong&gt;: Payment systems that leverage cryptographically-verified social relationships for trust, reputation, and fraud prevention—without corporate intermediaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Social Commerce&lt;/strong&gt;: Marketplaces and commerce applications that can bootstrap with existing social proof and trust relationships from day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Universal Social Login&lt;/strong&gt;: Authentication that works across all applications and platforms, controlled by users rather than corporations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decentralized Content Networks&lt;/strong&gt;: Recommendation systems that operate across multiple platforms, using your social graph to surface relevant content wherever you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous Social Coordination&lt;/strong&gt;: DAOs and governance systems that can verify real social relationships and prevent Sybil attacks using portable social proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Innovation
&lt;/h2&gt;

&lt;p&gt;DID-Nostr introduces something genuinely new: &lt;strong&gt;social relationships as first-class identity data&lt;/strong&gt;. When you follow someone, that relationship becomes part of your cryptographically-signed identity document, discoverable through standard web protocols.&lt;/p&gt;

&lt;p&gt;The specification defines three resolution methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Resolution&lt;/strong&gt;: Standard web requests to &lt;code&gt;.well-known&lt;/code&gt; endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Resolution&lt;/strong&gt;: Full identity reconstruction from just a public key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Resolution&lt;/strong&gt;: Rich social data from distributed networks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn't just another API—it's infrastructure. Any application, anywhere, can resolve social relationships using the same standard protocols that serve web pages.&lt;/p&gt;

&lt;p&gt;The key insight: by making social graphs &lt;strong&gt;web-native rather than protocol-native&lt;/strong&gt;, they can leverage decades of web scaling innovation while maintaining complete decentralization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Local-First Revolution
&lt;/h2&gt;

&lt;p&gt;DID-Nostr aligns perfectly with the emerging local-first software movement. Your identity document can be generated entirely offline. Your social relationships can be verified cryptographically without server dependencies. Your applications can work fully disconnected, syncing only when connectivity is available and desired.&lt;/p&gt;

&lt;p&gt;This enables entirely new categories of social applications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline Social Games&lt;/strong&gt;: Multiplayer experiences that work without internet connectivity, using cryptographically-verified friend lists for local network play.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Social Commerce&lt;/strong&gt;: Peer-to-peer marketplaces that can verify trust relationships without revealing your social graph to servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resilient Social Infrastructure&lt;/strong&gt;: Applications that continue working during network outages, internet censorship, or platform shutdowns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Social Computation&lt;/strong&gt;: Social algorithms and recommendations that run entirely on-device, using cryptographically-verified relationship data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Portable Social Graphs Matter
&lt;/h2&gt;

&lt;p&gt;Consider the network effects. Today's social platforms grow by capturing and isolating social graphs. Tomorrow's applications could grow by making social graphs more valuable as they become more widely accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For users&lt;/strong&gt;: Your social connections follow you across applications. Build your network once, use it everywhere—not just in Nostr clients, but in games, commerce apps, content platforms, and technologies that don't exist yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For developers&lt;/strong&gt;: No need to build user acquisition from scratch or integrate with specific platforms. Applications can bootstrap with existing social relationships using familiar HTTP APIs that work with any backend technology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the ecosystem&lt;/strong&gt;: Social data becomes public infrastructure rather than proprietary assets—enabling the same kind of innovation explosion that Facebook's early API created, but without the risk of platform capture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Applications
&lt;/h2&gt;

&lt;p&gt;The implications become clear when you consider what developers can build:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Gaming Platforms&lt;/strong&gt;: Games that can access your friend network from day one, creating instant multiplayer experiences and viral growth loops without platform dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decentralized Social Commerce&lt;/strong&gt;: Marketplaces that use your social proof and trust relationships to enable peer-to-peer transactions with built-in reputation systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Platform Content Networks&lt;/strong&gt;: Applications that can recommend content, facilitate discussions, and build communities using your existing social context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Coordination Tools&lt;/strong&gt;: Governance platforms, event organizing tools, and decision-making applications that leverage real social relationships for better outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Universal Social Authentication&lt;/strong&gt;: Login systems that work across all applications while giving users complete control over their identity and relationships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social Financial Services&lt;/strong&gt;: Lending platforms, group payment systems, and financial coordination tools that use social trust rather than traditional credit scores.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Context
&lt;/h2&gt;

&lt;p&gt;This fits into a larger pattern of infrastructure becoming more portable. Email separated messaging from providers. RSS separated content from platforms. OAuth separated authentication from applications.&lt;/p&gt;

&lt;p&gt;DID-Nostr separates social graphs from platforms—and makes them accessible to any web technology, enabling the same kind of ecosystem innovation that Facebook's early API created.&lt;/p&gt;

&lt;p&gt;But it goes further. By making social graphs web-native and cryptographically verifiable, it enables applications that Facebook never could: truly peer-to-peer social experiences that work offline and can't be shut down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Limitations
&lt;/h2&gt;

&lt;p&gt;The specification is early-stage infrastructure. Real adoption requires solving practical challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer adoption&lt;/strong&gt;: Can the ecosystem attract the builders needed to create compelling applications?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience&lt;/strong&gt;: Making cryptographic identity as simple as existing social login&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy controls&lt;/strong&gt;: Balancing openness with selective sharing across different platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage infrastructure&lt;/strong&gt;: Reliable hosting for identity documents at web scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't fundamental barriers, but they require continued development and real-world testing across different technical environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changes
&lt;/h2&gt;

&lt;p&gt;The most significant impact may be the most subtle: application developers can now assume that social relationship data exists independently of any particular platform, and they can build on that foundation without fear of the API being shut down.&lt;/p&gt;

&lt;p&gt;This assumption changes what becomes worth building. When social graphs are permanent public infrastructure rather than temporary proprietary assets, different kinds of applications become viable. When that infrastructure works offline-first and scales like the web, entirely new categories of social software become possible.&lt;/p&gt;

&lt;p&gt;We're not just talking about better social networks. We're talking about social data as public infrastructure—like DNS or email protocols—that enables an entire ecosystem of applications and services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;Social portability sounds like a small technical improvement. In practice, it might enable the same kind of innovation explosion that Facebook's social graph API created in the late 2000s—except this time, no one can turn off the API.&lt;/p&gt;

&lt;p&gt;When email became portable across providers, it enabled decades of innovation in messaging and communication. When domains became portable across hosting providers, it enabled the modern web. When Facebook opened their social graph API, it enabled social games, social commerce, and the modern social web economy.&lt;/p&gt;

&lt;p&gt;Portable, web-native, cryptographically-verified social graphs could enable something even bigger: a truly open social economy that no single entity controls.&lt;/p&gt;

&lt;p&gt;The tools exist now. The question is what we'll build with them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;DID-Nostr v0.0.7 is available at &lt;a href="https://nostrcg.github.io/did-nostr/" rel="noopener noreferrer"&gt;nostrcg.github.io/did-nostr&lt;/a&gt;. The specification is developed by the &lt;a href="https://www.w3.org/community/nostr/" rel="noopener noreferrer"&gt;W3C Nostr Community Group&lt;/a&gt;, an open standards organization.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>didnostr</category>
      <category>did</category>
      <category>nostr</category>
      <category>decentralized</category>
    </item>
    <item>
      <title>Blocktrails: Smart-Contract Functionality - On Bitcoin, No Extra Token Needed</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:51:00 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/blocktrails-smart-contract-functionality-on-bitcoin-no-extra-token-needed-amm</link>
      <guid>https://dev.to/melvincarvalho/blocktrails-smart-contract-functionality-on-bitcoin-no-extra-token-needed-amm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Picture a relay-race baton hurtling around a track.&lt;br&gt;
Before each hand-off the runner stamps the baton with today’s secret code, then sprints ahead.&lt;br&gt;
Every swap is signed, time-stamped, and etched into Bitcoin forever—so anyone can replay the entire race and verify there was never a duplicate baton.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That baton is a &lt;strong&gt;Blocktrail&lt;/strong&gt;. It gives you contract-grade state changes, provable settlement, and full auditability—powered solely by Bitcoin, no new chain or side token in sight.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🏷️  What’s a Blocktrail?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Blocktrail&lt;/strong&gt; is a tiny, self-contained ledger riding inside Bitcoin’s main ledger.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state₀ —sha256→ tweak₀   (GENESIS UTXO)
          spend → state₁ —sha256→ tweak₁   (UTXO₁)
          spend → state₂ —sha256→ tweak₂   (UTXO₂)
          ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One live output&lt;/strong&gt; at a time—Bitcoin’s double-spend rule enforces the sequence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHA-256 of your app’s state&lt;/strong&gt; (a Git commit, JSON blob, DAG root—anything hashable) becomes the Taproot tweak for the next output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whole history on-chain:&lt;/strong&gt; fetch the tweaks, re-hash the snapshots, and you can replay every step without trusting anyone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; all the “why” and “when” of a smart contract, with nothing but ordinary transactions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩  Think “Git Commits on Bitcoin”
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Genesis:&lt;/strong&gt; create &lt;code&gt;state₀&lt;/code&gt;, hash it, anchor it as the &lt;strong&gt;GENESIS&lt;/strong&gt; transaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next commit:&lt;/strong&gt; update your data → &lt;code&gt;state₁&lt;/code&gt;, hash again, tweak again, spend GENESIS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat:&lt;/strong&gt; the latest UTXO is your repo HEAD; the chain of tweaks is the commit log.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No forks:&lt;/strong&gt; Bitcoin consensus permits only one spend of the live UTXO—linear history guaranteed.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔧  Blocktrail in (Pseudo) JavaScript
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Functions like &lt;code&gt;createGenesisUTXO&lt;/code&gt;, &lt;code&gt;spendUTXO&lt;/code&gt;, and &lt;code&gt;auditChain&lt;/code&gt; are &lt;strong&gt;illustrative&lt;/strong&gt;.&lt;br&gt;
A real &lt;strong&gt;blocktrails-js&lt;/strong&gt; library is the very next milestone.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// keypair controls the trail (can double as Nostr pubkey)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trailKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateKeypair&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;     &lt;span class="c1"&gt;// { priv, pub }&lt;/span&gt;

&lt;span class="c1"&gt;// helper: hash any client-side state object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// 1. GENESIS&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;genesis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createGenesisUTXO&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trailKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;546&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// sats&lt;/span&gt;
  &lt;span class="na"&gt;tweak&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nf"&gt;hashState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// hash of state₀&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GENESIS:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;genesis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. first update → UTXO₁&lt;/span&gt;
&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;utxo1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spendUTXO&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="nx"&gt;genesis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;privkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trailKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;// minus fee&lt;/span&gt;
  &lt;span class="na"&gt;tweak&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;hashState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// hash of state₁&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UTXO₁:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;utxo1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. another update → UTXO₂&lt;/span&gt;
&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;utxo2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spendUTXO&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="nx"&gt;utxo1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;privkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trailKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tweak&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;hashState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;// hash of state₂&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UTXO₂:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;utxo2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 4. audit anytime&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;auditChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;utxo2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outpoint&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outpoint&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏗️  Why You Might Care
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Blocktrail Delivers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Smart-contract enforcement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only one valid next state—no VM required.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Double-spend safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bitcoin consensus blocks competing branches.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tamper-proof history&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Each state hash is burned into the chain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rebuild state locally, match hashes, verify every step.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero extra infra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Just Bitcoin transactions. No gas, no databases.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪  What Can You Build?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔄 &lt;strong&gt;Supply-chain docs&lt;/strong&gt; — every warehouse hashes its manifest, tweaks, spends, passes on.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;One-person-one-vote&lt;/strong&gt; — ballot UTXO’s tweak is &lt;code&gt;sha256(choice)&lt;/code&gt;, binding voter intent to a single spend.&lt;/li&gt;
&lt;li&gt;🎮 &lt;strong&gt;Game quests&lt;/strong&gt; — quest token’s tweak is &lt;code&gt;sha256(save-game)&lt;/code&gt;, so progress is provably unique.&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Prediction markets&lt;/strong&gt; — each market state (order book, odds, settlement) hashes into the next tweak; payouts are locked to the final on-chain hash.&lt;/li&gt;
&lt;li&gt;🧾 &lt;strong&gt;Regulator-grade receipts&lt;/strong&gt; — hash your PDF invoice, tweak, create an immutable audit link.&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Social attestations via Nostr&lt;/strong&gt; — hash a Nostr event (or thread root), tweak it into the next Blocktrail output, and anchor every reply or edit to Bitcoin—giving posts, likes, or channel memberships an immutable, on-chain audit path while the conversation itself stays lightweight and off-chain.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔭  Next Up: &lt;code&gt;blocktrails-js&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;We’re drafting an open-source JavaScript SDK that will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap Bitcoin Core or external signers (Ledger, Trezor, WebLN).&lt;/li&gt;
&lt;li&gt;Provide simple helpers: &lt;code&gt;createGenesisUTXO&lt;/code&gt;, &lt;code&gt;spendUTXO&lt;/code&gt;, &lt;code&gt;auditChain&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ship with wallet components that surface “current tip” and commit hashes at a glance.&lt;/li&gt;
&lt;li&gt;Offer explorer overlays that draw Blocktrails as subway lines on mempool graphs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The library is the next mile on this trail—stay tuned.&lt;/p&gt;




&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;Blocktrails link Bitcoin outputs with Taproot tweaks that are &lt;strong&gt;SHA-256 hashes of your app’s state&lt;/strong&gt;.&lt;br&gt;
Start with a GENESIS output, hash-tweak each new state, spend once, and keep moving.&lt;br&gt;
You get smart-contract guarantees—deterministic execution, audit, provable settlement—with nothing but lean, ordinary Bitcoin transactions.&lt;/p&gt;

</description>
      <category>blocktrails</category>
      <category>bitcoin</category>
      <category>smartcontract</category>
      <category>nostr</category>
    </item>
    <item>
      <title>🕶️ Introducing Shade: Taproot-Based Messaging in the Post-Surveillance Web</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Wed, 28 May 2025 14:10:56 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/introducing-shade-taproot-based-messaging-in-the-post-surveillance-web-hch</link>
      <guid>https://dev.to/melvincarvalho/introducing-shade-taproot-based-messaging-in-the-post-surveillance-web-hch</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Freedom of speech requires freedom of whisper.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We live in an era of networked everything — and surveillance of everything. Even the most "encrypted" messengers leak metadata, rely on centralized servers, or fall back on federated infrastructures with brittle assumptions.&lt;/p&gt;

&lt;p&gt;It's time for something simpler, leaner, and more aligned with Bitcoin’s core ethos: &lt;strong&gt;Shade&lt;/strong&gt;, a secure messaging client built on &lt;a href="https://bitcoinops.org/en/topics/taproot/" rel="noopener noreferrer"&gt;Taproot&lt;/a&gt;, &lt;a href="https://nosdav.com" rel="noopener noreferrer"&gt;NosDAV&lt;/a&gt;, and strong cryptography.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 Why Shade?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shade&lt;/strong&gt; is a new kind of secure messaging tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No central servers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No global inboxes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No dependence on “NIPs” or federated relays&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Just &lt;strong&gt;you, your Taproot key&lt;/strong&gt;, and encrypted blobs shared via NosDAV.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're a developer, a privacy advocate, or someone who just wants to chat without compromise — Shade is for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 How It Works
&lt;/h2&gt;

&lt;p&gt;Shade uses &lt;strong&gt;Taproot public keys&lt;/strong&gt; as identity anchors. Each user owns a Bitcoin-native keypair — the same ones used for signing transactions can be used for messaging.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Identity and Encryption
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your Taproot key = your identity&lt;/li&gt;
&lt;li&gt;Messages encrypted with &lt;strong&gt;Double Ratchet&lt;/strong&gt; (like Signal)&lt;/li&gt;
&lt;li&gt;Files and messages stored encrypted with &lt;strong&gt;AEAD (XChaCha20-Poly1305)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ☁️ Storage: NosDAV
&lt;/h3&gt;

&lt;p&gt;NosDAV is a lightweight, Nostr-authenticated file storage protocol. Shade uses it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store encrypted message blobs&lt;/li&gt;
&lt;li&gt;Retrieve messages privately&lt;/li&gt;
&lt;li&gt;Avoid centralized relays or server-side logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Messages are stored like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /&amp;lt;receiver-pubkey&amp;gt;/shade/&amp;lt;obfuscated-hash&amp;gt;.msg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All messages are encrypted and path-obfuscated via HMAC.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔎 Metadata Resistance
&lt;/h2&gt;

&lt;p&gt;One of the biggest privacy failures in modern messengers isn’t encryption — it’s metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who are you talking to?&lt;/li&gt;
&lt;li&gt;When?&lt;/li&gt;
&lt;li&gt;How often?&lt;/li&gt;
&lt;li&gt;From what IP?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shade counters that&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Leak&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Message content&lt;/td&gt;
&lt;td&gt;Encrypted end-to-end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sender/receiver&lt;/td&gt;
&lt;td&gt;Public keys only, no usernames&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timestamps&lt;/td&gt;
&lt;td&gt;Padded, delayed, optionally batched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subject lines&lt;/td&gt;
&lt;td&gt;Not used — messages are opaque blobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport logs&lt;/td&gt;
&lt;td&gt;NosDAV can be self-hosted or Tor-routed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can even use a different Taproot key per contact, or per session.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ The Developer Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;Bitcoin Taproot keypairs (X-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;Double Ratchet + XChaCha20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;NosDAV (HTTP + Nostr Auth)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;Preact + HTM (Web), Electron (Desktop), Capacitor (Mobile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Node.js prototype in progress&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧪 Sample CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Send a message&lt;/span&gt;
shade send &lt;span class="nt"&gt;--to&lt;/span&gt; npub1... &lt;span class="nt"&gt;--file&lt;/span&gt; message.txt

&lt;span class="c"&gt;# Fetch new messages&lt;/span&gt;
shade fetch

&lt;span class="c"&gt;# Start background sync&lt;/span&gt;
shade daemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌍 Platform Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Web (PWA)&lt;/li&gt;
&lt;li&gt;✅ Linux, macOS, Windows&lt;/li&gt;
&lt;li&gt;⏳ Android + iOS&lt;/li&gt;
&lt;li&gt;✅ Fully local-first, syncs when you choose&lt;/li&gt;
&lt;li&gt;✅ No accounts. No phone numbers. Just keys.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why Not Nostr DMs?
&lt;/h2&gt;

&lt;p&gt;Nostr DMs are clever but face major drawbacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metadata-heavy (global relays can see everything)&lt;/li&gt;
&lt;li&gt;Lack of forward secrecy&lt;/li&gt;
&lt;li&gt;No message expiration or secure deletion&lt;/li&gt;
&lt;li&gt;Centralized relay behavior incentivizes spam filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shade fixes this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving message delivery to your own encrypted storage&lt;/li&gt;
&lt;li&gt;Using modern crypto&lt;/li&gt;
&lt;li&gt;Putting you in full control&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Threadlocks: One-Time Commitments with Bitcoin and Nostr</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Sun, 18 May 2025 09:14:36 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/threadlocks-one-time-commitments-with-bitcoin-and-nostr-4803</link>
      <guid>https://dev.to/melvincarvalho/threadlocks-one-time-commitments-with-bitcoin-and-nostr-4803</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What if you could make a promise, cryptographically bind it to Bitcoin, and close it forever with one action — all while broadcasting its intent through Nostr?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Welcome to &lt;strong&gt;Threadlocks&lt;/strong&gt; — a new pattern for time-boxed commitments that live at the intersection of Bitcoin and decentralized social protocols.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⛓️ The Problem with Open-Ended State
&lt;/h2&gt;

&lt;p&gt;Distributed systems struggle with consensus over time and state. You want to make a claim — or a promise — and prove it happened. But you don’t want to bloat a blockchain. And you don’t want to trust a centralized party. You just want a &lt;strong&gt;one-time, cryptographically verifiable commitment&lt;/strong&gt;, and a public record that it occurred.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Introducing Threadlocks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Threadlocks&lt;/strong&gt; are a minimal, composable mechanism for one-time commitments. Inspired by the idea of &lt;em&gt;single-use seals&lt;/em&gt;, Threadlocks build on native Bitcoin primitives (like Taproot key tweaking) and pair beautifully with &lt;strong&gt;Nostr&lt;/strong&gt;, the decentralized event-based protocol.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧵 What’s a Threadlock?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Threadlock&lt;/strong&gt; is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time-boxed&lt;/strong&gt;: It exists only until it’s used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-use&lt;/strong&gt;: Once closed, it can never be reopened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographically anchored&lt;/strong&gt;: It's tied to a Bitcoin UTXO or Taproot tweak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narratively threaded&lt;/strong&gt;: Nostr events document, declare, and extend Threadlocks in social or application logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like a fuse you can light once — but visible forever in the chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 How Threadlocks Work (In Plain Terms)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Lock the Thread&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You create a &lt;strong&gt;commitment point&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usually a Bitcoin UTXO.&lt;/li&gt;
&lt;li&gt;Or better yet, a tweaked Taproot pubkey derived from a base key and a secret (your claim hash, a nonce, or logic payload).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This UTXO becomes your &lt;strong&gt;Threadlock&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Declare the Thread&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You post a Nostr event with a special &lt;code&gt;t&lt;/code&gt; tag or &lt;code&gt;threadlock&lt;/code&gt; tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;xxxx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I claim access to channel #xyz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"txo:chain:txid:vout"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This announces your intent and binds it to a specific Bitcoin output.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Resolve the Lock&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Later, you &lt;strong&gt;spend&lt;/strong&gt; that UTXO in a Bitcoin transaction, embedding the commitment proof in witness data, an OP_RETURN, or via script logic.&lt;/p&gt;

&lt;p&gt;Once spent, that output is &lt;strong&gt;forever closed&lt;/strong&gt; — your Threadlock is done.&lt;/p&gt;




&lt;h2&gt;
  
  
  📜 Why Not Just Use Smart Contracts?
&lt;/h2&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t need a VM or gas fees.&lt;/li&gt;
&lt;li&gt;You don’t need global consensus on execution.&lt;/li&gt;
&lt;li&gt;You don’t want to publish logic on-chain.&lt;/li&gt;
&lt;li&gt;You just want a &lt;strong&gt;provable state transition&lt;/strong&gt;: once, verifiably.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Threadlocks are the &lt;em&gt;"less is more"&lt;/em&gt; of crypto commitments.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 What Nostr Brings to the Table
&lt;/h2&gt;

&lt;p&gt;Nostr gives Threadlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Event sequencing&lt;/strong&gt; (via &lt;code&gt;created_at&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threaded logic&lt;/strong&gt; (&lt;code&gt;e&lt;/code&gt; tags / reply chains)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lightweight announcements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social context&lt;/strong&gt; for commitments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Threadlocks can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Referenced by future events&lt;/li&gt;
&lt;li&gt;Forked into multiple branches&lt;/li&gt;
&lt;li&gt;Validated by others watching for specific closure conditions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Use Cases
&lt;/h2&gt;

&lt;p&gt;Threadlocks enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;One-time claims&lt;/strong&gt; ("I minted this", "I voted")&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Access control&lt;/strong&gt; (only those with unspent Threadlocks can act)&lt;/li&gt;
&lt;li&gt;🗳️ &lt;strong&gt;DAO governance&lt;/strong&gt; (commit → vote → finalize)&lt;/li&gt;
&lt;li&gt;🎮 &lt;strong&gt;Game state progression&lt;/strong&gt; (quests, puzzles, unlocks)&lt;/li&gt;
&lt;li&gt;🧾 &lt;strong&gt;Credential issuance&lt;/strong&gt; (proof of training, rights, NFTs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without smart contracts. Just Bitcoin + Nostr.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Future: Libraries, NIPs, Agents
&lt;/h2&gt;

&lt;p&gt;We're working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;lightweight JavaScript library&lt;/strong&gt; for managing Threadlocks&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;NIP proposal&lt;/strong&gt; for a standardized &lt;code&gt;threadlock&lt;/code&gt; tag&lt;/li&gt;
&lt;li&gt;Autonomous agents that monitor and act on Threadlock resolution&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nostr</category>
      <category>bitcoin</category>
      <category>smartcontracts</category>
    </item>
    <item>
      <title>What Does `did-nostr` Do?</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Wed, 02 Apr 2025 08:07:50 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/what-does-did-nostr-do-2o68</link>
      <guid>https://dev.to/melvincarvalho/what-does-did-nostr-do-2o68</guid>
      <description>&lt;h2&gt;
  
  
  🧭 What Does &lt;code&gt;did-nostr&lt;/code&gt; Do?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;did-nostr&lt;/code&gt; is a &lt;a href="https://www.w3.org/TR/did-core/" rel="noopener noreferrer"&gt;DID method&lt;/a&gt; that brings &lt;strong&gt;decentralized identity&lt;/strong&gt; to Nostr. It lets you attach useful metadata and service endpoints to your Nostr public key, turning it into a &lt;strong&gt;portable identity hub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of just being a key that signs events, your Nostr pubkey becomes a &lt;strong&gt;rich identifier&lt;/strong&gt; that can point to relays, profiles, storage, Bitcoin wallets, and much more.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Example: Basic &lt;code&gt;did-nostr&lt;/code&gt; Document
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.w3.org/ns/did/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://w3id.org/nostr/context"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:124c0fa99407182ece5a24fad9b7f6674902fc422843d3128d38a0afbee0fdd2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"verificationMethod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#key1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SchnorrVerification2023"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"controller"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:124c0fa99407182ece5a24fad9b7f6674902fc422843d3128d38a0afbee0fdd2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"publicKeyBase16"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"124c0fa99407182ece5a24fad9b7f6674902fc422843d3128d38a0afbee0fdd2"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"authentication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"#key1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assertionMethod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"#key1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#relay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Relay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"wss://relay.nostr.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"wss://nostr-pub.wellorder.net"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your.site/profile.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#storage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DecentralizedStorage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://storage.example.com/alice/"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#inbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Messaging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://inbox.example.org/alice"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#vc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VerifiableCredentialService"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vc.example.com/submit"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#wallet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BitcoinTaprootAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bc1p...yourTaprootAddress"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 What Kind of Services Can You Attach?
&lt;/h2&gt;

&lt;p&gt;Here are just a few possibilities:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔌 Relays
&lt;/h3&gt;

&lt;p&gt;Let others know where you're active or reachable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#relay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Relay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"wss://relay.nostr.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"wss://nostr.damus.io"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧾 Consistent Profiles
&lt;/h3&gt;

&lt;p&gt;Point to a hosted profile document (e.g., &lt;code&gt;NIP-05&lt;/code&gt;, JSON-LD, or Solid).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://yoursite.example/profile.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📦 Storage
&lt;/h3&gt;

&lt;p&gt;Advertise where your public data or documents live.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#storage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DecentralizedStorage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://storage.example/alice/"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✉️ Messaging Inbox
&lt;/h3&gt;

&lt;p&gt;Allow others to DM you using email-style or DIDComm-compatible protocols.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#inbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Messaging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://inbox.example.org/users/alice"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🪪 Verifiable Credentials
&lt;/h3&gt;

&lt;p&gt;Issue or receive credentials, badges, or attestations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#vc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VerifiableCredentialService"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vc.example.com/submit"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🪙 Bitcoin Wallet
&lt;/h3&gt;

&lt;p&gt;Include your Taproot (P2TR) address derived from your pubkey.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#wallet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BitcoinTaprootAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bc1p...yourTaprootAddress"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤝 Why Use &lt;code&gt;did-nostr&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Because your Nostr pubkey &lt;strong&gt;can do more than sign events&lt;/strong&gt;. With a &lt;code&gt;did:nostr&lt;/code&gt; document, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make your key discoverable&lt;/li&gt;
&lt;li&gt;Declare your preferred relays&lt;/li&gt;
&lt;li&gt;Publish profile or storage locations&lt;/li&gt;
&lt;li&gt;Link to wallet or message inboxes&lt;/li&gt;
&lt;li&gt;Become part of a broader decentralized identity ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this is &lt;strong&gt;portable&lt;/strong&gt;, &lt;strong&gt;self-hosted&lt;/strong&gt;, and &lt;strong&gt;standardized&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Want to Build With It?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;did-nostr&lt;/code&gt; method spec is open and evolving. You can check out the latest draft here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://nostrcg.github.io/did-nostr/" rel="noopener noreferrer"&gt;https://nostrcg.github.io/did-nostr/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRs welcome. Identities are yours. Let’s build the semantic web of Nostr, one DID at a time.&lt;/p&gt;




</description>
      <category>nostr</category>
    </item>
    <item>
      <title>Sketch: Selling Digital Art with DID-Nostr, Bitcoin, and Nostr</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Sat, 29 Mar 2025 12:32:13 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/sketch-selling-digital-art-with-did-nostr-bitcoin-and-nostr-3mai</link>
      <guid>https://dev.to/melvincarvalho/sketch-selling-digital-art-with-did-nostr-bitcoin-and-nostr-3mai</guid>
      <description>&lt;h1&gt;
  
  
  Sketch: Selling Digital Art with DID-Nostr, Bitcoin, and Nostr
&lt;/h1&gt;

&lt;p&gt;The fusion of digital identity, Bitcoin, and decentralized protocols is reshaping how creators sell and own their digital art. &lt;strong&gt;DID-Nostr&lt;/strong&gt;, a decentralized identity method leveraging the Nostr protocol, opens new possibilities for artists to confidently authenticate, own, and sell their artwork as NFTs using Bitcoin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DID-Nostr?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nostrcg.github.io/did-nostr/" rel="noopener noreferrer"&gt;DID-Nostr&lt;/a&gt; (Decentralized Identifier using Nostr) is an open, permissionless method for establishing identities rooted in the Nostr protocol. By tying cryptographic identities directly to Nostr's decentralized network, DID-Nostr allows secure, verifiable interactions that don't depend on centralized platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empowering Artists through NFTs
&lt;/h2&gt;

&lt;p&gt;Traditionally, selling digital art required intermediaries, platforms that could censor content, control visibility, or impose high fees. DID-Nostr introduces an open standard, empowering artists with autonomy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provenance and Authenticity&lt;/strong&gt;: Artworks minted as NFTs on DID-Nostr carry cryptographic proof of creation, provenance, and ownership directly linked to the artist’s DID.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ownership and Transfer&lt;/strong&gt;: Transfers become transparent and verifiable, allowing collectors to confidently own authentic, artist-verified digital art.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decentralized Marketplace&lt;/strong&gt;: Artists can sell their digital art on open, censorship-resistant marketplaces built atop Nostr, using Bitcoin for secure and borderless transactions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Overview: Minting an NFT with DID-Nostr
&lt;/h2&gt;

&lt;p&gt;Follow these simplified steps to create and sell an NFT:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Minting the NFT
&lt;/h3&gt;

&lt;p&gt;Create a JSON record for your NFT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:nft:artwork123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assetUri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blossom://yourAssetCID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:npub1artistid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"creator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:npub1artistid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My Unique Digital Art"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"An original artwork minted as NFT using DID-Nostr."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"trait_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"genre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abstract"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provenance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-29T12:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:npub1artistid"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Announcing on Nostr
&lt;/h3&gt;

&lt;p&gt;Broadcast an NFT Mint Event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nft_mint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I've minted new art! Check it out at blossom://yourAssetCID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"nft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:nft:artwork123"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pubkey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npub1artistid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1740528000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Selling with Bitcoin
&lt;/h3&gt;

&lt;p&gt;When a collector wants to buy your art:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agree on the price in Bitcoin.&lt;/li&gt;
&lt;li&gt;The collector sends Bitcoin to your address.&lt;/li&gt;
&lt;li&gt;Transfer ownership by signing an NFT Transfer event:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nft_transfer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ownership of NFT artwork123 transferred to npub1buyerid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"nft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:nft:artwork123"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npub1artistid"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npub1buyerid"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pubkey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npub1artistid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1740614400&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benefits for Artists and Collectors
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lower Fees&lt;/strong&gt;: No intermediaries or third-party platform fees. More revenue directly to artists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Accessibility&lt;/strong&gt;: Anyone with internet and Bitcoin can participate—no gatekeepers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutable History&lt;/strong&gt;: Clear, transparent ownership history recorded permanently on Bitcoin and Nostr, providing long-term authenticity assurances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Envisioning a Decentralized Artistic Future
&lt;/h2&gt;

&lt;p&gt;DID-Nostr represents more than technological innovation—it's an invitation to rethink digital art's value chain. Artists, freed from centralized constraints, can cultivate authentic connections with global collectors, forming communities built on shared passion, trust, and verifiable authenticity.&lt;/p&gt;

&lt;p&gt;As we explore this path, let's remember: this is just the beginning. The decentralized future, powered by DID-Nostr, Bitcoin, and Nostr, is a canvas waiting for creators to paint their visions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>art</category>
      <category>nostr</category>
    </item>
    <item>
      <title>Trustless Bitcoin Swaps with DID, Nostr, and HTLCs</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Fri, 28 Mar 2025 09:24:45 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/trustless-bitcoin-swaps-with-did-nostr-and-htlcs-2gde</link>
      <guid>https://dev.to/melvincarvalho/trustless-bitcoin-swaps-with-did-nostr-and-htlcs-2gde</guid>
      <description>&lt;h2&gt;
  
  
  🤔 The Problem
&lt;/h2&gt;

&lt;p&gt;Say Alice wants to send 100,000 sats to Bob.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alice only has &lt;strong&gt;on-chain Bitcoin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Bob only uses the &lt;strong&gt;Lightning Network&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They want to swap — but &lt;strong&gt;without using a centralized exchange or trusted custodian&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Can they do it trustlessly?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes — with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DIDs&lt;/strong&gt; (Decentralized Identifiers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nostr&lt;/strong&gt; (a decentralized messaging protocol)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bitcoin + Lightning&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTLCs&lt;/strong&gt; (Hashed Time-Locked Contracts)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 A Simple Use Case
&lt;/h2&gt;

&lt;p&gt;Let’s walk through a real-world example that almost anyone can understand:&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Scenario: On-chain to Lightning Swap
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Alice&lt;/strong&gt; wants to pay 100k sats &lt;strong&gt;on-chain&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bob&lt;/strong&gt; wants to receive 100k sats &lt;strong&gt;on Lightning&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;They &lt;strong&gt;don’t trust each other&lt;/strong&gt; and want to swap trustlessly.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧩 Enter DID + Nostr + HTLCs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ 1. Identity via DIDs on Nostr
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Both Alice and Bob have &lt;strong&gt;DIDs&lt;/strong&gt; tied to their &lt;strong&gt;Nostr pubkeys&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;DIDs make it possible to &lt;strong&gt;verify identities&lt;/strong&gt; and &lt;strong&gt;sign messages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Alice posts a signed message to Nostr offering the swap.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"swap-offer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:nostr:pubkeyalice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"onchain-to-lightning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hashlock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abcdef123456..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bob sees it and replies with a signed acceptance.&lt;/p&gt;




&lt;h3&gt;
  
  
  📡 2. Coordinating via Nostr
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The offer and acceptance are broadcast as &lt;strong&gt;ephemeral Nostr events&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Both parties agree on:

&lt;ul&gt;
&lt;li&gt;The amount&lt;/li&gt;
&lt;li&gt;The hashlock&lt;/li&gt;
&lt;li&gt;Timeouts&lt;/li&gt;
&lt;li&gt;Where to send funds&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;No servers, no intermediaries — just pubkey-signed messages over a decentralized relay network.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 3. The HTLC Swap
&lt;/h3&gt;

&lt;p&gt;They now execute the swap using the &lt;strong&gt;same secret hash&lt;/strong&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  Alice (on-chain):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Sends 100k sats to a &lt;strong&gt;Bitcoin HTLC&lt;/strong&gt; (can only be claimed with the secret before timeout).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Bob (Lightning):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Sends 100k sats to a &lt;strong&gt;Lightning HTLC&lt;/strong&gt; (also locked with the same hash).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As soon as one party claims the funds, the &lt;strong&gt;preimage is revealed&lt;/strong&gt;, and the other can claim theirs too.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ 4. Atomic Swap Complete
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bob claims the on-chain BTC → reveals the secret.&lt;/li&gt;
&lt;li&gt;Alice uses the same secret to claim her Lightning BTC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No one can cheat&lt;/strong&gt; — it’s enforced by the HTLCs and timeouts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Why This Matters
&lt;/h2&gt;

&lt;p&gt;This setup gives us:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Trustless swaps&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;No custodians or centralized services&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Cross-layer interoperability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Identity-based coordination via Nostr DIDs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And it all works with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bitcoin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lightning&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DID documents&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open message relays&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 What’s Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add wallet support for DID-authenticated swap offers over Nostr.&lt;/li&gt;
&lt;li&gt;Explore multi-party or ring swaps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;DID + Nostr + HTLCs = trustless swaps across Bitcoin and Lightning, with identity and coordination baked in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No middleman. Just keys, hashes, and the open web.&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>nostr</category>
      <category>did</category>
    </item>
    <item>
      <title>How to Fix Cursor AppImage Not Running on Ubuntu 24.04</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Thu, 06 Mar 2025 22:21:35 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/how-to-fix-cursor-appimage-not-running-on-ubuntu-2404-2o3p</link>
      <guid>https://dev.to/melvincarvalho/how-to-fix-cursor-appimage-not-running-on-ubuntu-2404-2o3p</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;How to Fix Cursor AppImage Not Running on Ubuntu 24.04 (AppArmor Solution)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you just downloaded &lt;strong&gt;Cursor&lt;/strong&gt; for Ubuntu 24.04 and it won’t start, AppArmor is likely blocking it. This guide will show you how to &lt;strong&gt;properly configure AppArmor&lt;/strong&gt; to allow the AppImage to run.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Why This Happens?&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Ubuntu 24.04 enforces stricter &lt;strong&gt;AppArmor security policies&lt;/strong&gt;, preventing some AppImages from running correctly. The fix involves creating an &lt;strong&gt;AppArmor profile&lt;/strong&gt; that lets the Cursor AppImage run &lt;strong&gt;unconfined&lt;/strong&gt; (without restrictions).  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1: Move Cursor AppImage to a Permanent Location&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By default, downloaded AppImages reside in &lt;code&gt;~/Downloads/&lt;/code&gt;. It’s better to move them to &lt;code&gt;~/Applications/&lt;/code&gt; for consistency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Applications
&lt;span class="nb"&gt;mv&lt;/span&gt; ~/Downloads/Cursor-0.46.8-be4f0962469499f009005e66867c8402202ff0b7.deb.glibc2.25-x86_64.AppImage ~/Applications/cursor.AppImage
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/Applications/cursor.AppImage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2: Create an AppArmor Profile for Cursor&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a new AppArmor profile at &lt;code&gt;/etc/apparmor.d/cursor-appimage&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apparmor.d/cursor-appimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the following contents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# This profile allows everything and only exists to give the
# application a name instead of having the label "unconfined"

abi &amp;lt;abi/4.0&amp;gt;,
include &amp;lt;tunables/global&amp;gt;

profile cursor /home/{USER}/Applications/cursor*.AppImage flags=(unconfined) {
  userns,

  # Site-specific additions and overrides. See local/README for details.
  include if exists &amp;lt;local/cursor&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replace &lt;code&gt;{USER}&lt;/code&gt;&lt;/strong&gt; with your actual username or leave it as is (Ubuntu replaces it dynamically).
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;unconfined flag&lt;/strong&gt; ensures Cursor runs without restrictions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3: Apply the AppArmor Policy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run the following command to &lt;strong&gt;reload AppArmor&lt;/strong&gt; with the new policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apparmor_parser &lt;span class="nt"&gt;-r&lt;/span&gt; /etc/apparmor.d/cursor-appimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4: Run Cursor&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now, try launching Cursor again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/Applications/cursor.AppImage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should start without AppArmor interference.  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Bonus: Make Cursor Easier to Launch&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To make Cursor available in your application launcher:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a desktop entry:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   nano ~/.local/share/applications/cursor.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add the following contents:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;   &lt;span class="nn"&gt;[Desktop Entry]&lt;/span&gt;
   &lt;span class="py"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Cursor&lt;/span&gt;
   &lt;span class="py"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/{USER}/Applications/cursor.AppImage&lt;/span&gt;
   &lt;span class="py"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/{USER}/Applications/cursor-icon.png&lt;/span&gt;
   &lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Application&lt;/span&gt;
   &lt;span class="py"&gt;Categories&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Development;Utility;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Refresh your application menu:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   update-desktop-database ~/.local/share/applications/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can find Cursor in your system’s application menu!&lt;/p&gt;

</description>
      <category>cursor</category>
    </item>
    <item>
      <title>Could Nostr Subkeys Replace GPG? A Simple, Powerful Alternative for the Modern Web</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Wed, 26 Feb 2025 13:47:55 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/could-nostr-subkeys-replace-gpg-a-simple-powerful-alternative-for-the-modern-web-aa0</link>
      <guid>https://dev.to/melvincarvalho/could-nostr-subkeys-replace-gpg-a-simple-powerful-alternative-for-the-modern-web-aa0</guid>
      <description>&lt;p&gt;For decades, &lt;strong&gt;GPG (GNU Privacy Guard)&lt;/strong&gt; has been the go-to tool for &lt;strong&gt;secure messaging, signing, and encryption&lt;/strong&gt;. But let’s be honest—&lt;strong&gt;GPG is a pain to use&lt;/strong&gt;. Key management is clunky, revocation is a mess, and for the average user, it's just too complicated.  &lt;/p&gt;

&lt;p&gt;But what if we had something &lt;strong&gt;simpler, more flexible, and designed for the modern internet&lt;/strong&gt;?  &lt;/p&gt;

&lt;p&gt;Nostr’s &lt;strong&gt;subkey model&lt;/strong&gt; could provide a &lt;strong&gt;better, decentralized alternative&lt;/strong&gt; to GPG while keeping the core benefits: strong cryptographic identity, multi-device support, and easy verification.  &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Full subkeys specification:&lt;/strong&gt; &lt;a href="https://gist.github.com/melvincarvalho/0eeba92ad49bd7f8907694751ec20cbd" rel="noopener noreferrer"&gt;Nostr Subkeys Proposal&lt;/a&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 &lt;strong&gt;What Makes GPG a Pain?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;GPG works, but it suffers from:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complicated Key Management&lt;/strong&gt; – Exporting, importing, and backing up keys is a hassle.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Native Multi-Device Support&lt;/strong&gt; – You either &lt;strong&gt;copy&lt;/strong&gt; your private key (bad idea) or manually set up subkeys.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficult Revocation &amp;amp; Recovery&lt;/strong&gt; – If your key is lost, good luck convincing your contacts to update.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyservers Are a Mess&lt;/strong&gt; – Syncing keys and verifying trust requires third-party infrastructure.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Awful UX&lt;/strong&gt; – Even power users struggle with the interface and workflow.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPG was built for a different era. Nostr’s &lt;strong&gt;built-in cryptographic identity model&lt;/strong&gt; gives us a chance to rethink how we handle &lt;strong&gt;signing, encryption, and trust&lt;/strong&gt; in a way that’s simpler and more user-friendly.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;How Nostr Subkeys Could Replace GPG&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Cryptographic Identity Without the Hassle&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With Nostr, your identity is &lt;strong&gt;just a public key (&lt;code&gt;npub&lt;/code&gt;)&lt;/strong&gt;, and all messages/events are signed using your private key (&lt;code&gt;nsec&lt;/code&gt;). &lt;strong&gt;No complex keyservers, trust chains, or manual verifications needed&lt;/strong&gt;—signatures are &lt;strong&gt;in-band and self-verifying&lt;/strong&gt;.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Built-In Multi-Device Support&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GPG forces you to manually create subkeys if you want to use multiple devices securely. Nostr, on the other hand, can &lt;strong&gt;natively support subkeys&lt;/strong&gt;, where:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each &lt;strong&gt;device&lt;/strong&gt; gets its &lt;strong&gt;own subkey&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;master key&lt;/strong&gt; delegates authority to subkeys, proving they belong to the same identity.
&lt;/li&gt;
&lt;li&gt;Clients automatically verify subkeys without needing keyservers.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;GPG:&lt;/strong&gt; Export/import keys manually → hope your contacts update&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Nostr:&lt;/strong&gt; Subkeys are &lt;strong&gt;linked to your master key&lt;/strong&gt; and discoverable automatically  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Simple, Fast Revocation &amp;amp; Rotation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GPG key revocation is a nightmare—if a key is compromised, you have to:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Publish a revocation certificate (which most people never generate in advance).
&lt;/li&gt;
&lt;li&gt;Hope everyone actually &lt;strong&gt;updates their keyrings&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With &lt;strong&gt;Nostr subkeys&lt;/strong&gt;, revocation is &lt;strong&gt;instant and automatic&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a device is lost or compromised, just &lt;strong&gt;remove its subkey from your profile (&lt;code&gt;kind:0&lt;/code&gt;)&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Clients will &lt;strong&gt;immediately stop trusting&lt;/strong&gt; the revoked subkey.
&lt;/li&gt;
&lt;li&gt;No need to rely on &lt;strong&gt;external keyservers&lt;/strong&gt; or out-of-band revocation mechanisms.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;→ Faster, simpler, and no outdated trust issues.&lt;/strong&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Decentralized, No Keyservers Required&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GPG relies on &lt;strong&gt;centralized keyservers&lt;/strong&gt; (which are often slow, unreliable, or even censored).  &lt;/p&gt;

&lt;p&gt;Nostr, by design, is &lt;strong&gt;relay-based&lt;/strong&gt;—meaning:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public keys and signatures are &lt;strong&gt;naturally distributed&lt;/strong&gt; across multiple relays.
&lt;/li&gt;
&lt;li&gt;Users can self-host their own relays or use multiple public ones.
&lt;/li&gt;
&lt;li&gt;There's no &lt;strong&gt;single point of failure&lt;/strong&gt;, making censorship much harder.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;GPG:&lt;/strong&gt; Trust centralized keyservers (hope they work)&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Nostr:&lt;/strong&gt; Just use &lt;strong&gt;relays&lt;/strong&gt;—they handle distribution  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Lightweight, Modern, and Web-Native&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GPG was built in the &lt;strong&gt;1990s&lt;/strong&gt; for a world of email and command-line cryptography. It doesn’t fit well with modern web applications, mobile devices, or decentralized protocols.  &lt;/p&gt;

&lt;p&gt;Nostr &lt;strong&gt;natively works with the web&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
✅ It’s &lt;strong&gt;API-driven&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Works with &lt;strong&gt;any app&lt;/strong&gt; that can verify signatures&lt;br&gt;&lt;br&gt;
✅ Can be used for &lt;strong&gt;chat, document signing, and authentication&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Requires &lt;strong&gt;no complicated installs or CLI commands&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ A signing/encryption system that actually fits how people use the internet today.&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🔮 What Could a Nostr-Based GPG Replacement Look Like?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of &lt;code&gt;gpg --sign myfile.txt&lt;/code&gt;, imagine:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signing a message&lt;/strong&gt; by posting a &lt;code&gt;kind:4&lt;/code&gt; event
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypting a file&lt;/strong&gt; by using NIP-44 (Nostr’s built-in encryption)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifying someone’s signature&lt;/strong&gt; by checking their Nostr identity and delegation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t just theoretical—&lt;strong&gt;all the building blocks exist today&lt;/strong&gt; in Nostr. With a bit of tooling, we could make signing and encryption &lt;strong&gt;as easy as sending a Nostr note&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🔗 GPG vs. Nostr Subkeys: The Comparison&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GPG (Legacy) ❌&lt;/th&gt;
&lt;th&gt;Nostr Subkeys (Modern) ✅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Device Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Manual setup, hard to sync&lt;/td&gt;
&lt;td&gt;✅ Automatic subkeys for each device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Revocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Painful, requires external servers&lt;/td&gt;
&lt;td&gt;✅ Instant, just update your profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Requires keyservers&lt;/td&gt;
&lt;td&gt;✅ Relays distribute public keys naturally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Complex CLI, manual imports&lt;/td&gt;
&lt;td&gt;✅ Just sign events like any Nostr note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Decentralization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Trusts keyservers&lt;/td&gt;
&lt;td&gt;✅ Fully decentralized, relay-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web &amp;amp; App Friendly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not native to modern apps&lt;/td&gt;
&lt;td&gt;✅ Nostr works in browsers, mobile apps, and more&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🌍 A Future Without GPG?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;GPG isn’t going away tomorrow—it’s deeply embedded in many systems. But for &lt;strong&gt;people looking for a modern, decentralized alternative&lt;/strong&gt;, Nostr’s subkey model could be &lt;strong&gt;simpler, stronger, and better suited for the web&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;With a little development, we could make &lt;strong&gt;Nostr subkeys the default way to sign, encrypt, and verify identities—without any of GPG’s pain points.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;GPG had its time. &lt;strong&gt;Maybe it’s time for something better.&lt;/strong&gt; 🚀  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What’s Next?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Interested? Let’s build it. &lt;strong&gt;Drop into Nostr dev discussions&lt;/strong&gt; and let’s start shaping a true GPG alternative—one that’s &lt;strong&gt;decentralized, easy to use, and works everywhere.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Nostr isn’t just for social media—it could be the future of cryptographic identity.&lt;/strong&gt; 🔑  &lt;/p&gt;

</description>
      <category>nostr</category>
    </item>
    <item>
      <title>Nostr-Passport: A Step Towards Infinite Storage</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Sat, 07 Oct 2023 15:48:40 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/nostr-passport-a-step-towards-infinite-storage-l9l</link>
      <guid>https://dev.to/melvincarvalho/nostr-passport-a-step-towards-infinite-storage-l9l</guid>
      <description>&lt;p&gt;In the evolving digital landscape, &lt;a href="https://github.com/nosdav/passport-nostr"&gt;Nostr-Passport&lt;/a&gt; presents itself not as a spectacle but as a humble tool, quietly enabling a seamless and private user experience across various web frameworks, such as Express, Koa, Fastify, and Hapi.&lt;/p&gt;

&lt;h2&gt;
  
  
  NIP-07: Privacy-Centric Identification
&lt;/h2&gt;

&lt;p&gt;NIP-07 offers a protocol that facilitates identification (answering the "Who am I?") with a notable degree of privacy, allowing users to interact with applications in a read-only mode without surrendering any personal data to the digital ether.&lt;/p&gt;

&lt;h2&gt;
  
  
  NIP-98: Transitioning to Contribution
&lt;/h2&gt;

&lt;p&gt;When users decide to shift from browsing to contributing, NIP-98 steps in, providing authentication (affirming "Verify who I am") by sending a signed header to the server, ensuring the user's contributions are authenticated and accepted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nostr-Passport: Bridging Identification and Authentication
&lt;/h2&gt;

&lt;p&gt;Nostr-Passport serves to validate the header sent via NIP-98, unobtrusively linking identification and authentication to ensure a clean, modular, and scalable user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layered Access Control: Node-ACL and Casbin
&lt;/h2&gt;

&lt;p&gt;Integration with nostr-passport allows for the subtle layering of access control using Node-ACL or Casbin, creating a secure environment where access is not only regulated but also precisely defined and controlled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Towards Socially Aware Cloud Storage
&lt;/h2&gt;

&lt;p&gt;This approach quietly transforms into socially aware cloud storage, implementing diverse roles and access in a manner that is both effective and unassuming. It creates a scenario where platforms, such as Wikipedia or private journals, can exist harmoniously, each with unique access controls and shared access to secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relays and Cloud: Navigating Towards Infinite Storage
&lt;/h2&gt;

&lt;p&gt;Nostr relays, proficient in enabling real-time updates and storage, when amalgamated with cloud technology, elevate their capabilities to archival levels, providing significantly enhanced storage. This pairing doesn't just alleviate pressure on the relays but also propels Nostr towards a scale that could cater to millions or even billions of users, smoothly navigating towards infinite storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Closing: A Powerful Tool for a Scalable Future
&lt;/h2&gt;

&lt;p&gt;Nostr-Passport quietly nudges us towards a future where digital interactions are secure, private, and scalable, without the fanfare but with a steadfast reliability that promises a future where user privacy and contribution are harmoniously balanced.&lt;/p&gt;

&lt;p&gt;As we explore this unassuming yet potent tool, we find a future where browsing and contributing online are not only secure and private but also infinitely scalable and quietly efficient.&lt;/p&gt;

</description>
      <category>nostr</category>
      <category>passport</category>
      <category>nip98</category>
      <category>nosdav</category>
    </item>
    <item>
      <title>Smart Events (Contracts) Over Nostr: A Consensus-Based Approach</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Sun, 07 May 2023 12:43:19 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/smart-events-contracts-over-nostr-a-consensus-based-approach-1l9n</link>
      <guid>https://dev.to/melvincarvalho/smart-events-contracts-over-nostr-a-consensus-based-approach-1l9n</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VLXu2KkB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gzeoekmko4ndwsbf2l0o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VLXu2KkB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gzeoekmko4ndwsbf2l0o.jpg" alt="Smart Events" width="393" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;In this blog post, we'll explore the concept of smart events (contracts) over Nostr, a decentralized network protocol for content sharing. We'll detail the consensus mechanism that ensures secure and reliable transaction processing and provide insights into the contracting layer of the network.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nostr Consensus Mechanism:
&lt;/h2&gt;

&lt;p&gt;The Nostr protocol employs a four-phase consensus mechanism, ensuring that only valid transactions are committed to the event chain. These phases are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proposal Phase&lt;/strong&gt;: A validator is chosen as the proposer for the current round based on a deterministic algorithm. This algorithm considers the validator's voting power and previous round information. The proposer creates an event proposal containing transactions and broadcasts it to other validators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prevote Phase&lt;/strong&gt;: Validators verify the correctness of the proposed event, checking transactions and ensuring compliance with network rules. If valid, validators broadcast a signed "prevote" message for that event. If invalid or not received within a specified time limit, validators broadcast a "nil" prevote.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Precommit Phase&lt;/strong&gt;: After receiving prevotes from more than two-thirds of validators (by voting power), a validator enters the precommit phase. Validators check if the majority of prevotes are for the same event proposal. If so, they broadcast a signed "precommit" message for that event. If there is no majority or the event is not received within the time limit, validators broadcast a "nil" precommit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Commit Phase&lt;/strong&gt;: Once a validator receives precommits for the same event proposal from more than two-thirds of validators (by voting power), it enters the commit phase. The validator commits the event to its local event chain, finalizing the consensus process for that event. The validator then moves to the next round or height and begins the process again with the proposal phase.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Contracting Layer:
&lt;/h2&gt;

&lt;p&gt;Digital signatures provide a partial solution, with validators guaranteeing the proper sequencing of contractual states. As long as the dishonest validators do not exceed one-third of the total, the state shall maintain its correct order.&lt;/p&gt;

&lt;p&gt;The state machine is capable of monitoring any contract or ledger state. It is crucial to select a federation of esteemed Nostr users, ensuring they are not Sybil attackers. A DynaFed approach could be employed, allowing a supermajority to vote out malicious nodes or those with low uptime, and replacing them with nodes of higher reputation.&lt;/p&gt;

&lt;p&gt;Initially, the system is expected to operate in a testnet mode, wherein tokens should not be regarded as possessing tangible value. This allows for thorough evaluation and refinement of the network before transitioning to a mainnet environment, ensuring the stability and security of the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;Smart events (contracts) over Nostr provide a promising approach to decentralized content sharing and transaction processing. By utilizing a consensus-based mechanism and carefully designed contracting layer, the Nostr protocol can create a secure, reliable, and efficient platform for a variety of applications.&lt;/p&gt;

</description>
      <category>nostr</category>
      <category>smart</category>
      <category>layer2</category>
      <category>events</category>
    </item>
    <item>
      <title>Run a Nostr Relay on Your Phone with Termux and Fonstr</title>
      <dc:creator>Melvin Carvalho</dc:creator>
      <pubDate>Sun, 07 May 2023 06:54:21 +0000</pubDate>
      <link>https://dev.to/melvincarvalho/run-a-nostr-relay-on-your-phone-with-termux-and-fonstr-4cmg</link>
      <guid>https://dev.to/melvincarvalho/run-a-nostr-relay-on-your-phone-with-termux-and-fonstr-4cmg</guid>
      <description>&lt;h1&gt;Explore a World of Possibilities: Run a Nostr Relay on Your Phone with Termux and Fonstr&lt;/h1&gt;

&lt;p&gt;Stay connected, be part of a decentralized network, and discover new opportunities&lt;/p&gt;




&lt;p&gt;In this blog post, we'll show you how to set up a &lt;a href="https://nostr.com"&gt;Nostr&lt;/a&gt; relay server on your Android phone, using &lt;a href="https://termux.dev/en/"&gt;Termux&lt;/a&gt; and &lt;a href="https://github.com/nostrapps/fonstr"&gt;Fonstr&lt;/a&gt;, so you can join this exciting world of decentralized communication even if you're not a tech expert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started: Installing Termux
&lt;/h2&gt;

&lt;p&gt;First things first, let's get Termux installed on your Android phone. Termux is a powerful terminal emulator that allows you to run a Linux environment on your Android device. &lt;/p&gt;

&lt;p&gt;To install Termux, follow these simple steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download and install the F-Droid app store on your phone. F-Droid is an alternative app store for Android that focuses on free and open-source software. You can download F-Droid from &lt;a href="https://f-droid.org/"&gt;their website&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open F-Droid, search for "Termux," and install the app.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preparing Your Phone with Termux
&lt;/h2&gt;

&lt;p&gt;Now that you have Termux installed on your phone, let's set up the environment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Termux and enter the following command to update the package list and upgrade the installed packages:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Next, install Node.js by entering:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg &lt;span class="nb"&gt;install &lt;/span&gt;nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Finally, install Git with the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great! You've just set up your phone to run a Nostr relay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Fonstr: Your Nostr Relay Server
&lt;/h2&gt;

&lt;p&gt;With your environment ready, it's time to install Fonstr:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Termux, clone the Fonstr repository with the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/nostrapps/fonstr.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Navigate to the project directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fonstr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Install the necessary dependencies:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running Your Nostr Relay: It's Showtime!
&lt;/h2&gt;

&lt;p&gt;With everything set up, you can now run your Nostr relay server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./index.js &lt;span class="o"&gt;[&lt;/span&gt;port]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;[port]&lt;/code&gt; with the desired port number. If no port is provided, the server will run on port 4444 by default.&lt;/p&gt;

&lt;p&gt;Hooray! Your Nostr relay server is up and running on your Android phone, and you're now part of the Nostr decentralized network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Your Relay with Websocat
&lt;/h2&gt;

&lt;p&gt;To make sure everything is working correctly, you can test your relay using Websocat. Websocat is a command-line tool that allows you to interact with WebSocket servers.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Websocat on your computer by following the instructions on &lt;a href="https://github.com/vi/websocat"&gt;their GitHub page&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg &lt;span class="nb"&gt;install &lt;/span&gt;websocat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open a terminal on your computer and enter the following command to connect to your Nostr relay:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat ws://[your-phone-ip]:[port]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;[your-phone-ip]&lt;/code&gt; with your phone's IP address and &lt;code&gt;[port]&lt;/code&gt; with the port number you used when starting the relay.&lt;/p&gt;

&lt;p&gt;You should now be able to communicate with your Nostr relay!&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Events
&lt;/h2&gt;

&lt;p&gt;To test sending an event you can use &lt;a href="https://nak.nostr.com"&gt;NAK&lt;/a&gt; to create an event e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1683206612&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9d87daf61771777d73ea901efd3771f142fbc887283d75771dbeda030d725c7e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pubkey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"54be52723617100b776730cc8c1871698b222ddfae4bbbd47627705593e09731f147708b3808b14b71fdcac0bcd6e3fef11442b48f0d5cbca7e58d2e03ae4d53"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send ["EVENT", &amp;lt;your event] via websocat &lt;/p&gt;

&lt;p&gt;To listen for new events try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'["REQ", "fonstr", {}]'&lt;/span&gt; | websocat &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;--ping-interval&lt;/span&gt; 20  ws://localhost:4444
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You've just opened a world of possibilities by setting up a Nostr relay server on your Android phone. This achievement not only allows you to stay connected to a decentralized network but also empowers you to explore new opportunities in the world of communication and collaboration. By following these simple steps, even non-technical users can join and contribute to the Nostr network.&lt;/p&gt;

&lt;p&gt;As you become more familiar with Nostr and its potential, you might want to explore other Nostr applications and tools to expand your knowledge and capabilities. With the power of decentralized communication at your fingertips, the sky's the limit!&lt;/p&gt;

&lt;p&gt;Don't hesitate to share your Nostr relay experience with friends and fellow enthusiasts. By spreading the word about the Nostr protocol and its benefits, we can build a more robust, decentralized, and open network for everyone to enjoy.&lt;/p&gt;

&lt;p&gt;Happy exploring!&lt;/p&gt;

</description>
      <category>nostr</category>
      <category>fonstr</category>
      <category>relay</category>
      <category>phone</category>
    </item>
  </channel>
</rss>
