product update13 мин чтения

Clip кладёт веб-страницу в заметки с уже написанной выжимкой. Сегодня он открывается для каждого аккаунта Telli.sh

Clip не просто сохраняет веб-страницу: он превращает её в заметку Telli.sh с заголовком и однострочной сводкой, написанными ИИ. Он вышел под админским флагом, поэтому два счётчика аналитики не сработали ни разу. Этого барьера больше нет: бесплатные аккаунты получают 30 сохранений и 10 сводок ИИ в день, а версия 1.18 браузерного расширения добавляет пункт «Сохранить в Telli.sh» в контекстное меню, который авторизуется токеном, не умеющим ничего, кроме сохранения клипов.

K
Ken Jo
#clip#web-clipper#browser-extension#product-update#api-tokens#privacy

Есть особый род ошибки, который не ловит ни один набор тестов: функция работает, и до неё никто не может добраться.

Clip готов уже несколько недель. Модальное окно сохраняет через POST /v1/clip, заполняет карточку ссылки из публичных мета-тегов страницы, генерирует однострочную сводку от ИИ, сбрасывает кэш заметок и уже различает «сохранено, но у вас закончилась квота на сводки» и «это не удалось». Всё это — работает. А в PostHog два события, о которых он сообщает, — clip_opened и clip_created — не срабатывали никогда. Ни разу, не «редко». Ноль.

Причиной были три строки кода во фронтенде. Кнопка на боковой панели и модальное окно были закрыты условием user.is_master, а на кнопке висел янтарный значок Admin preview. Бэкенд никогда не проверял is_master — он применяет дневные квоты по тарифу, и это правильное место для ограничения. Функцией не то чтобы не пользовались. До неё нельзя было добраться.

С коммита 64852ac от 5 сентября 2026 года условие звучит как «кто-то вошёл в аккаунт». Этот текст — анонс продукта, поэтому он намеренно продуктовый: вот что делает Clip, во что он вам обходится, что отправляет браузерное расширение и чего оно принципиально никогда не читает.

TL;DR

  • Clip открыт для каждого аккаунта, вошедшего в систему. Кнопка на боковой панели лишилась админского значка 5 сентября 2026 года.
  • Ограничения — это дневные квоты, а не барьер. Бесплатный тариф получает 30 сохранений и 10 сводок ИИ за сутки по UTC; plus, pro и pro+ идут выше. Точные числа — в таблице ниже.
  • Исчерпанная квота на сводки не отнимает у вас клип. Ссылка и её метаданные всё равно сохраняются; пропускается только сводка, и приложение об этом сообщает.
  • Браузерное расширение умеет сохранять страницу, на которой вы находитесь. «Сохранить в Telli.sh» живёт в контекстном меню на любой http(s)-странице и уносит с собой то, что вы выделили. На момент публикации версия 1.18 находится на проверке в Chrome Web Store — установить её пока нельзя.
  • Расширение авторизуется токеном, который умеет только сохранять клипы. Он не может читать ваши заметки, менять аккаунт, дотянуться до оплаты или выпустить ещё один токен. Секрет вы видите ровно один раз, и его можно отозвать.
  • Расширение читает то, что страница вам и так показывает. Заголовок, каноническую ссылку, публичные мета og:/twitter: и ваше выделение. Не тело статьи. Ничего не покидает браузер без вашего клика, а без сохранённого токена пункт меню не делает вообще ничего.

Что Clip на самом деле делает с URL

Откройте Clip на боковой панели, вставьте URL — и модальное окно вызовет POST /v1/clip/metadata. Этот эндпоинт загружает HTML страницы и читает только её публичные мета-теги — og:title, og:description, og:image, og:site_name, article:author, article:published_time и <link rel="canonical">. Заголовок, описание, сайт и картинка возвращаются уже заполненными. Если загрузка не удалась, окно так и говорит и всё равно даёт сохранить ссылку, подставив имя хоста вместо названия сайта.

Дальше вы сохраняете — и клип становится заметкой. Не вложением, не закладкой в отдельном списке, а заметкой с note_type="clip", которая лежит во «Всех заметках» рядом со всем остальным: ищется, раскладывается по папкам, делится и экспортируется той же машинерией. Исходный URL и вся карточка ссылки сохраняются в контексте заметки, так что происхождение никогда не теряется за сводкой.

