product update13 min czytania

Clip odkłada stronę internetową do notatek z już napisanym streszczeniem. Od dziś otwiera się dla każdego konta Telli.sh

Clip nie tylko zapisuje stronę internetową: zamienia ją w notatkę Telli.sh z tytułem i jednozdaniowym streszczeniem napisanymi przez SI. Wyszedł za flagą administratora, więc dwa liczniki analityczne nie odpaliły ani razu. Tej blokady już nie ma: darmowe konta dostają 30 zapisów i 10 streszczeń SI dziennie, a wersja 1.18 rozszerzenia przeglądarkowego dodaje w menu kontekstowym Zapisz w Telli.sh, uwierzytelniane tokenem, który nie potrafi nic poza zapisywaniem clipów.

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

Istnieje pewien szczególny rodzaj błędu, którego nie wyłapie żaden zestaw testów: funkcja działa, a nikt nie może do niej dotrzeć.

Clip jest gotowy od tygodni. Okno zapisuje przez POST /v1/clip, wypełnia kartę linku z publicznych metatagów strony, generuje jednozdaniowe streszczenie od SI, unieważnia pamięć podręczną notatek i już rozróżnia „zapisane, ale skończył się limit streszczeń” od „to się nie udało”. Wszystko to działa. A w PostHogu dwa zdarzenia, które zgłasza — clip_opened i clip_created — nie odpaliły nigdy. Ani razu, nie „rzadko”. Zero.

Powodem były trzy wiersze kodu we frontendzie. Przycisk na pasku bocznym i okno były zablokowane warunkiem user.is_master, a przycisk nosił bursztynową plakietkę Podgląd administratora. Backend nigdy nie sprawdzał is_master — egzekwuje dzienne limity zależne od planu, a to właściwe miejsce na ograniczenie. Nie było tak, że funkcji nie używano. Nie dało się do niej dojść.

Od commita 64852ac z 5 września 2026 roku warunek brzmi „ktoś jest zalogowany”. Ten tekst to ogłoszenie produktowe, więc z założenia jest o produkcie: oto co Clip robi, ile Cię kosztuje, co wysyła rozszerzenie przeglądarkowe i czego celowo nigdy nie czyta.

TL;DR

  • Clip jest otwarty dla każdego zalogowanego konta. Przycisk na pasku bocznym stracił plakietkę administratora 5 września 2026 roku.
  • Ograniczenia to dzienne limity, a nie blokada. Plan darmowy dostaje 30 zapisów i 10 streszczeń SI na dobę UTC; plus, pro i pro+ idą wyżej. Dokładne liczby są w tabeli poniżej.
  • Wyczerpanie limitu streszczeń nie odbiera Ci clipa. Link i jego metadane i tak zostają zapisane; pomijane jest tylko streszczenie, a aplikacja o tym mówi.
  • Rozszerzenie przeglądarkowe potrafi zapisać stronę, na której właśnie jesteś. „Zapisz w Telli.sh” siedzi w menu kontekstowym na każdej stronie http(s) i zabiera ze sobą to, co zaznaczyłeś. W chwili publikacji wersja 1.18 jest w weryfikacji w Chrome Web Store — jeszcze nie da się jej zainstalować.
  • Rozszerzenie uwierzytelnia się tokenem, który potrafi tylko zapisywać clipy. Nie odczyta Twoich notatek, nie zmieni konta, nie sięgnie do płatności ani nie wygeneruje kolejnego tokena. Sekret widzisz dokładnie raz i możesz go unieważnić.
  • Rozszerzenie czyta to, co strona i tak Ci pokazuje. Tytuł, link kanoniczny, publiczne metadane og:/twitter: i Twoje zaznaczenie. Nie treść artykułu. Nic nie opuszcza przeglądarki bez Twojego kliknięcia, a bez zapisanego tokena pozycja w menu nie robi zupełnie nic.

Co Clip faktycznie robi z adresem URL

