Files
Aljaz Ceru 3968411206 grantless: harden zap payments, honest receipt claims, recovery lifecycle
- zap-core.js: dependency-free BOLT11 decoder (checksum, mainnet hrp, exact
  amount vs requested msat per LUD-06, expiry, description-hash binding to
  the serialized NIP-57 zap request), provider selector (most-recently-
  connected wins), transient-error classifier, zap lifecycle guard — all
  unit-tested (node --test, 20 tests)
- zap.js: invoice claims match proof (receipt-bound / unverified / none);
  payment triage (transient -> recovery panel, terminal -> provider message);
  single pending recovery protected from concurrent failures; all recovery
  exits clear guard + chip state
- loads zap-core.js before zap.js in index.html (both must deploy together)
2026-08-17 21:13:52 +02:00

139 lines
6.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<script defer data-domain="nostr.net" src="https://analytics.cypherpunk.cloud/js/script.js"></script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Add favicon links -->
<link rel="icon" type="image/png" href="Logo.png">
<link rel="apple-touch-icon" href="Logo.png">
<meta name="description" content="A comprehensive collection of Nostr resources, tools, clients, and protocols for developers and users.">
<meta name="keywords" content="nostr, cryptocurrency, decentralized social, protocols, tools, clients, resources">
<meta name="author" content="Your Name">
<meta name="robots" content="index, follow">
<!-- Open Graph / Social Media Meta Tags -->
<meta property="og:title" content="Awesome Nostr Resources">
<meta property="og:description" content="A comprehensive collection of Nostr resources, tools, clients, and protocols for developers and users.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://your-domain.com">
<meta property="og:image" content="https://your-domain.com/path-to-image.jpg">
<!-- Twitter Card Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Awesome Nostr Resources">
<meta name="twitter:description" content="A comprehensive collection of Nostr resources, tools, clients, and protocols for developers and users.">
<meta name="twitter:image" content="https://your-domain.com/path-to-image.jpg">
<title>Awesome Nostr Resources | Comprehensive Guide to Nostr Protocol</title>
<link rel="preconnect" href="https://esm.sh" crossorigin>
<link rel="stylesheet" href="styles.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
</head>
<body>
<nav class="top-nav">
<div class="nav-content">
<h1>
<div class="logo-container">
<img src="Logo.png" alt="Nostr Logo" class="nav-logo">
<span class="logo-text">.NET</span>
</div>
</h1>
<div class="search-box">
<input type="text" id="search" placeholder="Search resources...">
<i class="fas fa-search"></i>
</div>
<div class="theme-controls">
<!-- Color theme select dropdown commented out as requested
<select id="colorThemeSelect" class="theme-select" aria-label="Select color theme">
<option value="cyberpunk">Default</option>
<option value="purple">Purple Dream</option>
<option value="nature">Nature's Touch</option>
<option value="sunset">Sunset Vibes</option>
<option value="grape">Grape Fusion</option>
<option value="autumn">Autumn Warmth</option>
<option value="midnight">Midnight Rose</option>
<option value="rosenoir">Rose Noir</option>
<option value="nord">Nord</option>
<option value="pastel">Pastel Pop</option>
<option value="oceanic">Oceanic Breeze</option>
<option value="dracula">Dracula</option>
</select>
-->
<bc-button id="bcConnect"></bc-button>
<a id="fundButton" class="fund-toggle" href="lightning:aljaz@minibits.cash"
title="Fund nostr.net ⚡ aljaz@minibits.cash"
aria-label="Fund nostr.net with a Lightning zap">
<i class="fas fa-bolt"></i>
</a>
<button id="darkModeToggle" class="theme-toggle" aria-label="Toggle dark mode">
<i class="fas fa-moon"></i>
</button>
</div>
</div>
</nav>
<!-- Move menu toggle button outside of sidebar -->
<button id="menuToggle" class="menu-toggle" aria-label="Toggle menu">
<i class="fas fa-bars"></i>
</button>
<div class="container">
<!-- Remove duplicate menu toggle from sidebar -->
<nav class="sidebar" aria-label="Main navigation">
<header class="sidebar-header">
<h4>Nostr Resources</h4>
</header>
<div class="sidebar-content">
<ul class="nav-links">
<!-- Categories will be dynamically populated here -->
</ul>
</div>
</nav>
<!-- Main Content -->
<main class="main-content" role="main">
<a class="fund-banner" href="#zappable-projects">
<i class="fas fa-bolt" aria-hidden="true"></i>
<span class="fund-banner-text"><strong>grantless</strong> — zap the projects building nostr. Every project with a ⚡ chip is zappable, right here on the list.</span>
<span class="fund-banner-cta">Zappable projects <i class="fas fa-arrow-right" aria-hidden="true"></i></span>
</a>
<header class="content-header">
<div class="view-controls">
<!-- Dark mode toggle has been moved to top nav -->
</div>
</header>
<div id="resources-container" role="region" aria-label="Resource listings"></div>
</main>
</div>
<footer class="site-footer">
<p>&copy; 2025 nostr.net All rights reserved.</p>
</footer>
<!-- Add marked.js before your script -->
<script type="module">
import * as bitcoinConnect from 'https://esm.sh/@getalby/bitcoin-connect@3.12.3';
window.bitcoinConnect = bitcoinConnect;
</script>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="script.js"></script>
<script src="zap-core.js"></script>
<script src="zap.js"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-E6V2R7B0KQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-E6V2R7B0KQ');
</script>
</body>
</html>