Відкрити застосунок

Політика конфіденційності

У live.tips немає кукі, аналітики та стеження, і він працює взагалі без акаунта. Якщо ви все ж вирішите увійти — ось що саме зберігається, де, у кого і як довго.

live.tips — це банка для чайових з відкритим кодом для артистів. Її веде Нікіта Рабикін, незалежний розробник, а не компанія. Якщо щось із написаного нижче для вас важливе, напишіть на [email protected] — за цією адресою вам відповість жива людина.

Ця політика чесна навіть у нудних місцях. Ми краще скажемо «ми зберігаємо ваше ім’я стільки, скільки ви тримаєте гурт», ніж заявимо, що не зберігаємо нічого, і збрешемо.

Коротка версія

  • Акаунт необов’язковий. Застосунок працює взагалі без акаунта, і це й досі варіант за замовчуванням. Якщо ви хочете мати свої гурти та свою історію на другому пристрої, ви можете увійти — і тоді частина цього зберігатиметься на сервері, і більше, ніж раніше. Що саме, а що ні — викладено нижче.
  • Без кукі. Жодної, ніде.
  • Без аналітики, без стеження, без реклами, без сторонніх скриптів на цьому сайті.
  • Ми ніколи не торкаємося ваших грошей. Чайові йдуть напряму від глядача на власний рахунок артиста у Stripe, Revolut, MobilePay чи Monzo. Балансу live.tips не існує, ніколи.
  • Без акаунта застосунок спілкується лише зі Stripe — з жодним сервером live.tips. Якщо ви входите в акаунт, це змінюється: ваш ключ Stripe переходить на наш сервер, і Stripe повідомляє нам про ваші чайові, щоб ми могли покласти їх на ваші інші пристрої. Це чесна ціна входу, і її повністю викладено нижче.
  • Push-сповіщення — це нове, необов’язкове й лише для акаунтів, у які ви увійшли. Нічого не надсилається на пристрій, який їх ніколи не вмикав, а на пристрій без акаунта не надсилається взагалі жодного.
  • Сервери, які ми тримаємо, працюють на Firebase від Google. Вони існують на випадок, якщо артист увімкне Revolut, MobilePay чи Monzo — або якщо він увійде в акаунт.

Цей сайт

Сайт статичний і розміщений на GitHub Pages. Як хостинг, GitHub отримує IP-адресу та user-agent браузера кожного, хто відкриває сторінку, — це звичайне журналювання вебсервера, воно відбувається ще до того, як запуститься будь-який наш код, і ми не можемо його вимкнути. GitHub обробляє ці дані за власною заявою про конфіденційність. Ми не читаємо ці журнали, і GitHub нам їх не показує.

Крім цього, сторінки, які ви читаєте, не завантажують нічого ні від кого стороннього: шрифти, іконки та зображення віддає сам live.tips. Немає ні Google Analytics, ні тег-менеджера, ні пікселя, ні вбудованих віджетів.

Сайт зберігає два значення в localStorage вашого браузера — обидва задані вами, обидва доступні для читання лише цьому сайту, і жодне з них нікуди не надсилається:

Ключ Що він пам’ятає
lt-landing-theme чи обрали ви світлу, темну або автоматичну колірну схему
lt-langbar-dismissed що ви закрили банер «також доступно вашою мовою»

Очищення сховища браузера видаляє їх. Це не кукі, ними ні з ким не діляться, і вони нікого не ідентифікують.

У застосунку два режими, і вся суть — у різниці між ними

Усе написане нижче залежить від одного питання: чи увійшли ви в акаунт?

Режим перший — без акаунта. Досі за замовчуванням, досі без змін.

Застосунок працює на власному пристрої артиста, і все, що він знає, живе там само:

  • Обмежений ключ Stripe зберігається у сховищі ключів пристрою (Keychain на iOS/macOS, Keystore на Android) і надсилається лише на api.stripe.com.
  • Історія чайових, історія сесій, ціль, список запитів пісень і налаштування застосунку зберігаються в локальному сховищі пристрою. Сюди входять імена та повідомлення, які глядачі додають до своїх чайових.
  • Видалення застосунку стирає все це. Резервної копії в хмарі з нашого боку немає, бо в цьому режимі з нашого боку немає жодної хмари.