Otwierasz Clip z paska bocznego, wklejasz URL, a okno wywołuje POST /v1/clip/metadata. Ten endpoint pobiera HTML strony i czyta wyłącznie jej publiczne metatagi — og:title, og:description, og:image, og:site_name, article:author, article:published_time oraz <link rel="canonical">. Tytuł, opis, nazwa witryny i obrazek wracają już wypełnione. Jeśli pobranie się nie powiedzie, okno o tym mówi i i tak pozwala zapisać link, wstawiając nazwę hosta zamiast nazwy witryny.

Potem zapisujesz i clip staje się notatką. Nie załącznikiem, nie zakładką na osobnej liście — notatką z note_type="clip", leżącą we Wszystkich notatkach razem z resztą: przeszukiwalną, do wrzucenia w folder, do udostępnienia i wyeksportowania tą samą maszynerią. Źródłowy URL i cała karta linku są zachowane w kontekście notatki, więc pochodzenie nigdy nie ginie za streszczeniem.

Jeśli jest co streszczać — opis, zaznaczony przez Ciebie tekst, wklejona przez Ciebie notatka — rusza streszczenie ogólne i wpisuje do notatki jedno zdanie. To ten wiersz, który widzisz pod tytułem na liście.

Trzy zapisane strony internetowe na liście Wszystkie notatki w Telli.sh: Hacker News bez wiersza streszczenia, Fetch API Overview and Practical Considerations oraz GitHub jako platforma programistyczna napędzana SI, każda z jednozdaniowym streszczeniem pod spodem

Trzy clipy zapisane na koncie produkcyjnym 5 września 2026 roku, we Wszystkich notatkach obok zwykłych notatek. Dwa clipy z artykułami mają tytuł napisany przez SI i jednozdaniowe streszczenie. Strona główna Hacker News nie publikuje metaopisu, a zaznaczonego tekstu nie było, więc nie było czego streszczać — zachowała własny tytuł i została bez wiersza streszczenia. Kiedy Clip nie ma z czym pracować, nic nie mówi, zamiast coś wymyślać.

Ten ostatni szczegół to reguła projektowa leżąca pod całą funkcją i warto ją wypowiedzieć osobno: wynik SI nigdy nie zastępuje oryginału. Źródłowy URL, własne metadane witryny i każdy dostarczony przez Ciebie tekst zostają zachowane; streszczenie to dane pochodne położone na wierzchu. Jeśli streszczenie jest błędne albo bezużyteczne, to, co naprawdę zapisałeś, wciąż tam jest.

Ograniczenia to dzienny limit i jest to jedyne ograniczenie

W Clipie nie ma blokady planowej. Jest ilość.

PlanZapisów dziennieStreszczeń SI dziennie
Free3010
Plus15050
Pro500150
Pro+2,000500

Wartości domyślne z backend/config.py (CLIP_SCRAPE_DAILY_QUOTA_*, CLIP_SUMMARY_DAILY_QUOTA_*), odczytane 5 września 2026 roku.

Limity są dwa, nie jeden, i celowo zawodzą inaczej. Skończą się zapisy i zapis zostaje odrzucony — serwer odpowiada 403 ze strukturalnym kodem clip_scrape_quota_exceeded i datą zerowania. Skończą się streszczenia i clip mimo to zostaje zapisany; pomijany jest tylko krok streszczenia, a aplikacja mówi dokładnie to: „Clip zapisany. Dzisiejszy limit streszczeń SI został wykorzystany.”

Ta asymetria jest zamierzona. Zapisanie linku jest tanie i to właśnie tego chciałeś; streszczanie jest tą drogą częścią. Stracić stronę, którą chciałeś zachować, dlatego że model językowy trafił na limit zapytań, byłoby absurdalną wymianą, więc jej nie robimy.

Licznik to zwykła data kalendarzowa UTC. O 00:00 UTC Twój dzień się zeruje — ta sama chwila dla wszystkich, a nie ruchome okno 24 godzin, o którym trzeba myśleć.

„Zapisz w Telli.sh” jest o jedno kliknięcie prawym przyciskiem — gdy tylko 1.18 przejdzie weryfikację

Okno w wersji webowej zakłada, że masz URL w schowku. Zwykle masz zamiast tego otwartą stronę.

