6.3 KiB
6.3 KiB
Nostr Paywall - Site d'articles avec aperçus gratuits et contenu payant
Auteur : Équipe 4NK
Objectif
Implémenter un site d'articles sur Nostr permettant :
- L'affichage d'aperçus gratuits (notes publiques)
- Le déblocage du contenu complet après un zap Lightning de 800 sats
- La connexion via NostrConnect (préconisé use.nsec.app)
- Une interface moderne et intuitive en TypeScript/Next.js
Impacts
Utilisateurs
- Accès gratuit aux aperçus d'articles
- Possibilité de débloquer le contenu complet via paiement Lightning instantané
- Connexion sécurisée via NostrConnect sans partager de clés privées
- Expérience utilisateur fluide avec gestion des paiements intégrée
Développeurs
- Architecture modulaire avec séparation des responsabilités
- Utilisation de
nostr-toolspour toutes les opérations Nostr - TypeScript pour la sécurité de type
- Hooks React personnalisés pour la gestion de l'état
- Service de connexion NostrConnect réutilisable
Technique
- Dépendance principale :
nostr-tools(bibliothèque standard Nostr) - Framework : Next.js 14 avec React 18
- Styling : Tailwind CSS
- Relay par défaut : wss://relay.damus.io
- Bridge NostrConnect : https://use.nsec.app
Modifications
Structure du projet
nostr_paywall/
├── pages/
│ ├── index.tsx # Page principale avec liste des articles
│ └── _app.tsx # Configuration Next.js
├── components/
│ ├── ConnectButton.tsx # Bouton de connexion NostrConnect
│ └── ArticleCard.tsx # Carte d'article avec aperçu et déblocage
├── hooks/
│ ├── useNostrConnect.ts # Hook pour la connexion NostrConnect
│ └── useArticles.ts # Hook pour la gestion des articles
├── lib/
│ ├── nostr.ts # Service Nostr (publications, abonnements, zaps)
│ └── nostrconnect.ts # Service NostrConnect (NIP-46)
├── types/
│ └── nostr.ts # Types TypeScript pour Nostr
└── styles/
└── globals.css # Styles globaux avec Tailwind
Composants clés
lib/nostr.ts - Service Nostr
SimplePoolpour la gestion des connexions aux relais- Méthodes pour publier et s'abonner aux événements
- Parsing des articles depuis les événements kind:1
- Gestion des messages privés chiffrés (kind:4) avec NIP-04
- Création de zap requests (kind:9734)
- Vérification des zap receipts (kind:9735)
lib/nostrconnect.ts - Service NostrConnect
- Implémentation du protocole NIP-46 via use.nsec.app
- Communication via messages postMessage avec popup
- Persistance de l'état de connexion dans localStorage
- Gestion du profil utilisateur
components/ArticleCard.tsx
- Affichage de l'aperçu (contenu public)
- Bouton de déblocage conditionnel (nécessite connexion)
- Création de zap request lors du clic
- Vérification du paiement et chargement du contenu privé
- Affichage du contenu complet une fois débloqué
Format des articles
Les articles sont publiés sous forme d'événements Nostr avec :
Note publique (kind:1) - Aperçu :
- Tags :
title,preview,zap(montant en sats) - Contenu : Aperçu de l'article
Message privé (kind:4) - Contenu complet :
- Tag
e: ID de l'article lié - Contenu : Contenu complet chiffré avec NIP-04
- Envoyé après réception du zap
Flux de paiement
- Utilisateur clique sur "Unlock for 800 sats"
- Création d'un zap request (kind:9734) avec tags
p,e,amount - Le zap request est publié sur le relay
- L'utilisateur complète le paiement via son wallet Lightning
- Vérification du zap receipt (kind:9735) sur le relay
- Déchiffrement et affichage du contenu privé
Modalités de déploiement
Prérequis
- Node.js 18+ et npm
- Accès à un relay Nostr public ou privé
- Configuration de variables d'environnement optionnelles
Variables d'environnement
Créer un fichier .env.local :
NEXT_PUBLIC_NOSTR_RELAY_URL=wss://relay.damus.io
NEXT_PUBLIC_NOSTRCONNECT_BRIDGE=https://use.nsec.app
Installation
npm install
Développement
npm run dev
Le site sera accessible sur http://localhost:3000
Build de production
npm run build
npm start
Déploiement
Le projet peut être déployé sur :
- Vercel (recommandé pour Next.js)
- Netlify
- Tout hébergeur supportant Node.js
Important : Pour la production, configurer :
- Variables d'environnement dans le panneau d'administration
- HTTPS (obligatoire pour NostrConnect)
- Relay Nostr fiable et performant
Modalités d'analyse
Logs et debugging
Les erreurs sont loggées dans la console du navigateur :
- Erreurs de connexion aux relais
- Erreurs de déchiffrement
- Erreurs de parsing d'articles
Métriques à surveiller
-
Connectivité
- Taux de connexion réussie via NostrConnect
- Temps de réponse des relais
-
Articles
- Nombre d'articles chargés
- Temps de chargement des aperçus
- Taux de conversion (aperçu → déblocage)
-
Paiements
- Nombre de zap requests créés
- Taux de confirmation des zaps
- Temps moyen entre zap request et receipt
-
Utilisateurs
- Nombre d'utilisateurs connectés
- Profils chargés avec succès
Points d'amélioration
-
Gestion des zaps
- Implémentation complète du flux Lightning avec intégration wallet
- Webhooks pour les confirmations de zap
- Interface de paiement intégrée (LNURL, Lightning Address)
-
Sécurité
- Vérification des signatures des zap receipts
- Validation stricte des événements reçus
- Gestion des erreurs de déchiffrement
-
Performance
- Mise en cache des articles chargés
- Pagination pour les grandes listes
- Indexation des articles par tags
-
UX
- Feedback visuel pendant le traitement des zaps
- Gestion des états de chargement
- Messages d'erreur plus explicites
Tests recommandés
-
Tests unitaires
- Parsing d'événements en articles
- Déchiffrement de messages privés
- Création de zap requests
-
Tests d'intégration
- Flux complet de connexion NostrConnect
- Flux complet de déblocage d'article
- Gestion des erreurs réseau
-
Tests end-to-end
- Scénario utilisateur complet (connexion → aperçu → paiement → contenu)