← Powrót

Privacy Thing

Twórca / Projektant produktu / Programista · Open Source

Okres: 2025 – obecnie

Strony internetowe mogą próbować rozpoznawać użytkowników bez zapisania ani jednego pliku cookie. Wystarczy zestawić adres IP z geolokalizacją udostępnianą przez przeglądarkę, językiem, strefą czasową, rozdzielczością ekranu, właściwościami Canvas i WebGL czy informacjami o urządzeniu. Każdy z tych parametrów osobno wydaje się mało znaczący, ale razem mogą tworzyć charakterystyczny odcisk przeglądarki.

Rozszerzenie nie może zmienić wszystkich tych danych, w szczególności publicznego adresu IP. Privacy Thing koncentruje się na informacjach, na które przeglądarka pozwala mu rzeczywiście wpływać. Użytkownik decyduje, jakie wartości zobaczy konkretna witryna, i może przypisać różnym domenom osobne profile geolokalizacji, języka, strefy czasowej oraz wybranych mechanizmów ochrony.

Przykładowo dla wybranej witryny można przygotować profil z konkretną lokalizacją, językiem i strefą czasową. Privacy Thing przypisze go do domeny i zastosuje, zanim strona zdąży odczytać prawdziwe wartości. Panel X-Ray pokaże następnie, po jakie obsługiwane dane witryna rzeczywiście sięgnęła i które ustawienia miały na nie wpływ.

Projekt rozpoczął się pod nazwą GeoWarp jako proste narzędzie do podmiany geolokalizacji. Pierwsza wersja robiła jedną rzecz: zwracała stronom inne współrzędne. Szybko okazało się jednak, że sama lokalizacja to za mało. Witryna może jednocześnie sprawdzić język, strefę czasową, ustawienia regionalne, nagłówki i dane urządzenia. Kiedy informacje te do siebie nie pasują, niespójność staje się cechą równie charakterystyczną jak wartości, które miała ukryć.

Z tego eksperymentu wyrósł Privacy Thing - system pozwalający kontrolować nie pojedynczą wartość, lecz spójny obraz środowiska widziany przez witrynę.

Edytor kontenera Firefoksa z wyborem presetu regionalnego i ustawieniami ochrony
W Firefoksie właściwości kontenera i ustawienia ochrony Privacy Thing można edytować w jednym miejscu.

Jedna konfiguracja dla konkretnej witryny

Podstawą produktu są profile i reguły domenowe. Profil opisuje wybrane parametry środowiska, a reguły określają, na których stronach ma obowiązywać. W Firefoxie konfiguracja może dodatkowo uwzględniać używany kontener. Dzięki temu ten sam użytkownik może korzystać z różnych ustawień zależnie od odwiedzanej witryny i kontekstu.

Do szybkiego zarządzania bieżącą domeną służy okno rozszerzenia (popup), a pełny panel ustawień pozwala organizować profile i reguły, importować lub eksportować konfigurację, przeglądać logi oraz porządkować dane witryn. X-Ray uzupełnia ten zestaw o dokładny podgląd aktywności witryny. Ochrona przestaje dzięki temu być niewidocznym mechanizmem, a staje się czymś, co użytkownik może samodzielnie sprawdzić.

Zakres ochrony

Aktualnie Privacy Thing obejmuje 53 właściwości, metod i konstruktorów przeglądarki, pogrupowanych w 13 kategorii ochrony:

  • Geolokalizacja
  • Czas i ustawienia regionalne
  • Canvas
  • WebGL
  • Audio
  • Navigator
  • Screen
  • Client Hints
  • Battery
  • WebRTC
  • Dedicated Workers
  • Service Workers
  • Shared Workers
Ekran reguł domenowych Privacy Thing z tabelą hostów i inspektorem nazw domen
Reguły domenowe wiążą hosty z presetami regionalnymi, a inspektor pozwala sprawdzić wynik przed zapisaniem zmian.

Najtrudniejsze: zdążyć przed stroną

