# Séries, média NIP-95 et événements Nostr (spec v1, Jan 2026) ## 1) Événements et tags (rien en local) Namespace tag communs (tous les events) : - `site`: `zapwall4science` - `category`: `science-fiction` | `scientific-research` - `author`: pubkey auteur - `series`: id série (event id de la série) - `article`: id article (event id de l’article) Kinds proposés (réutilisation kind 1 pour compat) : - Série : kind `1` avec tag `kind_type: series` - tags : `site`, `category`, `author`, `series` (self id), `title`, `description`, `cover` (URL NIP-95), `preview` - Article : kind `1` avec tag `kind_type: article` - tags : `site`, `category`, `author`, `series`, `article` (self id), `title`, `preview`, `banner` (URL NIP-95), `media` (0..n URLs NIP-95) - contenu markdown public (preview) ; privé chiffré inchangé côté storage - Avis (critique) : kind `1` avec tag `kind_type: review` - tags : `site`, `category`, `author`, `series`, `article`, `reviewer` (pubkey), `title`, `created_at` - contenu = avis en clair - Achat article (zap receipt) : kind `9735` (zap) avec tags standard `p`, `e`, plus `site`, `category`, `author`, `series`, `article`, `kind_type: purchase` - amount = millisats, hors frais site gérés off-chain - Paiement remerciement avis : kind `9735` zap avec `kind_type: review_tip`, tags `site`, `category`, `author`, `series`, `article`, `reviewer`, `review_id` - Paiement sponsoring : kind `9735` zap avec `kind_type: sponsoring`, tags `site`, `category`, `author`, `series` (optionnel), `article` (présentation si ciblé) Notes : - Tous les cumuls (sponsoring, paiements article, remerciements avis) calculés via zap receipts filtrés par `kind_type`. - Séries sans sponsoring autorisées (0). ## 2) Média NIP-95 (images/vidéos) - Upload via NIP-95 (encrypted file events). Contraintes : - Images/photos : max 5 Mo, png/jpg/jpeg/webp. - Vidéos : max 45 Mo. - Stockage chiffré (même logique qu’articles) ; URL NIP-95 insérée dans markdown et bannière. - Validation côté client : type MIME, taille, échec → erreur surfacée (pas de fallback). ## 3) Pages / navigation Hiérarchie : site → catégorie (SF/Recherche) → auteurs → auteur → série → articles → article. - Page auteur : liste des séries (cover type “livre”, titre, desc, preview, cumul sponsoring/paiements agrégés via zap receipts). Profil Nostr affiché. - Page série : détails série (cover, desc, preview), cumul sponsoring série + paiements articles de la série, liste d’articles de la série. - Article : preview public, contenu privé chiffré inchangé, bannière NIP-95, média insérés dans markdown. - Rédaction : éditeur markdown + preview live, upload/paste NIP-95 pour images/vidéos, champs bannière (URL NIP-95), sélection série. ## 4) Agrégations financières (hors frais/site) - Sponsoring : zap receipts `kind_type: sponsoring`, filtres `site`, `author`, option `series`. - Paiements articles : zap receipts `kind_type: purchase`. - Remerciements avis : zap receipts `kind_type: review_tip`. - Cumuls par auteur et par série ; pas de détail de lecteurs (sauf auteur du zap pour avis si nécessaire au wording minimal). ## 5) Wording “critiques” - Affichage des avis en tant que “critiques”. - Liste des critiques : afficher contenu + auteur (pubkey→profil) ; pas de liste distincte “critiques” séparée des avis (juste les avis). ## 6) TODO d’implémentation (proposé) - Types : étendre `types/nostr.ts` avec Series, Review, media refs; enum `KindType`. - Upload NIP-95 : service dédié (validation taille/type, retour URL). - Publisher : ajouter création série (event), article avec tags série/media/banner. - Parsing : `nostrEventParsing` pour séries/articles/avis avec tags `kind_type`. - Aggregation : service zap pour cumuls (sponsoring/purchase/review_tip) par auteur/série. - UI : - Form auteur/série/article (cover/banner, sélection série, markdown+preview, upload media). - Pages auteur/série avec stats cumulées. - Pas de stockage local pour méta (tout via events).