Если есть что резюмировать — описание, выделенный вами текст, вставленная вами пометка, — запускается общая сводка и записывает в заметку одну строку. Это та строка, которую вы видите под заголовком в списке.

Три сохранённые веб-страницы в списке «Все заметки» Telli.sh: Hacker News без строки сводки, Fetch API Overview and Practical Considerations и GitHub как платформа разработки на базе ИИ — у каждой снизу однострочная сводка

Три клипа, сохранённые в рабочем аккаунте 5 сентября 2026 года, лежат во «Всех заметках» рядом с обычными заметками. У двух клипов со статьями есть написанный ИИ заголовок и однострочная сводка. Главная страница Hacker News не публикует мета-описания, и выделенного текста не было, так что резюмировать было нечего — она сохранила собственный заголовок и осталась без строки сводки. Когда Clip не с чем работать, он молчит, а не выдумывает.

Эта последняя деталь — правило проектирования, лежащее под всей функцией, и его стоит произнести отдельно: вывод ИИ никогда не заменяет оригинал. Исходный URL, собственные метаданные сайта и любой предоставленный вами текст сохраняются; сводка — производные данные поверх них. Если сводка ошибочна или бесполезна, то, что вы на самом деле сохранили, никуда не делось.

Ограничения — это дневная квота, и других ограничений нет

Тарифного барьера у Clip нет. Есть количество.

ТарифСохранений в деньСводок ИИ в день
Free3010
Plus15050
Pro500150
Pro+2,000500

Значения по умолчанию из backend/config.py (CLIP_SCRAPE_DAILY_QUOTA_*, CLIP_SUMMARY_DAILY_QUOTA_*), считаны 5 сентября 2026 года.

Квоты две, а не одна, и отказывают они по-разному намеренно. Кончились сохранения — сохранение отклоняется: сервер отвечает 403 со структурированным кодом clip_scrape_quota_exceeded и датой сброса. Кончились сводки — клип всё равно сохраняется; пропускается только шаг сводки, и приложение говорит об этом прямо: «Клип сохранён. Сегодняшняя квота на сводки ИИ израсходована.»

Эта асимметрия сделана специально. Сохранить ссылку дёшево, и именно этого вы хотели; резюмирование — дорогая часть. Потерять страницу, которую вы собирались оставить себе, из-за того что языковую модель ограничили по частоте, было бы нелепым обменом, поэтому мы так не делаем.

Счётчик — обычная календарная дата по UTC. В 00:00 UTC ваш день начинается заново — один и тот же момент для всех, а не скользящее 24-часовое окно, о котором надо думать.

«Сохранить в Telli.sh» — в одном правом клике, как только одобрят 1.18

Веб-окно исходит из того, что URL у вас в буфере обмена. Обычно у вас вместо этого открыта сама страница.

Telli.sh: Every Translator 1.18 добавляет пункт контекстного меню Сохранить в Telli.sh, зарегистрированный и для контекста page, и для selection на http://*/* и https://*/* — на любой веб-странице, а не только на трёх десятках сайтов, где расширение переводит. Кликните правой кнопкой где угодно в статье — и она сохранится. Выделите сначала три абзаца — и они уйдут вместе с ней, до 2 000 символов.

Обратная связь идёт через значок на панели инструментов, который у расширения уже есть: во время сохранения, при успехе, ! при ошибке, и к каждому — пояснение во всплывающей подсказке. Сообщения об ошибках конкретны, потому что конкретны ошибки сервера. 401 означает, что токен отклонён и нужен новый. 403 означает две разные вещи, и расширение различает их, ища в теле ответа код *_quota_exceeded: исчерпанная квота («приходите завтра») против токена без разрешения на клипы («этот токен так не умеет»). Один и тот же код состояния — противоположные советы.

Версия 1.18 отправлена в Chrome Web Store и по состоянию на 5 сентября 2026 года находится на проверке. Установить её пока нельзя. После одобрения она придёт автоматическим обновлением, и вместе с ней появится пункт контекстного меню.

