Clip range une page web dans vos notes avec le résumé déjà écrit. Aujourd'hui, il s'ouvre à tous les comptes Telli.sh.
Clip ne se contente pas d'enregistrer une page web : il en fait une note Telli.sh avec un titre et un résumé d'une ligne écrits par l'IA. Il avait été livré derrière un drapeau administrateur, si bien que deux compteurs d'analytique ne se sont jamais déclenchés, pas une seule fois. Ce verrou a sauté : les comptes gratuits disposent de 30 enregistrements et 10 résumés IA par jour, et la version 1.18 de l'extension de navigateur ajoute un « Enregistrer dans Telli.sh » au clic droit, qui s'authentifie avec un jeton incapable de faire quoi que ce soit d'autre qu'enregistrer des clips.
Il existe un type de bogue précis qu'aucune suite de tests n'attrape : la fonctionnalité marche, et personne ne peut l'atteindre.
Clip est terminé depuis des semaines. La fenêtre modale enregistre via POST /v1/clip, remplit la carte de lien à partir des balises meta publiques de la page, produit un résumé IA d'une ligne, invalide le cache des notes, et sait déjà faire la différence entre « enregistré, mais votre quota de résumés est épuisé » et « ça a échoué ». Tout cela, fonctionnel. Et dans PostHog, les deux événements qu'il remonte — clip_opened et clip_created — ne s'étaient jamais déclenchés. Pas une fois, pas rarement. Zéro.
La raison tenait en trois lignes de code frontend. Le bouton de la barre latérale et la fenêtre modale étaient tous deux conditionnés à user.is_master, et le bouton portait un badge ambre Aperçu administrateur. Le backend, lui, n'a jamais rien conditionné à is_master : il applique des quotas quotidiens par forfait, ce qui est le bon endroit pour une limite. La fonctionnalité n'était pas inutilisée. Elle était inatteignable.
Depuis le commit 64852ac du 5 septembre 2026, la condition est « quelqu'un est-il connecté ». Cet article est une annonce produit, donc centré sur le produit par construction : voici ce que fait Clip, ce qu'il vous coûte, ce que l'extension de navigateur envoie, et ce qu'elle ne lit délibérément jamais.
TL;DR
- Clip est ouvert à tous les comptes connectés. Le bouton de la barre latérale a perdu son badge administrateur le 5 septembre 2026.
- Les limites sont des quotas quotidiens, pas un verrou. Free obtient 30 enregistrements et 10 résumés IA par jour UTC ; Plus, Pro et Pro+ montent à partir de là. Les chiffres exacts sont dans le tableau ci-dessous.
- Épuiser le quota de résumés ne vous fait pas perdre votre clip. Le lien et ses métadonnées sont quand même enregistrés ; seul le résumé est sauté, et l'application le dit.
- L'extension de navigateur peut enregistrer la page où vous êtes. « Enregistrer dans Telli.sh » se trouve dans le menu du clic droit sur n'importe quelle page http(s), et emporte ce que vous aviez sélectionné. La version 1.18 est en cours d'examen au Chrome Web Store au moment de la publication : elle n'est pas encore installable.
- L'extension s'authentifie avec un jeton qui ne sait qu'enregistrer des clips. Il ne peut pas lire vos notes, modifier votre compte, atteindre la facturation, ni fabriquer un autre jeton. Vous voyez le secret exactement une fois, et vous pouvez le révoquer.
- L'extension lit ce que la page vous montre déjà. Titre, lien canonique, balises
og:/twitter:publiques, et votre sélection. Pas le corps de l'article. Rien ne quitte le navigateur sans votre clic, et sans jeton enregistré l'entrée de menu ne fait absolument rien.
Ce que Clip fait réellement d'une URL
Ouvrez Clip depuis la barre latérale, collez une URL, et la fenêtre modale appelle POST /v1/clip/metadata. Ce point de terminaison récupère le HTML de la page et n'y lit que les balises meta publiques — og:title, og:description, og:image, og:site_name, article:author, article:published_time et le <link rel="canonical">. Titre, description, site et image reviennent déjà remplis. Si la récupération échoue, la fenêtre le dit et vous laisse enregistrer le lien quand même, le nom d'hôte tenant lieu de nom de site.
Puis vous enregistrez, et le clip devient une note. Pas une pièce jointe, pas un signet dans une liste à part : une note avec note_type="clip", posée dans Toutes les notes avec le reste, cherchable, classable en dossiers, partageable et exportable par la même mécanique. L'URL source et la carte de lien entière sont conservées dans le contexte de la note, si bien que l'origine ne disparaît jamais derrière le résumé.
S'il y a quelque chose à résumer — une description, le texte que vous avez sélectionné, une note que vous avez collée —, un résumé général s'exécute et inscrit une ligne de résumé sur la note. C'est la ligne que vous voyez sous le titre dans la liste.