W tym projekcie wyzwaniem nie jest wyłącznie zmiana zachowania przeglądarkowych API. Równie ważne jest wykonanie jej, zanim strona zdąży odczytać prawdziwe wartości. Późniejsza korekta nie cofnie informacji ujawnionej podczas pierwszych chwil ładowania dokumentu.

Zbudowałem własną warstwę wykonawczą (runtime) oraz mechanizmy dostarczające jej właściwą konfigurację już podczas nawigacji. Muszą działać stabilnie po zmianach ustawień, przeładowaniach strony i ponownym uruchomieniu ochrony, bez nakładania na siebie kolejnych modyfikacji. To właśnie niezawodność i odpowiedni moment uruchomienia okazały się trudniejsze niż sama podmiana danych.

Wiele kontekstów i dwa środowiska

Współczesne aplikacje webowe uruchamiają kod nie tylko w głównym oknie, lecz także w ramkach i różnych rodzajach workerów. Każdy z tych kontekstów może widzieć inny fragment środowiska, dlatego aktywna konfiguracja Privacy Thing musi docierać również poza główny dokument - bez zakłócania mechanizmów, na których polegają same aplikacje.

Dodatkowym źródłem złożoności są różnice między Chromium i Firefoksem. Oba środowiska oferują podobny model rozszerzeń, ale inaczej uruchamiają kod strony i przekazują mu dane. Oddzieliłem więc wspólne zachowanie produktu od adapterów obsługujących ograniczenia poszczególnych przeglądarek. Pozwala to rozwijać jedną funkcję dla obu wersji i sprawdzać je w tych samych scenariuszach.

Każdy kolejny etap ujawniał następną granicę prostego rozwiązania. Podmiana współrzędnych wymagała spójnych ustawień regionalnych, profile domenowe - niezawodnego dostarczania konfiguracji podczas nawigacji, a obsługa głównego dokumentu - objęcia ochroną pozostałych kontekstów wykonawczych. Architektura projektu nie powstała więc jako gotowy plan: rozwijała się w odpowiedzi na zachowania, których nie dało się wiarygodnie obsłużyć wcześniejszym modelem.

Playground Privacy Thing porównujący lokalne i zmodyfikowane wartości środowiska przeglądarki
Playground porównuje lokalne środowisko przeglądarki z tym prezentowanym witrynie - aż do wartości poszczególnych API.

Jakość sprawdzana w prawdziwych przeglądarkach

Privacy Thing ingeruje w zachowanie natywnych API, dlatego testy jednostkowe nie wystarczają. Projekt łączy je z testami integracyjnymi i automatyzacją uruchamianą w rzeczywistych wersjach Chromium i Firefoksa. Obejmuje to pierwsze odczyty podczas ładowania strony, ramki, workery, nagłówki oraz kompletne przepływy interfejsu.

Proces zaczyna się od kontroli formatowania, analizy typów, testów jednostkowych i sprawdzenia procesu budowania. Gotowe pakiety trafiają następnie do osobnych przebiegów Playwrighta dla Chromium i Firefoksa, a nocne zadania uzupełniają je testami diagnostycznymi na prawdziwych witrynach.

Wraz z rozwojem projektu wydzieliłem współdzielone biblioteki odpowiedzialne za geolokalizację, czas, ochronę przed tworzeniem odcisku przeglądarki (fingerprintingiem), integrację z przeglądarkami i diagnostykę. Repozytorium zawiera też kontrolowane strony testowe i narzędzia wykrywające różnice między deklarowanymi a rzeczywistymi możliwościami przeglądarek.

Panel X-Ray pokazujący 174 880 zapytań z kategorii czasu i ustawień regionalnych na stronie LinkedIn
LinkedIn w jednej sesji wykonał 174 880 odczytów związanych z czasem i ustawieniami regionalnymi, w tym 173 384 wywołania Date.now.