Ключ только на запись: токен умеет сохранять клипы и больше ничего

Вот часть, которая волнует нас больше всего, потому что именно здесь такие интеграции обычно портятся.

Ленивая версия «подключите расширение к своему аккаунту» — попросить вас вставить в расширение сессионный токен. Такой токен открывает всё: он удаляет заметки, выгружает ваши данные, трогает оплату. Вы отдали бы полные учётные данные аккаунта в обмен на кнопку-закладку, и они лежали бы в хранилище расширения вечно.

Поэтому Clip такой токен не использует. Telli.sh выпускает API-токены с ограниченной областью действия, по образцу Cloudflare: токен несёт список политик, а не подменяет собой вас, и каждая политика — это effect (allow или deny, причём deny побеждает), набор resources и набор групп разрешений. Сегодня существует ровно одна группа, clip_write, разворачивающаяся в разрешения clip:write и clip:metadata, и ровно одна форма ресурса — {"user": "self"}, то есть ваши собственные данные и ничего больше.

Мы называем это ключом только на запись, потому что такова его форма: он умеет класть вещи в ваш аккаунт и ничего из него не вынимает.

Инвариант безопасности, который делает это настоящим, — одно предложение из проектного документа: API-токен никогда не проходит по пути сессионной аутентификации. Сессионные куки и access-JWT разрешаются через get_current_user_optional, который доходит до каждого эндпоинта продукта. API-токены разрешаются только через зависимость require_permission(...), и если запрошенного этой зависимостью разрешения в токене нет, ответ — 403. Сломайте это разделение — и ограниченный токен тихо снова становится токеном полного доступа; именно поэтому это записано как самое важное правило проекта. Есть полезный эффект второго порядка: API-токен — непрозрачная строка, поэтому декодирование JWT на нём всегда проваливается. Если бы он по ошибке попал в сессионный путь, он аутентифицировался бы как никто.

Сам API токенов для токенов закрыт. Создание, просмотр и отзыв токенов требуют настоящей сессии с входом — токен не может выпустить другой токен.

Создать его — примерно пятнадцать секунд

Откройте Настройки → API-токены. Пока токена у вас нет, страница честно рассказывает, на что способно то, что вы собираетесь создать.

Страница настроек API-токенов Telli.sh, пока токенов нет: форма создания с полем имени токена и единственным флажком разрешения «Сохранять клипы», а также пустое состояние с надписью «Токенов пока нет»

Страница API-токенов по адресу /settings/tokens до создания первого токена, снимок от 5 сентября 2026 года. Строка об области действия стоит над формой, а не закопана в справочной статье: «Токен может только сохранять клипы. Он не может читать ваши заметки, менять аккаунт или добраться до платёжных данных». Предлагается одно разрешение, потому что одно разрешение — это всё, что существует.

Дайте имя, отметьте Сохранять клипы, создайте. Полный секрет появляется один раз — в панели, которая красным об этом и предупреждает.

Одноразовая панель токена с надписью «Скопируйте токен сейчас», предупреждением, что токен показывается единственный раз, частично скрытым токеном tsh_ и кнопками «Скопировать токен» и «Я сохранил»

Панель одноразового секрета. Токен на этом снимке скрыт, а аккаунт, которому он принадлежал, удалён. Токен имеет вид tsh_<префикс из 12 символов>_<секрет из 43 символов> — 256 бит случайности в base64url. В открытом виде хранится только префикс, как ключ поиска; секрет хранится как bcrypt-хеш и не восстанавливается ни нами, ни вами. Закройте эту панель — и он пропал навсегда.

Дальше список показывает префикс и больше ничего. Этого хватает, чтобы отличить два токена, и совершенно бесполезно тому, кто украдёт скриншот.

Список токенов с одним токеном «Моё браузерное расширение», значком «Активен», его префиксом tsh_, областью «Сохранять клипы», отметкой времени создания, строкой «Последнее использование: не использовался» и красным действием «Отозвать»

Тот же токен после закрытия панели секрета: префикс, область действия, время создания, время последнего использования и «Отозвать». last_used_at записывается не чаще раза в час, а не на каждый запрос, поэтому он примерно показывает, когда токен был активен в последний раз, не превращая каждый клип в лишнюю запись в базе. Отзыв проставляет revoked_at — мгновенно, окончательно и без физического удаления, так что след того, что существовало, остаётся.