Telli.sh: Every Translator 1.18 dodaje pozycję menu kontekstowego Zapisz w Telli.sh, zarejestrowaną zarówno dla kontekstu page, jak i selection, na http://*/* i https://*/* — na dowolnej stronie internetowej, nie tylko na trzydziestu kilku witrynach, na których rozszerzenie tłumaczy. Kliknij prawym przyciskiem gdziekolwiek w artykule, a zostanie zapisany. Zaznacz najpierw trzy akapity, a pojadą razem z nim, do 2000 znaków.

Informacja zwrotna idzie przez plakietkę na pasku narzędzi, którą rozszerzenie już ma: w trakcie zapisywania, przy powodzeniu, ! przy niepowodzeniu, każda z wyjaśnieniem w dymku paska. Komunikaty o błędach są konkretne, bo konkretne są błędy serwera. 401 oznacza, że token został odrzucony i potrzebujesz nowego. 403 oznacza dwie różne rzeczy, a rozszerzenie je rozróżnia, szukając w treści odpowiedzi kodu *_quota_exceeded — wyczerpany limit („wróć jutro”) kontra token bez uprawnienia do clipów („ten token tak nie potrafi”). Ten sam kod stanu, przeciwne rady.

Wersja 1.18 została wysłana do Chrome Web Store i na dzień 5 września 2026 roku jest w weryfikacji. Jeszcze nie da się jej zainstalować. Po zatwierdzeniu przyjdzie jako aktualizacja automatyczna, a wraz z nią pojawi się menu kontekstowe.

Klucz tylko do zapisu: token potrafi zapisywać clipy i nic więcej

Oto część, na której zależy nam najbardziej, bo to w niej takie integracje zwykle się psują.

Leniwa wersja „podłącz rozszerzenie do swojego konta” polega na tym, żebyś wkleił do rozszerzenia swój token sesji. Taki token otwiera wszystko: kasuje notatki, eksportuje Twoje dane, dotyka płatności. Oddałbyś pełne dane uwierzytelniające konta w zamian za przycisk do zakładek, a leżałyby w pamięci rozszerzenia na zawsze.

Dlatego Clip nie używa tego tokena. Telli.sh wydaje tokeny API z zakresem, wzorowane na tych z Cloudflare: token niesie listę polityk, zamiast występować w Twoim imieniu, a każda polityka to effect (allow albo deny, przy czym deny wygrywa), zbiór resources i zbiór grup uprawnień. Dziś istnieje dokładnie jedna grupa, clip_write, rozwijająca się do uprawnień clip:write i clip:metadata, oraz dokładnie jeden kształt zasobu, {"user": "self"} — Twoje własne dane, nic poza tym.

Nazywamy to kluczem tylko do zapisu, bo taki właśnie ma kształt: potrafi wkładać rzeczy do Twojego konta i nic z niego nie wyjmuje.

Niezmiennik bezpieczeństwa, który czyni to prawdziwym, to jedno zdanie z dokumentu projektowego: token API nigdy nie przechodzi ścieżką uwierzytelniania sesyjnego. Ciasteczka sesji i tokeny dostępowe JWT rozwiązuje get_current_user_optional, który sięga każdego endpointu w produkcie. Tokeny API rozwiązuje wyłącznie zależność require_permission(...), a jeśli uprawnienia, o które ta zależność prosi, nie ma w tokenie, odpowiedzią jest 403. Złam ten rozdział, a token z zakresem po cichu znów staje się tokenem pełnego konta — dlatego zapisano to jako najważniejszą regułę projektu. Jest jeszcze pożyteczny skutek uboczny: token API to nieprzezroczysty ciąg znaków, więc dekodowanie JWT zawsze się na nim wykłada. Gdyby przez pomyłkę trafił kiedyś na ścieżkę sesyjną, uwierzytelniłby się jako nikt.

Samo API tokenów jest dla tokenów zamknięte. Tworzenie, wyświetlanie i unieważnianie tokenów wymaga prawdziwej, zalogowanej sesji — token nie może wydać kolejnego tokena.

Utworzenie zajmuje jakieś piętnaście sekund

Wejdź w Ustawienia → Tokeny API. Zanim jakikolwiek masz, strona uczciwie mówi, co potrafi to, co za chwilę utworzysz.

