story-research-zapwall/docs/tag-system-explanation.md
2026-01-06 00:26:31 +01:00

6.3 KiB

Système de tags zapwall.fr

Vue d'ensemble

Le système de tags de zapwall.fr utilise un système de tags personnalisé basé sur les tags standards de Nostr (kind 1 notes). Tous les événements sont des notes Nostr (kind 1), et le système utilise des tags en anglais pour identifier le type de contenu, la catégorie, et les métadonnées associées.

Structure des tags

Tags de base (tous les types)

Tous les événements incluent ces tags de base :

  • Type : Tag simple (sans valeur) qui identifie le type de contenu

    • #author : Présentation d'auteur
    • #series : Série d'articles
    • #publication : Article/publication
    • #quote : Avis/review
  • Catégorie : Tag simple qui identifie la catégorie

    • #sciencefiction : Science-fiction
    • #research : Recherche scientifique
  • Identifiant : Tag avec valeur pour l'ID unique

    • ["id", "<event_id>"] : Identifiant unique de l'événement
  • Service : Tag avec valeur pour identifier la plateforme

    • ["service", "zapwall.fr"] : Identifiant du service (toujours présent pour filtrer toutes les notes de zapwall.fr)
  • Paywall : Tag simple (optionnel)

    • #paywall : Indique que le contenu est payant
  • Payment : Tag simple (optionnel)

    • #payment : Indique qu'un paiement a été effectué

Tags spécifiques par type

Tags pour #author (présentation d'auteur)

["author"]                    // Type
["sciencefiction"] ou ["research"]  // Catégorie
["id", "<event_id>"]         // ID unique
["title", "<titre>"]         // Titre de la présentation
["preview", "<aperçu>"]       // Aperçu (optionnel)
["mainnet_address", "<adresse>"]  // Adresse Bitcoin mainnet pour le sponsoring
["total_sponsoring", "<montant>"] // Total du sponsoring reçu (en sats)
["picture", "<url>"]          // URL de la photo de profil (optionnel)

Exemple de tags pour une présentation d'auteur :

[
  ["author"],
  ["sciencefiction"],
  ["id", "abc123..."],
  ["service", "zapwall.fr"],
  ["title", "Présentation de John Doe"],
  ["preview", "Aperçu de la présentation..."],
  ["mainnet_address", "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"],
  ["total_sponsoring", "0"],
  ["picture", "https://cdn.nostrcheck.me/..."]
]

Tags pour #publication (article)

["publication"]               // Type
["sciencefiction"] ou ["research"]  // Catégorie
["id", "<event_id>"]         // ID unique
["title", "<titre>"]         // Titre de l'article
["preview", "<aperçu>"]       // Aperçu (optionnel)
["series", "<series_id>"]    // ID de la série (optionnel)
["banner", "<url>"]           // URL de la bannière (optionnel)
["zap", "<montant>"]         // Montant en sats pour débloquer
["invoice", "<bolt11>"]       // Facture BOLT11 (optionnel)
["payment_hash", "<hash>"]    // Hash du paiement (optionnel)
["encrypted_key", "<key>"]    // Clé de chiffrement (optionnel)

Tags pour #series (série)

["series"]                    // Type
["sciencefiction"] ou ["research"]  // Catégorie
["id", "<event_id>"]         // ID unique
["title", "<titre>"]         // Titre de la série
["description", "<description>"]  // Description de la série
["preview", "<aperçu>"]       // Aperçu (optionnel)
["cover", "<url>"]            // URL de la couverture (optionnel)

Tags pour #quote (avis/review)

["quote"]                     // Type
["article", "<article_id>"]   // ID de l'article commenté
["reviewer", "<pubkey>"]      // Clé publique du reviewer (optionnel)
["title", "<titre>"]          // Titre de l'avis (optionnel)

Filtrage et requêtes

Le système utilise buildTagFilter pour construire des filtres de requête Nostr :

// Exemple : récupérer toutes les présentations d'auteurs de zapwall.fr
buildTagFilter({
  type: 'author',
  category: 'sciencefiction',
  service: 'zapwall.fr'
})
// Résultat : { kinds: [1], "#author": [""], "#sciencefiction": [""], "#service": ["zapwall.fr"] }

// Exemple : récupérer une présentation spécifique
buildTagFilter({
  type: 'author',
  authorPubkey: 'abc123...',
  service: 'zapwall.fr'
})
// Résultat : { kinds: [1], "#author": [""], "#service": ["zapwall.fr"], authors: ["abc123..."] }

// Exemple : récupérer toutes les notes de zapwall.fr
buildTagFilter({
  service: 'zapwall.fr'
})
// Résultat : { kinds: [1], "#service": ["zapwall.fr"] }

Extraction des tags

Le système utilise extractTagsFromEvent pour extraire les tags d'un événement :

const tags = extractTagsFromEvent(event)
// Retourne un objet avec :
// - type: 'author' | 'series' | 'publication' | 'quote'
// - category: 'sciencefiction' | 'research'
// - id: string
// - paywall: boolean
// - payment: boolean
// - title, preview, mainnetAddress, etc. selon le type

Tag service

Le tag ["service", "zapwall.fr"] est utilisé pour identifier toutes les notes publiées par la plateforme zapwall.fr. Ce tag permet de :

  • Filtrer toutes les notes de la plateforme : buildTagFilter({ service: 'zapwall.fr' })
  • Distinguer les notes zapwall.fr des autres notes Nostr sur le réseau
  • Améliorer les performances en filtrant dès la source lors des requêtes

Note : Aucun NIP (Nostr Improvement Proposal) ne spécifie actuellement un tag standardisé pour identifier un service/plateforme. Le tag service est donc une convention interne à zapwall.fr. Si un NIP standardisé émerge à l'avenir, le système pourra être adapté en conséquence.

Avantages du système

  1. Standardisé : Tous les événements sont des notes Nostr (kind 1), compatibles avec tous les clients Nostr
  2. Filtrable : Les tags permettent de filtrer efficacement les événements par type, catégorie et service
  3. Extensible : Facile d'ajouter de nouveaux types ou catégories
  4. Interopérable : Les tags sont lisibles par n'importe quel client Nostr, même s'il ne comprend pas la structure complète
  5. Identifiable : Le tag service permet de distinguer les notes zapwall.fr des autres notes Nostr

Détection des auteurs

Les auteurs sont détectés via le tag #author dans les événements. Le système souscrit aux événements avec :

  • #author : Pour identifier les présentations d'auteurs
  • #publication : Pour identifier les articles

Cela permet de distinguer les auteurs (présentations) des articles (publications) dans le même flux d'événements.