Подключение расширения: пять шагов

  1. Войдите на telli.sh и откройте Настройки → API-токены (/settings/tokens).
  2. Введите имя, которое узнаете потом, — «Браузерное расширение» стоит в подсказке не просто так, — отметьте Сохранять клипы и нажмите Создать токен.
  3. Нажмите Скопировать токен, пока открыта одноразовая панель. Второго шанса нет; если потеряете, отзовите этот токен и сделайте новый.
  4. Откройте страницу настроек расширения, найдите раздел Telli.sh Clip, вставьте токен в поле Токен Telli.sh Clip и нажмите Подключить.
  5. Кликните правой кнопкой на любой веб-странице и выберите Сохранить в Telli.sh. Значок на панели мигнёт , и клип уже во «Всех заметках».

Раздел Telli.sh Clip в настройках расширения: поле для токена Clip, кнопки «Подключить» и «Отключить», статус «Подключено как tsh_0wjkFr24mTcX» и ссылка «Где взять токен»

Расширение после шага 4, снимок от 5 сентября 2026 года. Строка статуса показывает только префикс — расширение показывает то же, что и список токенов. Поясняющий текст прямо описывает модель хранения: «Он хранится только на этом устройстве, и сохранение клипов остаётся выключенным, пока токен не добавлен». Нет токена — нет клипов; пункт меню есть, но не делает ничего.

Что именно читает расширение

Заявления о приватности стоят дёшево. Вот поведение кода — единственная версия, которая имеет вес.

Когда вы нажимаете Сохранить в Telli.sh, расширение внедряет в страницу одну функцию и читает восемь полей: og:title или twitter:title с запасным вариантом document.title; og:description, twitter:description или description; каноническую ссылку; og:image или twitter:image; og:site_name или application-name; article:author или author; article:published_time; и window.getSelection().

Перечитайте этот список ради того, чего в нём нет. Нет document.body. Нет извлечения текста статьи, нет прохода по «читаемости», нет обхода DOM. Семь полей из восьми — метаданные, которые страница публикует для Google и превью в соцсетях, то есть данные, написанные для чтения посторонними. Восьмое — текст, который вы выделили сами.

В коде держатся ещё четыре свойства:

Ничего не отправляется без клика. Функция метаданных выполняется внутри обработчика контекстного меню. Нет фонового будильника, нет хука на загрузку страницы, нет режима «собирать по ходу просмотра».

Без токена вообще ничего не происходит. Обработчик сначала проверяет, сохранён ли токен Telli.sh, и на этом останавливается, если токена нет, показывая значок с просьбой подключить его. На свежей установке пункт меню инертен.

Вашу сессионную куку нельзя одолжить. У расширения есть host-разрешение для telli.sh, а это обычно значит, что его вызовы fetch автоматически несут ваши куки входа — и кука аутентифицировалась бы раньше токена, дав полный доступ к аккаунту вместо спроектированной нами области «только клипы». Поэтому запрос отправляется с credentials: 'omit'. Токен — единственный предъявляемый ключ, и выбранная вами область — та, что действует. Именно эта одна опция и делает ключ только на запись действительно ключом только на запись.

Там, где у расширения нет доступа к странице, оно отправляет меньше, а не больше. Внедрение скрипта требует host-доступа, который у расширения есть только для сайтов, объявленных в манифесте. Везде остальном внедрение просто не удаётся, и клип откатывается к одному URL; дальше сервер заполняет карточку из публичных мета-тегов страницы. Режим отказа — «меньше данных», а никогда не «попросить более широкие разрешения».

А когда URL загружает сервер, он делает это как посетитель, а не как краулер. Он отказывает localhost, любому хосту .local и любому имени, которое разрешается в частный, петлевой, link-local, multicast, зарезервированный или неопределённый IP-адрес — именно разрешается и проверяется, а не просто сверяется с шаблоном, так что публичное DNS-имя, указывающее на 10.0.0.1, тоже отвергается. Он идёт максимум по 3 редиректам и читает не больше 256 КБ HTML. Он не входит в аккаунты, не несёт ваши куки и не пытается получить ничего, чего не смог бы загрузить незалогиненный посетитель. Страницы за пейволом и приватные страницы такими и остаются — сохраняйте из них лучше собственный выделенный текст.

