Nicolas Cantu cb7ee0cfd4 Replace nos2x and NostrConnect with Alby authentication
- Remove nos2x and NostrConnect support
- Create new NostrAuthService using Alby (window.nostr NIP-07)
- Replace useNostrConnect with useNostrAuth in all components
- Update NostrRemoteSigner to use Alby for signing
- Delete NostrConnect-related files (nostrconnect.ts, handlers, etc.)
- Update documentation to reflect Alby-only authentication
- Remove NOSTRCONNECT_BRIDGE environment variable
- All TypeScript checks pass
2025-12-27 23:54:34 +01:00

5.6 KiB

Fonctionnalités implémentées

Auteur : Équipe 4NK

Architecture de base

Nostr Paywall → zapwall4Science

  • Publication d'articles avec aperçus gratuits et contenu payant
  • Paiement Lightning via Alby/WebLN (remplacement de Rizful)
  • Connexion via Alby extension (NIP-07) pour l'authentification Nostr et les paiements Lightning
  • Interface TypeScript/Next.js

Services principaux

  • Nostr : Pool de connexions, publication/récupération d'événements, profils
  • Paiements : Invoices Lightning, vérification zap receipts (NIP-57), envoi automatique contenu privé
  • Stockage : IndexedDB avec chiffrement AES-GCM pour contenu privé
  • Notifications : Surveillance des paiements en temps réel (zap receipts)

Fonctionnalités utilisateur

Profil et articles

  • Page profil (/profile) avec informations utilisateur
  • Liste des articles publiés par l'utilisateur
  • Recherche et filtres (auteur, prix, texte)
  • Tri (date, prix)

Édition et suppression

  • Édition d'articles via événements Nostr (kind 1 avec tag replace)
  • Suppression d'articles via événements Nostr (kind 5)
  • Confirmation avant suppression
  • Ré-encryptage du contenu privé lors de l'édition

Notifications

  • Surveillance automatique des zap receipts (kind:9735) destinés à l'utilisateur
  • Badge avec nombre de notifications non lues dans le header
  • Centre de notifications (panneau latéral) avec liste des paiements
  • Formatage du temps relatif (il y a X minutes/heures/jours)
  • Marquer comme lu / marquer tout comme lu
  • Tri par date (plus récentes en premier)

Scope : Uniquement notifications de paiements. Pas de mentions, reposts, likes. Si commentaires demandés plus tard, approbation explicite requise.

Stockage

IndexedDB avec chiffrement

  • Remplacement de localStorage par IndexedDB
  • Chiffrement AES-GCM du contenu privé
  • Clé maître générée une fois et stockée en localStorage
  • Secret par article : <masterKey>:<articleId>
  • Expiration automatique (30 jours)
  • Pas de fallback : échec si IndexedDB ou Web Crypto indisponible

Fichiers

  • lib/storage/indexedDB.ts : Service IndexedDB
  • lib/storage/cryptoHelpers.ts : Helpers AES-GCM
  • lib/articleStorage.ts : Gestion du stockage avec chiffrement

Hiérarchie de contenu

Structure

  • Page auteur : Publication publique et gratuite (obligatoire avant de publier)
  • Séries : Publications publiques et gratuites organisées par auteur
  • Publications : Contenu confidentiel et gratuit pour l'auteur, payant pour l'accès (800 sats)

Navigation

  • Home : Bouton "Créer page auteur" si pas de présentation, sinon "Publier une publication"
  • Page auteur : Résumé du sponsoring et liste des séries
  • Page série : Résumé de la série, illustration de couverture et liste des publications

Système de tags Nostr

Nouveau système (tous en anglais)

  • Type : #author, #series, #publication, #quote (tags simples)
  • Catégorie : #sciencefiction ou #research (tags simples)
  • ID : #id_<id> (tag avec valeur)
  • Paywall : #paywall (pour les publications payantes)
  • Payment : #payment (optionnel, pour les notes de paiement)

Utilitaires

  • lib/nostrTagSystem.ts : buildTags(), extractTagsFromEvent(), buildTagFilter()
  • Migration complète depuis l'ancien système (kind_type, site, etc.)

Séries et médias (NIP-95)

Séries

  • Événements kind 1 avec tag #series
  • Tags : #sciencefiction ou #research, #id_<id>, title, description, cover, preview
  • Agrégation du sponsoring et des paiements par série

Médias

  • Upload d'images (≤5Mo) et vidéos (≤45Mo) via NIP-95
  • Tags banner et media dans les événements
  • Validations de taille et type
  • Support dans les articles et séries

Avis (reviews)

  • Événements kind 1 avec tag #quote
  • Tags : #sciencefiction ou #research, #id_<id>, #article, reviewer, title
  • Rémunération possible avec tags rewarded et reward_amount

Optimisations et nettoyage

Refactoring

  • Division des fichiers > 250 lignes
  • Extraction des fonctions > 40 lignes
  • Modules dédiés : parsing, messages privés, vérification zap, subscriptions, polling, résolution invoices, stockage, handlers

Code quality

  • Respect strict exactOptionalPropertyTypes
  • Fonctions < 40 lignes, fichiers < 250 lignes
  • Pas de fallback implicite
  • Logs structurés
  • Pas d'analytics

Intégrations

Alby/WebLN

  • Remplacement de Rizful par Alby/WebLN
  • Standard WebLN compatible avec tous les portefeuilles
  • Pas d'API backend nécessaire
  • Service AlbyService pour enable, makeInvoice, sendPayment

Priorité 1 (implémenté)

  • Génération d'invoice côté auteur lors de la publication
  • Invoice stockée dans tags Nostr et localStorage
  • Vérification de l'invoice avant création d'une nouvelle
  • Signature distante (NIP-46) préparée

Internationalisation (i18n)

Système de traduction

  • Fichiers texte plats : public/locales/fr.txt, public/locales/en.txt
  • Format : key=value avec paramètres {{param}}
  • Hook useI18n pour charger et utiliser les traductions
  • Initialisation dans _app.tsx avec locale par défaut (fr)

Langues supportées

  • Français (fr) : langue par défaut
  • Anglais (en) : disponible
  • Extensible : ajout de nouvelles langues via fichiers de traduction

Financement IA

Jauge de financement

  • Composant FundingGauge sur la page d'accueil
  • Affiche montant collecté, cible (0.27 BTC) et pourcentage
  • Calcul via lib/fundingCalculation.ts
  • Description de l'usage des fonds pour le développement IA (développement et matériel)