Strona ustawień tokenów API Telli.sh bez żadnego tokena: formularz tworzenia z polem nazwy tokena i pojedynczym polem wyboru uprawnienia Zapisywanie clipów oraz pusty stan z napisem Brak tokenów

Strona tokenów API pod adresem /settings/tokens, zanim istnieje jakikolwiek token, zrzut z 5 września 2026 roku. Wiersz o zakresie stoi nad formularzem, a nie jest zakopany w artykule pomocy: „Token może tylko zapisywać clipy. Nie odczyta Twoich notatek, nie zmieni Twojego konta ani nie sięgnie do danych rozliczeniowych”. W ofercie jest jedno uprawnienie, bo jedno uprawnienie to wszystko, co istnieje.

Nadaj nazwę, zaznacz Zapisywanie clipów, utwórz. Pełny sekret pojawia się raz, w panelu, który mówi o tym na czerwono.

Jednorazowy panel tokena z napisem Skopiuj token teraz, ostrzeżeniem, że token pokazywany jest tylko ten jeden raz, częściowo zamaskowanym tokenem tsh_ oraz przyciskami Kopiuj token i Zapisałem

Panel jednorazowego sekretu. Token na tym zrzucie jest zamaskowany, a konto, do którego należał, zostało usunięte. Token ma postać tsh_<12-znakowy prefiks>_<43-znakowy sekret> — 256 bitów losowości w base64url. W postaci jawnej przechowywany jest tylko prefiks, jako klucz wyszukiwania; sekret leży jako skrót bcrypt i nie odzyskamy go ani my, ani Ty. Zamknij ten panel, a przepadnie na dobre.

Potem lista pokazuje prefiks i nic więcej. To wystarczy, by odróżnić dwa tokeny, i jest bezużyteczne dla kogoś, kto ukradnie zrzut ekranu.

Lista tokenów z jednym tokenem o nazwie Moje rozszerzenie przeglądarki, plakietką Aktywny, jego prefiksem tsh_, zakresem Zapisywanie clipów, znacznikiem utworzenia, wpisem Ostatnie użycie: Nigdy nieużywany i czerwoną akcją Unieważnij

Ten sam token po zamknięciu panelu sekretu: prefiks, zakres, czas utworzenia, czas ostatniego użycia i Unieważnij. last_used_at zapisywane jest najwyżej raz na godzinę, a nie przy każdym żądaniu, więc mówi z grubsza, kiedy token był ostatnio aktywny, nie zamieniając każdego clipa w dodatkowy zapis do bazy. Unieważnienie ustawia revoked_at — natychmiastowo, trwale i bez twardego usunięcia, więc ślad tego, co istniało, zostaje.

Podłączenie rozszerzenia: pięć kroków

  1. Zaloguj się na telli.sh i otwórz Ustawienia → Tokeny API (/settings/tokens).
  2. Wpisz nazwę, którą później rozpoznasz — „Rozszerzenie przeglądarki” stoi w podpowiedzi nie bez powodu — zaznacz Zapisywanie clipów i naciśnij Utwórz token.
  3. Naciśnij Kopiuj token, póki jednorazowy panel jest otwarty. Drugiej szansy nie ma; jeśli go zgubisz, unieważnij ten token i zrób nowy.
  4. Otwórz stronę ustawień rozszerzenia, znajdź sekcję Telli.sh Clip, wklej token w pole Token Telli.sh Clip i naciśnij Połącz.
  5. Kliknij prawym przyciskiem na dowolnej stronie i wybierz Zapisz w Telli.sh. Plakietka na pasku mignie , a clip jest we Wszystkich notatkach.

Sekcja Telli.sh Clip w ustawieniach rozszerzenia: pole na token Clip, przyciski Połącz i Rozłącz, status Połączono jako tsh_0wjkFr24mTcX oraz odnośnik Gdzie zdobyć token

Rozszerzenie po kroku 4, zrzut z 5 września 2026 roku. Wiersz statusu pokazuje tylko prefiks — rozszerzenie wyświetla to, co wyświetla lista tokenów. Tekst pomocniczy wykłada model przechowywania wprost: „Jest przechowywany wyłącznie na tym urządzeniu, a zapisywanie clipów pozostaje wyłączone, dopóki nie dodasz tokena”. Nie ma tokena, nie ma clipowania; pozycja w menu istnieje, ale nic nie robi.