Trois clips enregistrés sur un compte de production le 5 septembre 2026, posés dans Toutes les notes à côté de notes ordinaires. Les deux clips d'articles portent un titre écrit par l'IA et un résumé d'une ligne. La page d'accueil de Hacker News ne publie aucune balise de description et rien n'était sélectionné : il n'y avait donc rien à résumer, elle a gardé son propre titre et n'a pas de ligne de résumé. Quand Clip n'a rien avec quoi travailler, il ne dit rien plutôt que d'inventer.
Ce dernier détail est la règle de conception qui court sous toute la fonctionnalité, et elle mérite d'être énoncée seule : la production de l'IA ne remplace jamais l'original. L'URL source, les métadonnées du site et tout texte que vous avez fourni sont conservés ; le résumé est une donnée dérivée posée par-dessus. Si le résumé est faux ou inutile, la chose que vous avez réellement enregistrée est toujours là.
Les limites sont un quota quotidien, et c'est la seule limite
Il n'y a pas de verrou par forfait sur Clip. Il y a une quantité.
| Forfait | Enregistrements par jour | Résumés IA par jour |
|---|---|---|
| Free | 30 | 10 |
| Plus | 150 | 50 |
| Pro | 500 | 150 |
| Pro+ | 2,000 | 500 |
Valeurs par défaut tirées de backend/config.py (CLIP_SCRAPE_DAILY_QUOTA_*, CLIP_SUMMARY_DAILY_QUOTA_*), lues le 5 septembre 2026.
Deux quotas, pas un, et ils échouent différemment exprès. Épuisez les enregistrements et l'enregistrement est refusé : le serveur répond 403 avec un code structuré clip_scrape_quota_exceeded et une date de réinitialisation. Épuisez les résumés et le clip est quand même enregistré ; seule l'étape du résumé est sautée, et l'application vous dit exactement cela : « Clip enregistré. Le quota de résumés IA du jour a été utilisé. »
Cette asymétrie est délibérée. Enregistrer un lien coûte peu et c'est ce que vous vouliez vraiment ; résumer, c'est la partie chère. Perdre une page que vous vouliez garder parce qu'un modèle de langue était limité en débit serait un marché absurde, alors nous ne le passons pas.
Le compteur est une simple date de calendrier UTC. À 00:00 UTC, votre journée repart — au même instant pour tout le monde, et non selon une fenêtre glissante de 24 heures qu'il faudrait garder en tête.
« Enregistrer dans Telli.sh » est à un clic droit — une fois la 1.18 approuvée
La fenêtre modale du web suppose que vous avez l'URL dans le presse-papiers. En général, vous avez plutôt la page ouverte.
Telli.sh : Every Translator 1.18 ajoute une entrée de menu contextuel, Enregistrer dans Telli.sh, enregistrée pour les contextes page et selection sur http://*/* et https://*/* — n'importe quelle page web, pas seulement la trentaine de sites sur lesquels l'extension traduit. Clic droit n'importe où dans un article, et c'est enregistré. Sélectionnez d'abord trois paragraphes et ils partent avec, jusqu'à 2 000 caractères.
Le retour passe par la pastille de la barre d'outils que l'extension possède déjà : … pendant l'enregistrement, ✓ en cas de succès, ! en cas d'échec, chacun avec une explication dans l'infobulle de la barre d'outils. Les messages d'échec sont précis parce que les erreurs du serveur le sont. Un 401 signifie que le jeton a été rejeté et qu'il vous en faut un nouveau. Un 403 signifie l'une de deux choses bien distinctes, et l'extension les distingue en cherchant un code *_quota_exceeded dans le corps de la réponse : quota épuisé (« revenez demain ») contre jeton sans autorisation de clip (« ce jeton ne peut pas faire ça »). Même code de statut, conseil inverse.
La version 1.18 a été soumise au Chrome Web Store et est en cours d'examen au 5 septembre 2026. Vous ne pouvez pas encore l'installer. Une fois approuvée, elle arrive en mise à jour automatique, et le menu contextuel apparaît avec elle.
Une clé en écriture seule : le jeton sait enregistrer des clips et rien d'autre
Voici la partie qui nous tient le plus à cœur, parce que c'est là que ce genre d'intégration tourne mal d'habitude.
La version paresseuse de « connecter l'extension à votre compte » consiste à vous faire coller votre jeton de session dans l'extension. Ce jeton ouvre tout : il supprime des notes, exporte vos données, touche à la facturation. Vous céderiez des identifiants de compte complets contre un bouton de signet, et ils resteraient pour toujours dans le stockage de l'extension.
Clip n'utilise donc pas ce jeton. Telli.sh délivre des jetons d'API à portée limitée, sur le modèle de ceux de Cloudflare : un jeton porte une liste de règles au lieu de vous représenter, et chaque règle est un effect (allow ou deny, deny l'emportant), un ensemble de resources et un ensemble de groupes d'autorisations. Aujourd'hui il existe exactement un groupe, clip_write, qui se déploie en les autorisations clip:write et clip:metadata, et exactement une forme de ressource, {"user": "self"} — vos propres données, rien d'autre.
Nous appelons cela une clé en écriture seule, parce que c'est bien sa forme : elle peut mettre des choses dans votre compte et n'en sortir aucune.
L'invariant de sécurité qui rend cela réel tient en une phrase dans le document de conception : un jeton d'API ne passe jamais par le chemin d'authentification de session. Les cookies de session et les JWT d'accès se résolvent via get_current_user_optional, qui atteint tous les points de terminaison du produit. Les jetons d'API ne se résolvent que via la dépendance require_permission(...), et si l'autorisation demandée par cette dépendance n'est pas dans le jeton, la réponse est 403. Cassez cette séparation et un jeton à portée limitée redevient discrètement un jeton de compte complet — c'est pourquoi c'est énoncé comme la règle la plus importante de la conception. Il y a un effet de second ordre bienvenu : un jeton d'API est une chaîne opaque, donc le décodage JWT échoue toujours dessus. Si l'un d'eux se glissait par erreur dans un chemin de code de session, il s'authentifierait comme personne.
L'API des jetons est elle-même fermée aux jetons. Créer, lister et révoquer des jetons exige une vraie session connectée : un jeton ne peut pas en fabriquer un autre.
En créer un prend une quinzaine de secondes
Allez dans Réglages → Jetons d'API. Avant que vous n'en ayez un, la page est honnête sur ce que peut faire la chose que vous vous apprêtez à créer.

La page des jetons d'API à /settings/tokens avant qu'un jeton existe, capturée le 5 septembre 2026. La ligne sur la portée est posée au-dessus du formulaire, pas enterrée dans un article d'aide : « Un jeton ne peut qu'enregistrer des clips. Il ne peut pas lire vos notes, modifier votre compte ni atteindre vos informations de facturation. » Une seule autorisation est proposée, parce qu'une seule existe.
Nommez-le, cochez Enregistrer des clips, créez. Le secret complet apparaît une fois, dans un panneau qui le dit en rouge.

Le panneau du secret à usage unique. Le jeton de cette capture est masqué, et le compte auquel il appartenait a été supprimé. Un jeton s'écrit tsh_<préfixe de 12 caractères>_<secret de 43 caractères> — 256 bits d'aléa en base64url. Seul le préfixe est stocké en clair, comme clé de recherche ; le secret est stocké sous forme de hachage bcrypt et n'est récupérable ni par nous ni par vous. Fermez ce panneau et il est parti pour de bon.
Ensuite, la liste montre le préfixe et rien de plus. C'est suffisant pour distinguer deux jetons et inutile à qui vole la capture d'écran.

Le même jeton une fois le panneau du secret refermé : préfixe, portée, heure de création, heure de dernière utilisation, et Révoquer. last_used_at est écrit au plus une fois par heure plutôt qu'à chaque requête, ce qui vous dit à peu près quand un jeton a servi pour la dernière fois sans transformer chaque clip en écriture supplémentaire en base. Révoquer positionne revoked_at — immédiat, définitif, et pas une suppression dure : la trace de ce qui a existé subsiste.
Connecter l'extension : cinq étapes
- Connectez-vous sur telli.sh et ouvrez Réglages → Jetons d'API (
/settings/tokens). - Saisissez un nom que vous reconnaîtrez plus tard — « Extension de navigateur » n'est pas le texte d'exemple par hasard —, cochez Enregistrer des clips, et appuyez sur Créer le jeton.
- Appuyez sur Copier le jeton pendant que le panneau à usage unique est ouvert. Il n'y a pas de seconde chance ; si vous le perdez, révoquez ce jeton et faites-en un autre.
- Ouvrez la page de réglages de l'extension, trouvez la section Telli.sh Clip, collez le jeton dans Jeton Telli.sh Clip, et appuyez sur Connecter.
- Faites un clic droit sur n'importe quelle page web et choisissez Enregistrer dans Telli.sh. La pastille de la barre d'outils affiche
✓et le clip est dans Toutes les notes.