Ми ніколи нічого з цього не отримуємо. Застосунок постачається без аналітичного SDK, без збирача збоїв і без рекламного коду — їх немає взагалі, а не просто вимкнено. (Push-сповіщення існують, але це функція для тих, хто увійшов в акаунт, і вони вимкнені, доки ви їх не увімкнете, — див. Режим другий. На пристрій без акаунта не надсилається жодного.)

Два уточнення, щоб твердження «ні з ким не спілкується» лишалося точним:

  • Застосунок раз на день завантажує курси валют із публічних API курсів (frankfurter.dev, open.er-api.com, currency-api.pages.dev). Це звичайні запити на публічний перелік курсів. Вони не несуть жодної інформації про вас, артиста чи будь-які чайові — але, як і будь-який вебзапит, вони розкривають вашу IP-адресу цим сервісам.
  • Якщо ви користуєтеся браузерною версією застосунку, ваш браузер завантажує її з нашого статичного хостингу (див. Цей сайт вище).

Режим другий — ви увійшли в акаунт. Тоді частина даних свідомо залишає пристрій.

Вхід в акаунт — свідома дія. Ніхто не входить за вас, і ніщо в застосунку не перестає працювати, якщо ви не увійдете ніколи. Ви входите тому, що хочете другий пристрій: телефон у кишені й планшет на сцені, які показують той самий вечір, ті самі гурти, ту саму історію.

Це працює лише тоді, коли їх тримає сервер. Отже, він їх тримає, і це чесна ціна другого пристрою.

Сервер — це Firebase, тобто Google. Завести акаунт можна трьома способами:

  • Вхід через Apple або вхід через Google — Firebase Auth отримує те, що передає провайдер: ідентифікатор користувача (uid) і, зазвичай, адресу електронної пошти та ім’я. (В Apple можна приховати пошту; тоді Apple видає нам замість неї адресу-ретранслятор і передає ваше ім’я лише найпершого разу, коли ви входите.)
  • Гостьовий акаунт — анонімний акаунт без пошти й без імені. Він синхронізується і його можна відкликати, але відновити його нічим, якщо ви втратите пристрій. Це uid і більше нічого. Гостьовий акаунт не може користуватися ні серверним зберіганням ключа Stripe, ні push-сповіщеннями, описаними нижче, бо і те, і те потребує акаунта, який ми можемо повернути вам.

Щойно ви увійшли, акаунт отримує власний закритий куточок у базі даних Google Cloud Firestore, за адресою users/<your uid>/. Правила безпеки віддають цей куточок саме цьому uid і більше нікому — жоден інший акаунт не може його прочитати, зокрема й добором URL. Усередині:

Що Навіщо це там
Ваші гурти — назви, налаштування банки для чайових і способів оплати, текст постера, цілі та ваш список запитів пісень щоб гурт існував на кожному пристрої, де ви увійшли
Налаштування застосунку, включно з вашими налаштуваннями сповіщень щоб доданий пристрій уже був налаштований
Записи сесій та історія чайових — включно з іменами та повідомленнями, які глядачі додають до своїх чайових, і будь-якою піснею, яку попросив глядач бо саме цю історію ви й попросили показати на іншому пристрої
Жива сесія, що триває просто зараз щоб другий екран міг приєднатися до сьогоднішнього сету
Ваші пристрої — ім’я, яке кожен дає собі сам («iPhone Нікіти»), його платформа й модель, його мова інтерфейсу, коли його побачили вперше та востаннє, і (якщо ви увімкнули сповіщення) push-токен щоб «Налаштування → Безпека» могли їх перелічити, щоб сповіщення дійшло до потрібного пристрою потрібною мовою і щоб ви могли будь-який відкликати
Невеликий документ профілю — обране вами ім’я акаунта та провайдер, через якого ви увійшли щоб перемикач акаунтів міг його підписати
Стрічка сповіщень — обмежений список останніх чайових і запитів пісень, що надійшли, поки не тривав жоден сет щоб ви могли надолужити те, що пропустили