Co dokładnie czyta rozszerzenie

Deklaracje o prywatności są tanie. Oto zachowanie kodu, jedyna wersja, która się liczy.

Gdy klikasz Zapisz w Telli.sh, rozszerzenie wstrzykuje w stronę jedną funkcję i czyta osiem pól: og:title albo twitter:title z odwrotem do document.title; og:description, twitter:description albo description; link kanoniczny; og:image albo twitter:image; og:site_name albo application-name; article:author albo author; article:published_time; oraz window.getSelection().

Przeczytaj tę listę jeszcze raz pod kątem tego, czego w niej nie ma. Nie ma document.body. Nie ma wydobywania tekstu artykułu, nie ma przebiegu czytelności, nie ma obchodzenia DOM. Siedem z ośmiu pól to metadane, które strona publikuje dla Google i dla podglądów w mediach społecznościowych — dane napisane po to, by czytali je obcy. Ósme to tekst, który sam zaznaczyłeś.

W kodzie trzymają się jeszcze cztery własności:

Nic nie wychodzi bez kliknięcia. Funkcja metadanych działa wewnątrz obsługi menu kontekstowego. Nie ma alarmu w tle, nie ma haka na wczytanie strony, nie ma trybu „zbieraj, kiedy przeglądasz”.

Bez tokena nie dzieje się zupełnie nic. Obsługa najpierw sprawdza, czy jest zapisany token Telli.sh, i na tym się zatrzymuje, jeśli go nie ma, pokazując plakietkę, która każe token podłączyć. Na świeżej instalacji pozycja w menu jest bezczynna.

Twojego ciasteczka sesji nie da się pożyczyć. Rozszerzenie ma uprawnienie hosta do telli.sh, co normalnie znaczy, że jego wywołania fetch automatycznie niosą Twoje ciasteczka zalogowania — a ciasteczko uwierzytelniłoby się przed tokenem, dając pełny dostęp do konta zamiast zaprojektowanego przez nas zakresu wyłącznie do clipów. Dlatego żądanie wysyłane jest z credentials: 'omit'. Token jest jedynym poświadczeniem w grze, a zakres, który wybrałeś, jest zakresem, który obowiązuje. To ta jedna opcja sprawia, że klucz tylko do zapisu naprawdę jest tylko do zapisu.

Tam, gdzie rozszerzenie nie ma dostępu do strony, wysyła mniej, a nie więcej. Wstrzyknięcie skryptu wymaga dostępu do hosta, który rozszerzenie ma tylko dla witryn zadeklarowanych w manifeście. Wszędzie indziej wstrzyknięcie po prostu się nie udaje, a clip cofa się do samego adresu URL; serwer wypełnia potem kartę z publicznych metatagów strony. Trybem awarii jest „mniej danych”, nigdy „poproś o szersze uprawnienia”.

A kiedy serwer pobiera adres URL, robi to jak odwiedzający, a nie jak crawler. Odmawia localhost, każdemu hostowi .local i każdej nazwie hosta, która rozwiązuje się na adres IP prywatny, pętli zwrotnej, link-local, multicast, zarezerwowany albo nieokreślony — rozwiązuje i sprawdza, a nie tylko dopasowuje wzorzec, więc publiczna nazwa DNS wskazująca na 10.0.0.1 też zostaje odrzucona. Idzie najwyżej za 3 przekierowaniami i czyta najwyżej 256 KB HTML-a. Nie loguje się, nie niesie Twoich ciasteczek i nie próbuje niczego, czego nie pobrałby niezalogowany odwiedzający. Strony za paywallem i strony prywatne zostają za paywallem i prywatne — zapisz z nich raczej własny zaznaczony tekst.

Na koniec jeszcze uwaga o pomiarach, skoro ten tekst zaczęliśmy od historii z analityki. Clipy zrobione przez rozszerzenie nigdy nie przechodzą przez aplikację webową, więc frontend ich nie widzi; dla nich clip_created zgłasza serwer. To zdarzenie niesie aplikację źródłową, typ źródła, informację, czy dołączono zaznaczenie, czy wygenerowano streszczenie, oraz plan. Nie niesie adresu URL, tytułu ani zaznaczonego tekstu — ile clipów powstało i którą drogą, nigdy co w nich było.