Nawet najszerszy zestaw automatycznych testów nie zastąpi sprawdzania rozszerzenia na żywym organizmie. LinkedIn okazał się szczególnie pouczającym przypadkiem: jego warstwa interfejsu (frontend), delikatnie mówiąc, nie oszczędza wywołań funkcji czasu. X-Ray zarejestrował blisko 200 tysięcy odczytów w jednej sesji, co w połączeniu z ówczesnym sposobem raportowania zdarzeń potrafiło zawiesić przeglądarkę. Taki przypadek ujawnił problem wydajnościowy, którego kontrolowane scenariusze wcześniej nie pokazały. Błąd został naprawiony, a LinkedIn trafił do zestawu stałych testów porównawczych wydajności (benchmarków) :P

Rozbudowane testy Chromium i Firefoksa są uruchamiane przy wsparciu webh.pl, które udostępnia projektowi infrastrukturę serwerową opartą na procesorach AMD EPYC. Zapewnia ona szybkie i powtarzalne środowisko do sprawdzania kolejnych zmian przed wydaniem.

Tożsamość, która reaguje

Pierwsze logo GeoWarp było równie bezpośrednie jak ówczesny produkt: łączyło postać ninja z pinezką lokalizacji. Sam pomysł miał swój urok - personifikował pin znany z popularnych aplikacji mapowych. W praktyce ilustracyjna postać kiepsko skalowała się do rozmiaru ikony rozszerzenia, a przygotowanie dla niej spójnych animacji wymagałoby znacznie więcej pracy. Wraz z rozwojem funkcji znak zaczął też zawężać projekt do jednej z wielu kontrolowanych właściwości przeglądarki.

Plansza robocza logo GeoWarp z postacią ninja wpisaną w pinezkę lokalizacji
Robocza plansza znaku GeoWarp w wariancie ciemnym i jasnym.

Przy zmianie nazwy na Privacy Thing odszedłem od ilustracyjnej maskotki na rzecz prostego, abstrakcyjnego Thinga, logotypu zapisanego krojem o stałej szerokości i kursora. Siłą Thinga jest niemal absurdalnie prosty kształt. Właśnie dlatego łatwo odtworzyć go przy użyciu technologii webowych, płynnie przekształcać i animować bez utraty czytelności - także tam, gdzie do dyspozycji jest tylko kilkanaście pikseli. Zamiast jednego zamkniętego znaku powstał system obejmujący różne kierunki spojrzenia, mruganie, sen oraz animowany kursor. Działa zarówno jako mała ikona rozszerzenia, jak i pełne logo.

Nowa nazwa miała być bezpretensjonalna i celowo nie walczyć o uwagę. GeoWarp brzmiał efektownie, ale nie mówił wiele o szerszych możliwościach rozszerzenia, a przy tym sam próbował zostać bohaterem komunikacji. Privacy Thing zostawia więcej miejsca produktowi i postaci, nie udając, że jednym słowem wyjaśni cały system. Poszukiwania następcy GeoWarpa trwały właściwie od początku projektu. W momencie wyboru nowej nazwy kanoniczna baza w Notion liczyła 891 rekordów - nazw, wariantów i kierunków tematycznych. W 2026 roku naprawdę trudno znaleźć dobrą nazwę ;-)

Plansza robocza z wariantami spojrzenia Thinga, znakiem, logotypem i układami logo Privacy Thing
Plansza wariantów Privacy Thing: kierunki spojrzenia, znak, logotyp i układy logo.

Identyfikację projektowałem w Affinity Designer. Inkscape dołączył do procesu jako narzędzie do kontroli i poprawiania zgodności SVG, dzięki czemu te same pliki mogły być bezpiecznie używane w różnych przeglądarkach i częściach produktu.

Thing nie jest osadzonym na sztywno obrazkiem, lecz natywnym komponentem webowym (Web Component) <privacy-thing-logo>. Dzięki temu pozostaje niezależny od frameworka, czyli szkieletu użytego do budowy aplikacji, i może zachowywać się tak samo w rozszerzeniu, na stronie produktu oraz tutaj - w portfolio. SVG SMIL, mechanizm animacji zapisany bezpośrednio w grafice, odpowiada wewnątrz komponentu za kierunki spojrzenia, mruganie, sen i płynne przekształcenia znaku. Przejścia CSS prowadzą oczy pomiędzy pozami i animują kursor, a Web Animations API obsługuje krótkie reakcje boop i jelly.

