Second Brain documentation

ADR 0075 – Titre automatique des liens collés

Accepté (2026-10-16, mode autonome)

← Toutes les décisions

ADR 0075 – Titre automatique des liens collés

Statut : Accepté (2026-10-16, mode autonome)

Idée de la vague 3 du document d’idées : coller une adresse dans une note ou dans la capture donne un lien lisible (« Un bel article ») au lieu d’une URL brute, comme Notion ou Obsidian avec ses extensions de titre.

Décision

Renvoie { url, title } (title absent quand la page n’en donne pas ou n’est pas joignable). Le serveur va chercher une page choisie par l’utilisateur : c’est un risque SSRF, d’où des limites strictes (LinkTitleService) :

  • Adresse : http ou https seulement, sans identifiants (user:pass@), ports 80 et 443 seulement, 2 000 caractères au plus. Le nom est résolu et toutes ses adresses sont refusées si l’une est locale, de boucle, privée (10/8, 172.16/12, 192.168/16), de liaison locale (169.254/16, dont les métadonnées des clouds), partagée (100.64/10), réservée, multicast, ou IPv6 locale unique (fc00::/7) ; une IPv6 qui porte une IPv4 (::/96, NAT64 64:ff9b::/96, 6to4 2002::/16) est jugée sur cette IPv4. Refus = 400.
  • Redirections : suivies à la main, 3 au plus, chaque adresse revérifiée comme la première.
  • Lecture : un seul GET par saut, 3 s de connexion, 6 s au total (le fil dédié est interrompu et sa socket fermée au-delà, la place est rendue), 256 Ko au plus lus par blocs, recherche du titre linéaire (pas d’expression qui réessaie), caractères de contrôle et de mise en forme retirés, seulement text/html et application/xhtml+xml, quatre requêtes en parallèle au plus (les suivantes répondent sans titre). Jeu de caractères de l’en-tête, sinon de la balise meta, sinon UTF-8 ; entités HTML décodées, blancs réduits, 200 caractères au plus.
  • Un échec réseau, un code d’erreur ou une page sans titre ne sont pas des erreurs : title est absent et le client garde l’adresse.
  • Le serveur ne renvoie que le titre, jamais le contenu de la page.
  • Propriété app.link-title.allow-private (faux par défaut) : levée uniquement par les tests, qui parlent à un serveur local.

Éditeur Markdown

  • Visuel : coller une adresse seule, sans sélection et hors code, l’insère tout de suite comme lien (le texte est l’adresse), puis le texte devient le titre de la page quand il arrive (retrouvé par son adresse, donc même si on a continué à écrire). Sans titre, le lien reste tel quel.
  • Source : même collage ; l’adresse devient [titre](adresse) (crochets du titre échappés, adresse entre <> si elle contient des parenthèses), la position du curseur est conservée.
  • Le titre n’est appliqué que si l’on est resté dans le même mode et que le texte n’a pas changé ailleurs ; il vise le collage lui-même (position la plus proche, ou emplacement d’origine dans la source) et jamais le début d’une adresse plus longue.
  • Dans l’éditeur visuel, remplacer l’adresse par le titre est une étape d’annulation à part : Ctrl+Z rend d’abord l’adresse.
  • Tout autre collage (texte plus long, plusieurs adresses, sélection non vide, bloc de code) garde le comportement habituel.

Capture

Une ligne capturée qui est une seule adresse crée un nœud d’inbox titré par la page, au corps [titre](adresse). Le titre est cherché hors de la transaction d’écriture. Sans titre trouvé, ou pour une adresse refusée, la capture se comporte comme avant (l’adresse est le titre). L’aperçu à la frappe ne fait aucune requête réseau.

Alternatives écartées

  • Récupération côté navigateur : bloquée par CORS, et l’adresse IP de l’utilisateur partirait vers des sites tiers.
  • Épingler l’adresse résolue pour la connexion (contre le rebinding DNS) : demande un client HTTP à résolveur propre ; le risque est réduit parce que seuls des ports web et le titre sortent. À reprendre si le serveur est exposé à des tiers.
  • Cache des titres : inutile pour un usage personnel.
  • Aperçus riches (image, description Open Graph) : hors périmètre.
  • Titre dans l’aperçu de la capture : un appel réseau à chaque frappe ; le titre est cherché à l’envoi.

Limites connues

  • Entre la vérification de l’adresse et la requête, un nom peut être résolu autrement (rebinding DNS) ; l’impact se limite à un titre de page sur un port 80 ou 443.
  • Les pages qui fabriquent leur titre en JavaScript ou qui bloquent les robots n’en donnent pas.