Podsumowanie: aplikacja do notatek, która trzyma tylko to, co powiedziałeś, jest połową pamięci

Telli.sh zaczynał jako miejsce na pracę mówioną — nagraj spotkanie, przepisz je w języku, w którym naprawdę mówiono, przetłumacz, streść, trzymaj wszystkie cztery warstwy w jednej notatce. To pokrywa to, co powiedziałeś.

Nie pokrywa tego, co przeczytałeś, a to większość tego, co wiesz. Karta trzymana otwarta przez trzy dni. Strona dokumentacji, której będziesz potrzebować znowu za miesiąc. Wątek komentarzy z prawdziwą odpowiedzią w środku. To wszystko mieszka w historii przeglądarki, której nigdy nie przeszukasz, i w pasku zakładek, który przestałeś otwierać w 2019 roku.

Clip to nadchodząca druga połowa: ta sama notatka, to samo wyszukiwanie, te same foldery, ten sam eksport — tylko wejście przez kliknięcie prawym przyciskiem zamiast przez mikrofon. Kierunek to jedna osobista baza, w której Twoje słowa i Twoje źródła leżą obok siebie, a to pierwsza powierzchnia zbierania wycelowana w sieć.

Blokady nie ma. Liczniki mają wreszcie dokąd rosnąć.


Wypróbuj: zaloguj się, otwórz Clip na pasku bocznym i wklej adres czegoś, co od dawna chciałeś zachować. Darmowe konta dostają 30 zapisów i 10 streszczeń SI dziennie. Kiedy rozszerzenie 1.18 przejdzie weryfikację Chrome Web Store, to samo stanie się kliknięciem prawym przyciskiem na dowolnej stronie, którą i tak już czytasz.

Otwórz Telli.sh i zapisz swój pierwszy clip

Źródła

  • Repozytorium Telli.sh, commit 64852ac, 5 września 2026 — „feat(clip): open Clip to every signed-in user”, który usunął blokadę is_master i plakietkę Podgląd administratora oraz odnotował, że clip_created i clip_opened nigdy nie odpaliły w PostHogu.
  • Repozytorium Telli.sh, backend/config.py — wartości domyślne CLIP_SCRAPE_DAILY_QUOTA_* i CLIP_SUMMARY_DAILY_QUOTA_*, odczytane 5 września 2026.
  • Repozytorium Telli.sh, docs/SUPERAPP_BASELINE.md — założenia bazowe Clipa i reguły bezpieczeństwa: żadnego omijania logowania ani paywalla, żadnego masowego scrapowania, streszczanie ograniczone do tekstu dostarczonego przez użytkownika i publicznych metadanych oraz reguła, że wynik SI nigdy nie zastępuje oryginału.
  • Repozytorium Telli.sh, docs/design/API_TOKEN_RBAC_DESIGN.md — projekt tokenów z zakresem: struktura polityk, format tsh_<prefix>_<secret>, przechowywanie przez bcrypt oraz niezmiennik, że tokeny API nigdy nie są rozwiązywane ścieżką uwierzytelniania sesyjnego.
  • Repozytorium Telli.sh, extension/extension/background.jsreadClipMetadataFromPage, collectClipMetadata i saveClip, 5 września 2026: osiem pól metadanych, wyzwalanie wyłącznie kliknięciem, wczesny powrót przy braku tokena i credentials: 'omit'.
  • Telli.sh: Every Translator w Chrome Web Store — wpis, do którego trafiła wersja 1.18; w weryfikacji na dzień 5 września 2026.
  • Strona produktu Telli.sh: Every Translator — obsługiwane witryny, tryby wyświetlania, dostawcy i zobowiązania dotyczące prywatności w jednym miejscu.
  • Okienko rozszerzenia odpowiadało na złe pytanie. W wersji 1.16 rysuje zamiast tego stronę, na której właśnie jesteś, 4 września 2026 — poprzednie wydanie rozszerzenia, dla strony ustawień, na której mieszka pole tokena Clip.

Wróć do bloga