А тепер головне, прямим текстом: без акаунта ім’я та повідомлення глядача ніколи не залишають пристрій артиста. З акаунтом вони зберігаються на серверах Google під uid артиста як частина його власної синхронізованої історії, і — як пояснюють два наступні розділи — тепер саме наш сервер записує їх туди. Жоден інший акаунт не може їх прочитати, ми в них не заглядаємо і нічого з них не виводимо — але вони там є, і лишаються там стільки, скільки існує гурт, і вам варто знати про це, перш ніж входити.

Вихід з акаунта повертає пристрій у локальний режим. Дані акаунта він не видаляє — див. Як усе видалити нижче.

Ваш ключ Stripe при вході переходить на наш сервер

Це найбільша зміна, і саме її варто прочитати найуважніше.

Без акаунта ваш обмежений ключ Stripe ніколи не залишає ваш пристрій. Це Режим перший, і він без змін.

Коли ви входите в акаунт, ключ таки залишає пристрій — до нас. Ключ зашифровано (окремий для кожного секрету ключ AES-256, який, своєю чергою, загорнутий у Google Cloud KMS) і збережено на сервері в місці, звідки його ніхто не може прочитати назад — ні інший акаунт, ні навіть ви самі. Його розпечатують лише всередині наших Cloud Functions, використовують, щоб спілкуватися зі Stripe від вашого імені, і більше ніколи не віддають на пристрій.

Оскільки ключ тепер живе в нас, Stripe повідомляє про ваші чайові напряму на наш сервер: ми реєструємо вебхук на вашому власному акаунті Stripe, і Stripe повідомляє цьому вебхуку щоразу, коли сплачено чайові. Наша функція записує чайові в історію вашого акаунта (див. нижче). Для акаунта, у який ви увійшли, ваш застосунок більше не опитує Stripe; він звертається до Stripe лише через вузький, фіксований перелік операцій на нашому сервері (створення вашого посилання на чайові, випуск посилання на запит пісні та зчитування ваших власних чайових для звірки).

Отже, без евфемізмів: для акаунта, у який ви увійшли, тепер на шляху між Stripe і вашою історією стоїть сервер live.tips. Ми, як і раніше, ніколи не торкаємося грошей — чайові карткою створюються для вашого акаунта Stripe, осідають на вашому балансі Stripe і виплачуються за вашим графіком Stripe, точно як і раніше. Змінився шлях даних, а не шлях грошей. Якщо ви ніколи не входите в акаунт, ніщо з цього вас не стосується, і застосунок і далі спілкується напряму з api.stripe.com і ні з ким більше.

Додавання пристрою за QR-кодом

Щоб додати пристрій, ви показуєте QR-код із пристрою, на якому вже увійшли. Код випадковий, одноразовий і живе дві хвилини, і новий пристрій не отримує нічого, доки ви не натиснете підтвердити на старому. Поки це рукостискання відкрите, ми тримаємо код, ім’я, яке новий пристрій дав собі сам, і його платформу — і запис видаляється, коли код спливає. Сфотографований QR-код марний без вашого підтверджувального дотику.

Запити пісень

Гурт може увімкнути запити пісень: глядачі тоді обирають пісню зі списку артиста і, за бажанням, платять, щоб підняти її в черзі. Запит — це просто чайові, які додатково несуть те, яку пісню попросили, — тож ті самі ім’я та повідомлення, які глядач може додати до чайових, стосуються й тут, і це зберігається та утримується точно як будь-які інші чайові (нижче). Публічна черга, яку бачить глядач, показує лише підсумки за кожною піснею — скільки пісня зібрала й де вона в черзі — і не містить імен глядачів. Без акаунта весь список запитів пісень та його історія живуть лише на пристрої.

Push-сповіщення