И последнее замечание об измерениях, раз уж этот текст начался с истории про аналитику. Клипы, сделанные расширением, никогда не проходят через веб-приложение, поэтому фронтенд их не видит; о них clip_created сообщает сервер. Это событие несёт исходное приложение, тип источника, было ли включено выделение, была ли сгенерирована сводка, и тариф. Оно не несёт ни URL, ни заголовка, ни выделенного текста — сколько клипов сделано и каким путём, но никогда — что в них было.

Итог: приложение для заметок, хранящее только сказанное вами, — это половина памяти

Telli.sh начинался как место для произнесённой работы: записать встречу, расшифровать её на том языке, на котором действительно говорили, перевести, свести в резюме и держать все четыре слоя в одной заметке. Это покрывает то, что вы сказали.

Это не покрывает то, что вы прочитали, — а это большая часть того, что вы знаете. Вкладка, которую вы держали открытой три дня. Страница документации, которая понадобится снова через месяц. Ветка комментариев, где лежит настоящий ответ. Всё это живёт в истории браузера, по которой вы никогда не будете искать, и в панели закладок, которую вы перестали открывать в 2019 году.

Clip — это приходящая вторая половина: та же заметка, тот же поиск, те же папки, тот же экспорт — только вход через правый клик, а не через микрофон. Направление — единая личная база, где ваши слова и ваши источники лежат рядом, и это первая поверхность сбора, направленная в веб.

Барьера больше нет. Теперь счётчикам есть куда расти.


Попробуйте: войдите, откройте Clip на боковой панели и вставьте URL того, что давно собирались сохранить. Бесплатные аккаунты получают 30 сохранений и 10 сводок ИИ в день. Когда расширение 1.18 пройдёт проверку Chrome Web Store, то же самое станет правым кликом на любой странице, которую вы и так читаете.

Откройте Telli.sh и сохраните первый клип

Источники

  • Репозиторий Telli.sh, коммит 64852ac, 5 сентября 2026 года — «feat(clip): open Clip to every signed-in user», который убрал проверку is_master и значок Admin preview и зафиксировал, что clip_created и clip_opened ни разу не срабатывали в PostHog.
  • Репозиторий Telli.sh, backend/config.py — значения по умолчанию CLIP_SCRAPE_DAILY_QUOTA_* и CLIP_SUMMARY_DAILY_QUOTA_*, считаны 5 сентября 2026 года.
  • Репозиторий Telli.sh, docs/SUPERAPP_BASELINE.md — базовые требования к Clip и правила безопасности: никакого обхода логина или пейвола, никакого массового скрапинга, резюмирование только по предоставленному пользователем тексту и публичным метаданным, и правило, что вывод ИИ никогда не заменяет оригинал.
  • Репозиторий Telli.sh, docs/design/API_TOKEN_RBAC_DESIGN.md — проект токенов с ограниченной областью: структура политик, формат tsh_<prefix>_<secret>, хранение через bcrypt и инвариант, что API-токены никогда не разрешаются по пути сессионной аутентификации.
  • Репозиторий Telli.sh, extension/extension/background.jsreadClipMetadataFromPage, collectClipMetadata и saveClip, 5 сентября 2026 года: восемь полей метаданных, срабатывание только по клику, ранний выход без токена и credentials: 'omit'.
  • Telli.sh: Every Translator в Chrome Web Store — карточка, в которую была отправлена версия 1.18; на проверке по состоянию на 5 сентября 2026 года.
  • Страница продукта Telli.sh: Every Translator — поддерживаемые сайты, режимы показа, провайдеры и обязательства по приватности в одном месте.
  • Всплывающее окно расширения отвечало не на тот вопрос. В версии 1.16 оно вместо этого рисует страницу, на которой вы находитесь, 4 сентября 2026 года — предыдущий выпуск расширения, про страницу настроек, на которой живёт поле токена Clip.

Вернуться в блог