Cztery zachowania jednego Thinga

Każdy przykład poniżej jest osobną instancją tego samego komponentu używanego przez produkt.

spokojne spojrzenie
szybszy rytm
boop · śledzenie kursora · jelly
sen · zz
Najedź na interaktywnego Thinga albo dotknij planszy. Możesz pobawić się z Thingiem także na tej stronie właśnie dzięki przenośności komponentu.

Thing miał być przyjazną postacią łagodzącą brutalnie techniczny charakter produktu. Dlatego animacje nie są wyłącznie dekoracją. Przemawiają do użytkownika: pomagają dostrzec zmianę stanu, ważną informację albo wydarzenie podczas korzystania z przeglądarki. Po włączeniu ograniczenia ruchu komponent zachowuje spokojną, statyczną formę i nadal przekazuje ten sam stan.

Ten sam sposób myślenia przeniosłem na ramki dialogów. Ich akcent powstaje z maskowanego gradientu stożkowego (conic-gradient), którego kąt, szerokość smugi i intensywność efektu halo, czyli zewnętrznej poświaty, są rejestrowanymi właściwościami CSS. Osobne animacje sterują obrotem i delikatnym „oddechem” poświaty, więc kolor i tempo można dobierać niezależnie. Ruch prowadzi wzrok do aktywnego okna, a przy ograniczeniu animacji pozostaje statyczną ramką.

Cztery sposoby komunikacji animowanej ramki Privacy Thing

Żywa demonstracja korzysta z HTML i tych samych mechanizmów CSS, które budują ramkę w produkcie.

Edit location

Make changes to your spoofing location. Click save when done.

Cztery sposoby komunikacji: steady - spokojny zielony; boosted - szybszy pomarańczowy; urgent - intensywny czerwony; stan nieaktywny - stonowany szary. Kolor wskazuje znaczenie, a tempo podpowiada pilność. To warianty demonstracji, nie zmiana produkcyjnych ustawień rozszerzenia.

Prywatność i granice produktu

Profile, reguły, ustawienia i logi pozostają w przeglądarce użytkownika. Privacy Thing nie posiada własnego zaplecza serwerowego do zbierania telemetrii i nie ładuje zdalnego kodu. Funkcje map oraz wyszukiwania lokalizacji korzystają z OpenStreetMap i Nominatim dopiero po świadomym uruchomieniu ich przez użytkownika.

Privacy Thing nie jest VPN-em ani proxy. Nie zmienia publicznego adresu IP i nie obiecuje anonimowości ani niewykrywalności. Jego zadaniem jest precyzyjna, możliwa do zweryfikowania kontrola tych informacji, na które rozszerzenie przeglądarkowe faktycznie może wpływać.

Projekt jest aktywnie rozwijany, a pierwsza publiczna wersja poglądowa miała premierę pod koniec lipca 2026 roku. To, co zaczęło się od podmiany współrzędnych, stało się wieloprzeglądarkowym produktem łączącym kontrolę środowiska, widoczną diagnostykę i zaplecze pozwalające sprawdzać jego działanie w rzeczywistych warunkach.

Na koniec dziękuję osobom, które jeszcze przed premierą zechciały poświęcić czas na testowanie rozszerzenia i dzielić się swoimi uwagami. Ich obserwacje z codziennego użycia pozwoliły znaleźć problemy, których nie dało się odtworzyć samą automatyzacją.

Technologie i obszary

Języki

  • TypeScript

Frontend

  • React

Testy i automatyzacja

  • Playwright
  • Vitest

Web Platform

  • Geolocation API
  • DOM API
  • Web Workers API
  • Service Worker API
  • Web Storage API
  • Canvas API
  • WebGL API
  • HTML Audio API
  • WebRTC API

Rozszerzenia przeglądarkowe

  • Manifest V3
  • WebExtensions API
  • Browser Extension APIs
  • Main World Injection
  • Declarative Net Request API

Build tooling

  • Vite

Mapy i pozycjonowanie

  • OpenStreetMap
  • Nominatim