Коли ви увійшли в акаунт, застосунок може надіслати вам push-сповіщення — але лише якщо ви ввімкнете його, на кожному пристрої окремо, і лише після того, як операційна система вашого пристрою надасть дозвіл. Воно існує заради одного: чайові або запит пісні, що надходять, поки ви не ведете сет, щоб ви почули про чайові, які інакше пропустили б. Чайові, що надходять, поки ваша сцена наживо, не надсилають нічого — ви їх і так бачите.

  • Щоб доставити push, Firebase Cloud Messaging (FCM) від Google потрібен push-токен пристрою. Ми зберігаємо цей токен і мову інтерфейсу пристрою у власному записі цього пристрою під вашим акаунтом, і він видаляється тієї ж миті, коли ви вимикаєте сповіщення, відкликаєте пристрій або виходите з акаунта. Мертві токени прибираються автоматично.
  • Саме сповіщення каже, що надійшло, — суму, а також ім’я глядача чи назву пісні, якщо він їх лишив. Той самий короткий список зберігається у стрічці сповіщень вашого акаунта, обмеженій останньою сотнею записів, щоб ви могли прогорнути назад те, що надійшло, поки вас не було.
  • У вебі, щоб доставити push, потрібні невеликий service worker у корені сайту та SDK обміну повідомленнями Firebase, який ваш браузер першого разу завантажує від Google (gstatic.com). Далі веб-push несе власна служба push вашого браузера (для Chrome — це служба Google). Ніщо з цього не завантажується, доки ви не ввімкнули сповіщення.
  • Гостьовий акаунт і пристрій без акаунта не отримують push-сповіщень, бо push потребує акаунта, якому ми можемо доставити, і токена, який ви вирішили дати.

Де все це фізично живе

Firebase Auth, Cloud Firestore, наші Cloud Functions і ключ Cloud KMS, що загортає ваш секрет Stripe, працюють у Європейському Союзі: база даних — у мультирегіоні Google eur3, функції та сховище ключів — в europe-west1. Google діє як наш обробник згідно з умовами конфіденційності та безпеки Firebase і власною політикою конфіденційності. Як і будь-який великий провайдер, Google може залучати інфраструктуру за межами ЄС для підтримки та безпеки; це регулюють ті умови, а не ми. Push-сповіщення, щойно передані до Firebase Cloud Messaging і служби push вашого браузера чи телефона, йдуть інфраструктурою цих компаній, щоб дістатися вашого пристрою.

Stripe

Коли глядач платить карткою, він перебуває на сторінці оплати Stripe, а не на нашій. Stripe збирає й обробляє його платіжні дані як самостійний контролер згідно з Політикою конфіденційності Stripe. Ми ніколи не бачимо номерів карток.

Те, як ваші чайові доходять до вас, залежить від режиму:

  • Без акаунта застосунок артиста зчитує його власні чайові зі Stripe за допомогою його ж обмеженого ключа — напряму з пристрою на api.stripe.com. Жодного сервера live.tips на цьому шляху немає.
  • Коли ви увійшли в акаунт, ключ живе на нашому сервері (зашифрований, як вище), і Stripe повідомляє про кожні чайові нашому вебхуку, який записує їх у власну історію цього артиста у Firestore. У цьому режимі на шляху є сервер live.tips — для даних про чайові, ніколи для грошей. Ім’я та повідомлення глядача, якщо він їх лишив, ідуть разом із чайовими у власну історію цього артиста й далі не рухаються.

Ретранслятор — лише якщо увімкнено Revolut, MobilePay чи Monzo

Тих, у кого налаштовано лише Stripe, це не стосується взагалі.

Revolut, MobilePay та Monzo не дають застосунку жодної можливості підтвердити, що платіж відбувся, тож такі чайові проходять через невеликий ретранслятор з відкритим кодом, який ми тримаємо на Firebase: Cloud Functions і Firestore в europe-west1, а сторінка чайових для глядача віддається з tip.live.tips/t/<id>. Він ніколи не торкається грошей. Ось усе, що він обробляє.

Що зберігає артист

Створення сторінки чайових зберігає відображуване ім’я артиста, його публічне повідомлення, валюту та платіжні реквізити, які він вирішив опублікувати (посилання для оплати у Stripe, ім’я користувача Revolut, Box ID у MobilePay, ім’я користувача Monzo), а якщо увімкнено запити пісень — його публічний список пісень та ціни за кожну пісню. Усе це — інформація, яку артист і так свідомо публікує для глядачів.

  • Зберігання: сторінка чайових, за якою немає акаунта, видаляється автоматично після 90 днів неактивності. Сторінка чайових, що належить акаунту, живе стільки ж, скільки гурт, до якого вона прив’язана.
  • Артист може видалити її негайно із застосунку, будь-коли.
  • Жодних адрес електронної пошти, паролів, юридичних імен чи банківських реквізитів тут не збирається.
  • Секрет сторінки зберігається лише у вигляді хешу. Ми не змогли б назвати вам цей секрет, навіть якби ви попросили; ми можемо лише перевірити пред’явлений.

