Сторінки Lolly про приватність і безпеку містять заяви: без аналітики, без відстеження, файли ніколи не покидають пристрій, одна кука в усій системі. Ця сторінка інша: вона не просить вас повірити всьому цьому на слово. Це перелік процедур, кожна з точною командою чи шляхом кліків і результатом, який ви побачите. Кожна заява тут спростовна за кілька хвилин, здебільшого без встановлення будь-чого.
Якщо якась перевірка на цій сторінці не дає показаного результату - це або баг, або порушена обіцянка. Повідомте про це у будь-якому разі, і ми поставимося до цього з тією серйозністю, якої заслуговує порушена обіцянка.
Побачте це в дії за десять секунд
Перш ніж перейти до процедур - результат. Відкрийте /verify і перетягніть на нього файл - без завантаження, без облікового запису, без очікування на сервер. Ось як він перевіряє згенерований шторм у Квінсленді зі сторінки нашої позиції щодо ШІ: зображення Gemini, яке Lolly відкрила, змінила розмір і експортувала. Кожен значок нижче обчислено на пристрої, з байтів самого файлу.
signed by Lollyvector SVGAI generatedПеревірте саміGet the signed file147 paths~9.4k nodes72 groups2 images254 KB
signed by Lollyvector SVGAI generatedПеревірте саміGet the signed file147 paths~9.4k nodes72 groups2 images254 KB
Вердикт - не один значок, а невелика купка їх, кожен - незалежний факт:
- Зроблено з Lolly - облікові дані непошкоджені і фіксують експорт з Lolly.
- Облікові дані непошкоджені - підписаний маніфест C2PA розбирається, і його власний підпис заяви підтверджується.
- Байти не змінилися - хеш файлу досі збігається з тим, що було підписано. Змініть один піксель, і цей значок перемкнеться.
- GEN AI - ці пікселі створила машина, і файл про це повідомляє. Lolly зчитує цю заяву назад, а не приховує її.
І вся історія подорожує разом із файлом. Тут збереглося дев'ять кроків - п'ять записав Google під час генерування й водяного знакування зображення, потім чотири записала Lolly під час відкриття, позначення й конвертації копії на цій сторінці - зчитані прямо з байтів, на вашому пристрої, і відображені як хронологія. Це те саме зображення, перевірене тим самим способом, що й хронологія C2PA на сторінці позиції щодо ШІ.
signed by Lollyvector SVGПеревірте саміGet the signed file71 paths~8.9k nodes78 groups111 KB
signed by Lollyvector SVGПеревірте саміGet the signed file71 paths~8.9k nodes78 groups111 KB
Втім, це ще не є заявою про довіру - це демонстрація. Решта цієї сторінки і є заявою про довіру: кожен значок вище відтворюваний, і ось як відтворити гарантії, що стоять за ними.
У вашому браузері, без інструментів
1. Спостерігайте за мережею. Відкрийте lolly.tools, відкрийте DevTools браузера (F12), перейдіть на вкладку Network і скористайтеся інструментом - введіть URL у QR Code, змініть кольори, експортуйте PNG. Кожен запит залишається на lolly.tools: оболонка застосунку, власні файли інструмента, ресурси каталогу. Жодного хоста аналітики, жодного CDN-маячка, жодної служби шрифтів, жодної точки "звітування про помилки". Те, що ви вводите в інструмент, не з'являється в жодному запиті - рендеринг локальний.
Чесні винятки - кожен з них опційний, ініційований користувачем і видимий у тій самій вкладці Network, коли він відбувається: додавання шрифту Google у редакторі бренду завантажує саме цю гарнітуру з Google, після діалогу згоди, який чітко про це повідомляє, один раз, перед першим завантаженням; клацання на пресеті ICC-профілю для друку завантажує цей профіль з публічного реєстру ICC на color.org; відтворення опційного вбудованого радіо транслюється зі станції; введення місцевості в Meeting Planner шукає це місце в геокодувальному сервісі open-meteo для отримання координат і часового поясу, один раз на місто (відповіді зберігаються на вашому пристрої), і поле вводу несе це розкриття прямо там, де ви вводите; а URL Screenshot обов'язково завантажує URL, який ви ввели - це його робота, і ви спостерігаєте, як це відбувається. Інструмент, що декларує мережеву можливість, може звертатися лише до хостів, дозволених його маніфестом, і цей механізм за замовчуванням заборонний; жоден інструмент наразі не декларує такого, тож саме Content-Security-Policy, яку примусово застосовує браузер, є межею, що реально утримує наведений вище список у межах його хостів. Політика конфіденційності містить канонічну таблицю всіх цих випадків; її незмінне правило - мережевого звернення, якого немає в цій таблиці, не відбувається.
2. Витягніть штепсель. Завантажте застосунок, відкрийте один-два інструменти, а потім вимкніть з'єднання - режим польоту, або DevTools → Network → Offline. Перезавантажте. Галерея та кожен відкритий вами інструмент продовжують працювати, включно з рендерингом і експортом у форматах, якими ви користувалися - файли інструмента та кодувальник формату кешуються під час першого використання, тож скористайтеся інструментом один раз онлайн, перш ніж перевіряти його офлайн. Це найпотужніша окрема перевірка на цій сторінці: програмне забезпечення, що телефонує додому, не переживає перерізаного шнура.
3. Порахуйте кукі. DevTools → Application (Firefox: Storage) → Cookies → https://lolly.tools. Список порожній - застосунок не встановлює кукі. Або вставте document.cookie у консоль: отримаєте "". (Єдина кука в усій системі, lolly_ca_state, живе щонайбільше десять хвилин під час опційного входу в систему ідентичності - видаляється в момент завершення входу - прив'язана до /api/ca і має ознаку HttpOnly: політика конфіденційності описує її точно.)
4. Прочитайте власне сховище. Та сама панель Application: усе, що зберігає Lolly, можна перевірити прямо перед вами - пара десятків звичайних ключів localStorage (тема, мова, ширина бічної панелі, налаштування звуку та вигляду, а також кешована копія публічного індексу каталогу інструментів), і ваші власні документи в IndexedDB. Кожне значення - це читабельний рядок або JSON - нічого не заплутано, нічого не закодовано, щоб завадити читанню. Profile → Clear all my data стирає це; так само як і очищення даних сайту в браузері, оскільки серверної копії, яка могла б це пережити, немає.
5. Перевірте, що контакт для розкриття інформації існує. /.well-known/security.txt відповідає блоком контактів RFC 9116, а не HTML-сторінкою.
З терміналу
6. Кінцева точка рендерингу вимкнена на lolly.tools. Єдина серверна функція, яка б розміщувала введені користувачем дані в URL - рендеринг за прямим посиланням - тут вимкнена, доки служба не переїде на хостинг, що належить організації (у політиці конфіденційності пояснено чому):
curl -s -o /dev/null -w '%{http_code}\n' 'https://lolly.tools/tool/qr-code.svg?url=test'
# 404
Перемикач діє на рівні розгортання (LOLLY_DISABLE_RENDER_GET=1): на lolly.art, публічному демонстраційному екземплярі, рендеринг за прямим посиланням свідомо увімкнений, тож той самий запит там повертає зображення - ця відмінність є результатом роботи прапорця, а не непослідовністю.
7. Серверну поверхню можна перелічити. Server Surface перелічує кожен наявний серверний маршрут, з незмінним правилом, що кінцева точка, якої немає на цій сторінці, не є частиною Lolly. Перевірте їх через curl; більше нічого шукати.
У джерельному коді
Усе вище могло б досі бути виставою, якби розгорнутий код відрізнявся від публічного. Тож перевірте код - розгортання збирається з публічного репозиторію:
git clone --recurse-submodules https://github.com/lolly-tools/lolly.git
cd lolly
8. Ніяких трекерів, ніяких SDK аналітики, ніде. Пошукайте в коді, що постачається, - у рушії, кожній оболонці (включно з розширенням браузера, перевизначеннями моста Tauri та service worker), серверних функціях і пакетах інструментів - звичних підозрюваних:
grep -rn --include='*.ts' --include='*.js' --include='*.mjs' --include='*.html' \
-e googletagmanager -e google-analytics -e posthog -e mixpanel -e hotjar \
-e sentry.io -e segment.com -e '@vercel/analytics' \
engine/src shells/*/src shells/chrome-extension shells/*/bridge-overrides \
shells/web/public/sw.js services packages api community brands/*/tools
# (no output)
9. Жодного стороннього DNS-резолвера. Перевірка SEAL у Verify ніколи не спрямовує пошуки через провайдера DNS-over-HTTPS - вебзастосунок просто не має резолвера:
grep -rn --include='*.ts' --include='*.js' --include='*.mjs' \
-e cloudflare-dns.com -e dns.google -e /dns-query \
engine/src shells/*/src shells/chrome-extension shells/*/bridge-overrides \
shells/web/public/sw.js services packages api community brands/*/tools
# (no output: outside this page and its built copies, the only place those
# hostnames appear in the repo is tests/no-trackers.test.ts, the test that
# bans them)
10. Служба сертифікатів нічого не зберігає. Ідентифікаційний CA не має журналу видачі - ні вашої електронної пошти, ні часової позначки, ні вебхука. Цю відсутність можна перевірити через grep:
grep -rn logIssuance services/ca api/ca
# (no output)
Забезпечено тестами, а не обіцянками
Три перевірки джерельного коду вище - не одноразовий аудит: вони закріплені в наборі тестів, тож не можуть непомітно застаріти. tests/no-trackers.test.ts провалює збірку, якщо:
- будь-який SDK аналітики чи відстеження з'являється будь-де в просканованому джерельному коді, що постачається, - у застосунку, рушії, сервері, розширенні та коді пакетів інструментів однаково,
- будь-який сторонній DNS-over-HTTPS резолвер з'являється в цьому коді,
- журнал видачі CA повертається - у джерельному коді або у згенерованому серверному пакеті,
- політика конфіденційності втрачає свої юридично обов'язкові твердження (названий контролер, правова підстава, право на скаргу).
Запустіть їх самостійно в клоні (Node 22.18+; для цього файлу npm install не потрібен):
node --test tests/no-trackers.test.ts
# ✔ no analytics or tracking SDK appears anywhere in shipped source
# ✔ no third-party DNS-over-HTTPS resolver is contacted
# ✔ the certificate service logs no personal data
# ✔ privacy policy states a controller, a legal basis and a right to complain
Повний набір (npm install && npm test) запускає ще кілька тисяч тестів, включно зі змагальними криптографічними тестами, описаними в Security & Verification.
Що не можна перевірити ззовні - сказано прямо
Така сторінка заслуговує на довіру, називаючи власні межі:
- Журнали доступу хостингу. Будь-який сервер, що відповідає на запит, може журналювати цей запит - IP, шлях, часову позначку. Ви не можете перевірити, що хост зберігає, а що ні, і ми теж не можемо, окрім задокументованої поведінки нашого провайдера. Саме тому архітектура тримає ваш вміст повністю поза мережею: те, що ніколи не залишає ваш пристрій, не може бути залогованим ніким.
- Що розгортання виконує саме цей код. Ви можете перевірити, що джерельний код чистий і що розгорнута поведінка йому відповідає (наведені вище перевірки роблять і те, і те), але атестація на рівні бінарного коду веброзгортання - це те, чого вебплатформа не пропонує. Пом'якшення - це публічний репозиторій, примусові тести та перевірка офлайн - підмінене розгортання, що телефонує додому, одразу провалює перевірки 1 і 2.
- Хуки інструментів за замовчуванням не ізольовані пісочницею. Опційна логіка інструмента виконується перевіреною, у власному просторі сторінки; кожен інструмент на lolly.tools є першосторонім і перевіряється перед публікацією. Ізоляція через Worker тепер доступна як опційне ввімкнення для окремого інструмента - інструмент, чий маніфест встановлює
isolate: true, виконує свої хуки поза основним потоком - тож те, що не можна перевірити ззовні, звужується, але шлях за замовчуванням досі виконується у власному просторі, і контролем досі є перевірка. Це заявлено, а не приховано - див. розділ межі проєктування, де це завжди зазначалося.
Якщо перевірка провалюється
Розбіжність між цією сторінкою та спостережуваною поведінкою - це звіт про безпеку, і ми справді радше почуємо про неї, ніж ні: fitzy+security@suse.com, кнопка Report a vulnerability у будь-якому репозиторії lolly-tools або контакт у /.well-known/security.txt. Скоординоване розкриття інформації та визнання заслуг репортера - це незмінна політика - деталі в SECURITY.md.