L'extension après l'étape 4, capturée le 5 septembre 2026. La ligne de statut n'affiche que le préfixe : l'extension montre ce que montre la liste des jetons. Le texte d'aide énonce le modèle de stockage sans détour : « Il est stocké sur cet appareil uniquement, et l'enregistrement des clips reste désactivé tant qu'aucun jeton n'est ajouté. » Pas de jeton, pas de clip ; l'entrée de menu existe mais ne fait rien.
Ce que l'extension lit, exactement
Les promesses de confidentialité ne coûtent rien. Voici le comportement du code, la seule version qui compte.
Quand vous cliquez sur Enregistrer dans Telli.sh, l'extension injecte une seule fonction dans la page et lit huit champs : og:title ou twitter:title avec repli sur document.title ; og:description, twitter:description ou description ; le lien canonique ; og:image ou twitter:image ; og:site_name ou application-name ; article:author ou author ; article:published_time ; et window.getSelection().
Relisez cette liste pour ce qui n'y est pas. Il n'y a pas de document.body. Pas d'extraction du texte de l'article, pas de passe de lisibilité, pas de parcours du DOM. Sept des huit champs sont des métadonnées que la page publie pour Google et pour les aperçus des réseaux sociaux — des données écrites pour être lues par des inconnus. Le huitième est le texte que vous avez surligné vous-même.
Quatre autres propriétés tiennent dans le code :
Rien n'est envoyé sans un clic. La fonction de métadonnées s'exécute à l'intérieur du gestionnaire du menu contextuel. Il n'y a pas d'alarme en arrière-plan, pas de crochet au chargement de page, pas de mode « collecte pendant que vous naviguez ».
Sans jeton, il ne se passe strictement rien. Le gestionnaire vérifie d'abord la présence d'un jeton Telli.sh enregistré et s'arrête là s'il n'y en a pas, en affichant une pastille qui vous invite à en connecter un. Sur une installation neuve, l'entrée de menu est inerte.
Votre cookie de session ne peut pas être emprunté. L'extension détient une permission d'hôte pour telli.sh, ce qui signifie normalement que ses appels fetch emportent automatiquement vos cookies de connexion — et le cookie s'authentifierait avant le jeton, accordant l'accès complet au compte au lieu de la portée limitée aux clips que nous avons conçue. La requête est donc envoyée avec credentials: 'omit'. Le jeton est le seul identifiant en jeu, et la portée que vous avez choisie est celle qui s'applique. C'est cette unique option qui rend la clé en écriture seule réellement en écriture seule.
Là où l'extension n'a pas accès à la page, elle envoie moins, pas plus. L'injection de script exige un accès à l'hôte, que l'extension ne détient que pour les sites déclarés dans son manifeste. Partout ailleurs, l'injection échoue simplement et le clip se rabat sur la seule URL ; le serveur remplit alors la carte à partir des balises meta publiques de la page. Le mode de défaillance, c'est « moins de données », jamais « demander des permissions plus larges ».
Et quand le serveur récupère une URL, il le fait en visiteur, pas en robot d'indexation. Il refuse localhost, tout hôte en .local, et tout nom d'hôte qui se résout vers une adresse IP privée, de bouclage, lien-local, multicast, réservée ou non spécifiée — résolue et vérifiée, pas seulement comparée à un motif, si bien qu'un nom DNS public pointant vers 10.0.0.1 est rejeté lui aussi. Il suit au plus 3 redirections et lit au plus 256 Ko de HTML. Il ne se connecte pas, n'emporte pas vos cookies, et ne tente rien qu'un visiteur déconnecté ne pourrait pas récupérer. Les pages payantes et privées restent payantes et privées — enregistrez-en plutôt le texte que vous avez sélectionné vous-même.
Une dernière note de mesure, puisque nous avons ouvert cet article sur une histoire d'analytique. Les clips faits par l'extension ne touchent jamais l'application web, donc le frontend ne peut pas les voir ; c'est le serveur qui remonte clip_created pour ceux-là. Cet événement porte l'application source, le type de source, la présence ou non d'une sélection, la génération ou non d'un résumé, et le forfait. Il ne porte ni URL, ni titre, ni texte sélectionné — combien de clips ont été faits et par quel chemin, jamais ce qu'ils contenaient.
En résumé : une application de notes qui ne garde que ce que vous avez dit n'est qu'une demi-mémoire
Telli.sh a commencé comme un endroit pour le travail parlé : enregistrer une réunion, la transcrire dans la langue réellement parlée, la traduire, la résumer, garder les quatre couches dans une même note. Cela couvre ce que vous avez dit.
Cela ne couvre pas ce que vous avez lu, qui représente l'essentiel de ce que vous savez. L'onglet que vous avez laissé ouvert trois jours. La page de documentation dont vous aurez de nouveau besoin dans un mois. Le fil de commentaires où se trouve la vraie réponse. Tout cela vit dans un historique de navigation que vous ne fouillerez jamais et dans une barre de favoris que vous avez cessé d'ouvrir en 2019.
Clip est l'autre moitié qui arrive : la même note, la même recherche, les mêmes dossiers, le même export — atteints par un clic droit plutôt que par un micro. La direction, c'est une base de données personnelle unique où vos mots et vos sources se tiennent côte à côte, et voici la première surface de collecte tournée vers le web.
Le verrou a sauté. Les compteurs ont enfin de quoi compter.
Essayez : connectez-vous, ouvrez Clip dans la barre latérale, et collez l'URL de cette chose que vous vous promettez de garder. Les comptes gratuits disposent de 30 enregistrements et 10 résumés IA par jour. Quand l'extension 1.18 aura passé l'examen du Chrome Web Store, la même chose deviendra un clic droit sur n'importe quelle page que vous êtes déjà en train de lire.
Ouvrir Telli.sh et enregistrer votre premier clip
Sources
- Dépôt Telli.sh, commit
64852ac, 5 septembre 2026 — « feat(clip): open Clip to every signed-in user », qui a retiré le verrouis_masteret le badge Aperçu administrateur, et a consigné queclip_createdetclip_openedne s'étaient jamais déclenchés dans PostHog. - Dépôt Telli.sh,
backend/config.py— les valeurs par défautCLIP_SCRAPE_DAILY_QUOTA_*etCLIP_SUMMARY_DAILY_QUOTA_*, lues le 5 septembre 2026. - Dépôt Telli.sh,
docs/SUPERAPP_BASELINE.md— la base de référence de Clip et ses règles de sûreté : pas de contournement de connexion ni de paywall, pas d'aspiration en masse, résumé limité au texte fourni par l'utilisateur et aux métadonnées publiques, et la règle selon laquelle la production de l'IA ne remplace jamais l'original. - Dépôt Telli.sh,
docs/design/API_TOKEN_RBAC_DESIGN.md— la conception des jetons à portée limitée : structure des règles, le formattsh_<prefix>_<secret>, le stockage bcrypt, et l'invariant selon lequel les jetons d'API ne se résolvent jamais par le chemin d'authentification de session. - Dépôt Telli.sh,
extension/extension/background.js—readClipMetadataFromPage,collectClipMetadataetsaveClip, 5 septembre 2026 : les huit champs de métadonnées, le déclenchement uniquement au clic, la sortie anticipée sans jeton, etcredentials: 'omit'. - Telli.sh : Every Translator sur le Chrome Web Store — la fiche à laquelle la version 1.18 a été soumise ; en cours d'examen au 5 septembre 2026.
- Page produit de Telli.sh: Every Translator — les sites pris en charge, les modes d'affichage, les fournisseurs et les engagements de confidentialité au même endroit.
- La fenêtre de l'extension répondait à la mauvaise question. Dans la 1.16, elle dessine la page où vous vous trouvez., 4 septembre 2026 — la version précédente de l'extension, pour la page de réglages où vit le champ du jeton Clip.