Що надсилає глядач

Форма чайових просить суму, а також, за бажанням, ім’я та повідомлення — а для запиту пісні ще й те, яку пісню. Це вся форма. Ні пошти, ні номера телефону, ні акаунта.

Куди йде цей написаний глядачем текст і як надовго — залежить від того, чи увійшов артист в акаунт:

  • Якщо за сторінкою чайових немає акаунта, чайові записуються до черги доставлення — це один документ, який існує лише для того, щоб бути переданим на екран артиста. Коли екран показує чайові, пристрій артиста видаляє цей документ. Видалення і є підтвердженням доставлення. Якщо екран артиста офлайн — телефон заблоковано, немає зв’язку — чайові чекають у цій черзі до однієї години, щоб вони просто не загубилися, і передаються тієї ж миті, коли екран знову з’єднається. Якщо ніхто не з’єднається, вони видаляються непереглянутими — їх прибирає регулярне завдання. Для артиста без акаунта ця черга — єдине місце, де написаний глядачем текст узагалі зберігається на нашому сервері, і одна година — його жорсткий ліміт.
  • Якщо сторінка чайових належить акаунту, у який увійшли, черги немає. Наш сервер записує чайові напряму у власну історію цього артиста під його uid — у сьогоднішню сесію, якщо триває сет, або в архів самого гурту, якщо ні. Там вони лишаються стільки, скільки існує гурт; це власна історія артиста, і саме заради неї він і входив. Це та сама історія, у яку пише вебхук Stripe, описаний вище.
  • Ваше ім’я та повідомлення також потрапляють до призначення платежу, яке відкривається в Revolut, MobilePay чи Monzo, — саме так артист дізнається, хто лишив чайові. Далі ці компанії обробляють їх за власними політиками конфіденційності.
  • Ретранслятор не веде наскрізної історії чайових між артистами. Він не може показати ні вам, ні нам, ні будь-кому іншому список того, хто кому лишив чайові в різних артистів.

IP-адреси та захист від зловживань

Відкрита форма, до якої може надсилати дані будь-хто, потребує захисту від ботів, тому:

  • Ваша IP-адреса надсилається до Cloudflare Turnstile — перевірки на бота, що працює на сторінці чайових, — щоб підтвердити, що ви не бот. Turnstile — це продукт Cloudflare, і його використано замість CAPTCHA, яка вас профілює. Turnstile і наш DNS — це все, що Cloudflare для нас іще робить; сам ретранслятор тепер працює на Firebase. Див. Політику конфіденційності Cloudflare.
  • Ваша IP-адреса також використовується для обмеження частоти запитів — надсилання чайових, створення сторінки чайових, погашення коду додавання пристрою. Для цього ми зберігаємо криптографічний хеш IP-адреси із сіллю, а не саму IP-адресу, приблизно дві години, а потім видаляємо його. Сіль — це серверний секрет: без неї код відмовляється зберігати бодай щось, замість того щоб тримати хеш, який можна обернути.
  • Операційні журнали Google фіксують технічні деталі запитів до ретранслятора — URL, час, статус — протягом кількох днів. Наш код свідомо не пише в журнали ні імен, ні повідомлень, ні секретів, ні заголовків. Google діє як наш обробник.

Лічильники

Ретранслятор рахує, скільки чайових передала та чи інша сторінка чайових, щоб ми могли помічати зловживання й розуміти, чи цим узагалі користуються. Це число. Воно не містить жодних даних глядачів.

Хто що обробляє

Хто Що отримує Навіщо
Google (Firebase) Акаунти, синхронізовані дані артиста, який увійшов, зашифрований ключ Stripe, ретранслятор, push-токени та доставлення, журнали сервера Необов’язковий акаунт, необов’язковий ретранслятор і push-сповіщення
Google Cloud KMS Ключ, що загортає секрет Stripe артиста, який увійшов (ніколи не сам секрет у відкритому вигляді) Щоб збережений ключ Stripe лишався нечитабельним у стані спокою
Stripe Платіжні дані глядача, як самостійний контролер; а для артиста, який увійшов, — події чайових, надіслані нашому вебхуку Чайові карткою
Cloudflare IP-адреса глядача — для перевірки Turnstile на сторінці чайових. І наш DNS. Щоб боти не лізли у форму чайових
GitHub IP-адреса та user-agent кожного, хто відкриває цей сайт Хостинг сайту
Служба push вашого браузера / телефона (напр., Google для Chrome) Push-токен і вміст сповіщення, якщо ви ввімкнули сповіщення Доставлення push-сповіщень
Revolut / MobilePay / Monzo Усе, що глядач робить у їхньому власному застосунку, включно з призначенням платежу Ці способи оплати

Ми нікому нічого не продаємо, і більше нікого в цьому списку немає.

Правова підстава, якщо вона вам потрібна (GDPR)

  • Робота акаунта, про який ви попросили, синхронізація ваших власних даних на ваші власні пристрої, зберігання вашого ключа Stripe, щоб ваші чайові доходили до вашої історії, робота ретранслятора для артиста, який його увімкнув, доставлення чайових глядача на той екран, якому вони призначені, і надсилання push, який ви ввімкнули: виконання послуги, про яку ви попросили.
  • Обмеження частоти запитів, Turnstile, квоти за хешованими IP та відкликання пристроїв: законний інтерес у тому, щоб безкоштовний відкритий сервіс не був знищений ботами й шахрайством, і в тому, щоб акаунти артистів лишалися захищеними.
  • Журнали сервера: законний інтерес у роботі та безпеці сервісу.

Як усе видалити

Це важливіше за будь-яку обіцянку, яку ми могли б дати, тож ось що є на сьогодні — включно з тим, чого немає.

  • Без акаунта: видаліть застосунок. Це все, і всього цього більше немає.
  • Гурт: видалення гурту в застосунку стирає хмарні дані цього гурту — його налаштування, його ключі, його сесії, його історію чайових — разом із копією на пристрої.
  • Сторінка чайових: видаліть або перестворіть її в застосунку, і вона миттєво зникає з ретранслятора разом з усіма чайовими, що чекали на доставлення.
  • Push-сповіщення: вимкніть їх на пристрої — і його push-токен видаляється. Стрічка сповіщень очищується разом з гуртом або акаунтом.
  • Пристрій: «Налаштування → Безпека» перелічують ваші пристрої. Ви можете відкликати один із них або вийти всюди, крім поточного, — це завершує сесію кожного іншого пристрою негайно, а не колись.
  • Увесь акаунт, одним дотиком: такої кнопки в застосунку поки що немає. Ми краще це визнаємо, ніж вдаватимемо інше. Поки її немає, напишіть на [email protected], і ми видалимо акаунт і все, що під ним, вручну. А тим часом ви вже зараз можете видалити кожен гурт — це прибирає все змістовне (включно зі збереженим ключем Stripe) і лишає позаду порожній акаунт.

Ваші права

Ви можете попросити нас надати вам копію, виправити або видалити будь-що, що ми про вас зберігаємо, а також можете поскаржитися до національного органу із захисту даних. Пишіть на [email protected].

На практиці більшість цього вже у ваших руках: артист може миттєво видалити сторінку чайових або гурт із застосунку, недоставлені чайові глядачів на сторінці без акаунта зникають протягом години, а якщо ви ніколи не входили в акаунт, то нічого з цього ніде й не було, крім вашого власного пристрою.

Діти

live.tips не орієнтований на дітей, і ми свідомо не обробляємо їхніх даних.

Зміни

Ми оновлюватимемо цю сторінку, коли змінюватиметься програмне забезпечення. Оскільки весь проєкт має відкритий код, кожна попередня версія цієї політики є в публічній історії git — ви можете точно подивитися, що саме й коли змінилося.

Мова

Цю політику опубліковано всіма мовами, які підтримує сайт, — для зручності. Якщо переклад і англійська версія розходяться, вирішальною є англійська версія.

Умови