Ycontacts
Приватність і дані
Що зберігається, що зашифровано і що зникає назавжди — конкретно, без загальних слів.
Коротко
- Телефони, пошти, соцмережі, адреса, примітка і день народження зашифровані в базі ключем вашого акаунта.
- Імʼя, по батькові, альтернативне написання, компанія, посада і позначка «звідки контакт» шифруються так само: застосунок пише і читає їх лише зашифрованими. Але за замовчуванням ключ від шифру лежить на нашому сервері — технічно ми можемо розшифрувати ваші дані. Тому ми не кажемо «ми не бачимо ваших контактів»: це було б неправдою. Наскрізне шифрування, за якого ключ виводиться з вашого секрету і не залишає ваш пристрій, вмикається окремо — в налаштуваннях, у розділі «Безпека»; межі, які лишаються навіть із ним, перелічені нижче.
- Фото візитки — а вставлений текст лише тоді, коли ви натискаєте «Розпізнати точніше», — їде на розпізнавання до Cloudflare Workers AI. Cloudflare прямо зобовʼязується в умовах не використовувати вміст клієнтів для тренування моделей — це записана обіцянка постачальника, а не наше прохання до нього. Оригінал ми не зберігаємо: і фото, і текст існують лише в запиті на розпізнавання.
- Видалення акаунта прибирає з бази все одразу: контакти, ключі, налаштування. Ніякої заморозки на 30 днів. Фото зникають зі сховища тоді ж, а якщо сховище не відповіло — протягом приблизно тижня повторів. Автоматичні резервні копії бази в Neon ще до 6 годин містять видалене, після чого зникають самі.
- Ваші права. Ви можете отримати копію своїх даних, виправити їх, видалити, обмежити обробку, заперечити проти неї і забрати дані в машиночитному вигляді. Експорт і видалення акаунта працюють прямо в застосунку, решта — листом на hello@ycontacts.com; відповідаємо протягом місяця. Поскаржитися можна до CNPD (cnpd.pt) або до органу захисту даних своєї країни.
- Замок екрана ховає застосунок, коли ви відійшли. Поки наскрізне шифрування вимкнене, він не шифрує дані у вкладці і знімається паролем входу; з увімкненим — скидає ключі вкладки і знімається лише вашим секретом (паскі, фразою або ключем відновлення), без пароля.
Межі, які ми називаємо вголос
- Аватари контактів не шифруються. Зашифровані ПОЛЯ контакту, а аватари лежать у файловому сховищі як є, тож ми технічно можемо їх відкрити. Це свідоме рішення, а не недогляд: шифрування фото коштує браузерного кешу і швидкого повторного показу. Чи змінювати це — окреме рішення, і поки воно не ухвалене, межа саме така. Фото візиток ми не зберігаємо з 2026-09-16.
- Фото візитки їде до моделі розпізнавання відкритим — інакше вона нічого не прочитає. Так само відкритим їде вставлений текст, коли ви натискаєте «Розпізнати точніше»; звичайний розбір тексту йде у вашому браузері й нікуди його не надсилає. Це так і з увімкненим наскрізним шифруванням: інакше розпізнавання не працює взагалі. А ні розпізнаний, ні вставлений текст у нас не осідає — ми не зберігаємо їх у жодному стані, ні з шифруванням, ні без нього.
- Код застосунку віддає той самий сервер. Шифрування в браузері захищає від читання даних у базі, а не від сервера, який захотів би віддати змінений код. Це фундаментальна межа браузерного шифрування, і її визнають усі, включно з Proton. Тому наша обіцянка звучить інакше: ключ виводиться з вашого секрету, не залишає ваш пристрій, і ми його не зберігаємо.
- Без наскрізного шифрування той, хто вкраде вашу сесію — наприклад, шкідливою програмою на компʼютері чи з відкритого ноутбука, — прочитає всю базу: сервер розшифровує дані для будь-кого з дійсною сесією. Екран блокування і підтвердження пароля перед експортом стримують людину біля екрана, а не такий запит. Від цього захищає лише наскрізне шифрування.
- Коли базу відкривають ключем відновлення, ми це бачимо і надсилаємо вам лист: щоб увійти таким способом, браузер мусить попросити в нас окремий фрагмент даних, і сам цей запит є подією. Межа в тому, що фрагмент, збережений на пристрої раніше, відкриє базу ще раз уже без звернення до нас — і такий вхід лишиться непоміченим. Тому ми ніде його не зберігаємо, а використаний ключ відновлення застосунок вимагає замінити.
- Перші сім днів після вмикання — пільгове вікно: копія ключа ще лежить у нас, щоб повернути вам доступ, якщо секрет загубиться в перші дні. Поки вікно відкрите, наскрізного шифрування немає, і ми кажемо це прямо, з датою закриття, на екрані «Безпека». Сім днів — це найраніший строк, а не найпізніший: нашу копію ключа щоденне прибирання стирає лише в того, хто підтвердив розблокування. Без підтвердження вона лишається в нас довше — і через 30 днів після вмикання шифрування вимикається само: ключ знову під нашою охороною, а ми пишемо вам про це листом.
- Межа, про яку варто знати: уже зняту копію бази не лікує ніщо. Ключ даних оновлюється при першому вході після закриття пільгового вікна, після зміни фрази, після входу ключем відновлення і за кнопкою «Оновити ключ даних» у розділі «Безпека». Доки його не оновлено, ключ зі знятої копії відкриває і пізніші копії бази; після оновлення збиток обмежений зрізом на дату копії — контактів, доданих чи змінених пізніше, вона не відкриває. Те саме стосується телефонів і пошт: сліпий індекс виводиться з того самого ключа, тож ключ зі знятої копії дає відновити їх перебором за хвилини. Кожне оновлення ключа даних перераховує індекси новим ключем, тому для контактів, доданих чи змінених після оновлення, стара копія цього вже не дає.
- Паскі відкриває базу без фрази на тому пристрої, де вона є. Кожен такий вхід вимагає Face ID, відбитка або коду пристрою — і саме тут межа: хто знає код вашого пристрою, тримає його в руках і може ввійти у ваш Ycontacts, відкриє базу без фрази. Паскі, що синхронізується через iCloud або Google, робить те саме на іншому пристрої того самого акаунта Apple чи Google — за умови коду того пристрою або PIN менеджера паролів і входу в Ycontacts. Видалення паскі не відкликає обгортку, копію якої могли зняти раніше: для втраченого пристрою натисніть ще «Оновити ключ даних». Раз на 14 днів застосунок просить фразу — це нагадування вам, а не замок на базі: сервер не відрізняє ключ даних, відкритий фразою, від відкритого паскі, тож для того, хто вже має вашу паскі й ваш сеанс, це правило перешкодою не стане. Якщо ви входите в Ycontacts через Google, а паскі лежить у Google Password Manager, то обидва шляхи до бази — це один акаунт Google. І навпаки: якщо пристрій ключа паскі не віддасть, база відкриється фразою — паскі її не заміняє.
Як це працює
Шифрування: AES-256-GCM за конвертною схемою. У кожного акаунта свій ключ даних (DEK), загорнутий серверним ключем (KEK); додаткові автентифіковані дані привʼязують шифротекст до конкретного поля конкретного запису, тож переставити значення місцями не вийде. Так влаштований акаунт за замовчуванням, і це НЕ наскрізне шифрування: сервер має доступ до KEK і технічно може розшифрувати дані. Шифрування в обох режимах ховає зміст, а не довжину: з копії бази видно, наскільки довге кожне значення.
Наскрізне шифрування (вмикається в налаштуваннях → «Безпека»): ключ даних загортається ключем, який виводиться з вашого секрету через Argon2id просто у браузері, а серверна обгортка видаляється. Вмикання міняє лише те, чим загорнутий ключ даних; сам ключ оновлюється окремо — при першому вході після пільгового вікна, після зміни фрази і за кнопкою в розділі «Безпека». Ні секрет, ні виведений з нього ключ на сервер не йдуть. Забутий секрет разом із втраченим ключем відновлення означають втрачені дані: якби ми могли їх повернути, ми могли б і читати. Паскі — необовʼязковий швидкий шлях поруч із фразою: ключ даних додатково загортається ключем, який виводиться із секрету паскі просто у вашому браузері. Секрет обчислює сам пристрій у мить, коли ви підтверджуєте вхід, і на сервер він не йде — у нас лежить лише обгортка, яка без цієї паскі не відкриває нічого. Фраза лишається потрібною: на пристрої, де паскі немає, і після кожного оновлення ключа даних — оновлення робить обгортку паскі застарілою, і перезаписати її можна лише фразою разом із підтвердженням на пристрої. Раз на 14 днів застосунок просить фразу окремо — щоб вона не забулась.
Відкритим текстом лишаються службові дані, а не зміст контакту: статус запису, походження (створений вручну, з фото, з тексту чи з файлу), дати створення і зміни, посилання на файл фото, тип каналу і підпис до нього («робочий», «особистий»), назва мережі, у якій профіль, — але не сам профіль. Структура вашої бази теж відкрита — усе, крім назв: скільки у вас таблиць і груп, їхній порядок, колір груп, налаштування колонок (порядок, ширина, які приховано) і які контакти в яких таблицях і групах. Відкрита і ваша власна пошта, якою ви входите. Якщо ви входите через Google, відкритим лежить підтвердження входу від Google (ID token): дані вашого профілю Google — зокрема пошта й посилання на фото — і час входу. Токенів доступу до вашого Google-акаунта ми не зберігаємо зовсім. Якщо ви додали паскі, відкритими лежать і службові дані про неї: ідентифікатор паскі, хост, для якого її створено, підказка браузера про те, як вона підключається (вбудована в пристрій, USB, NFC, Bluetooth, смарт-карта чи через інший пристрій), назва «ОС · браузер», дати додавання й останнього оновлення, позначка «синхронізується» і дата, коли ви останній раз вводили фразу. Без самої паскі вони не відкривають нічого. Зашифровані: імʼя, по батькові, альтернативне написання, компанія, посада, «звідки контакт», телефони (разом із нормалізованим E.164), пошти, соцмережі, адреса, примітка, день народження і «дата знайомства». Застосунок також пише і читає назви ваших таблиць і груп лише зашифрованими. Старі відкриті колонки шести полів, зашифрованих останніми, фізично видалені з бази міграцією 0014 — у копії бази їх більше немає.
Пошук по телефону і пошті працює через сліпий індекс: HMAC-SHA256 на ключі, похідному від вашого DEK через HKDF, від результату лишаються перші 16 байтів. Індекс дозволяє знайти збіг, але відновити з нього номер чи адресу не можна.
Розпізнавання візитки і вставленого тексту (текст — лише за кнопкою «Розпізнати точніше»): Cloudflare Workers AI (модель Mistral Small 3.1). Обрано саме його через приватність: в умовах Cloudflare прямо сказано, що вміст клієнтів не йде на тренування моделей. Раніше тут стояв Google Gemini через Vercel AI Gateway із прапорцем «не використовувати для навчання» — і це було лише проханням у запиті, тобто слабша гарантія; 2026-09-08 ми від нього відмовились. За умовами Cloudflare фото в провайдера не зберігається: воно живе лише в самому запиті на розпізнавання і зникає разом із ним; перевірити це самі ми не можемо. У наше сховище воно не потрапляє взагалі. Вставлений текст іде до того самого постачальника тим самим шляхом; ні в наше сховище, ні в нашу базу він не потрапляє, а в журнал пишеться лише його довжина.
Хто ще обробляє дані: Vercel (хостинг і сховище файлів), Neon (база даних), Cloudflare Workers AI (розпізнавання візиток і вставленого тексту), Resend (службові листи: скидання пароля, підтвердження пошти, події шифрування і паскі).
Де зберігаються дані: база й файли — у Франкфурті (Neon і Vercel, регіон ЄС), там само виконується код застосунку; листи надсилає Resend з Ірландії. Розпізнавання працює в глобальній мережі Cloudflare, тож фото чи текст можуть оброблятися поза ЄС. Усі чотири постачальники — компанії зі США: передача даних спирається на їхню сертифікацію за EU-US Data Privacy Framework, а запасною підставою в їхніх договорах обробки даних є стандартні договірні положення ЄС.
Навіщо і на якій підставі: дані акаунта й ваші контакти обробляємо, щоб надавати сервіс, — це виконання договору з вами. Журнали запитів і обмеження спроб входу — наш законний інтерес у безпеці сервісу. Контакти інших людей обробляємо лише за вашими вказівками: підстава їх зберігати — ваша. Реклами не надсилаємо.
Дані живуть, доки живий акаунт. Окремих архівних копій ми не тримаємо — резервне копіювання роблять Neon і Vercel у межах своїх сервісів. Нікому, крім названих вище, дані не передаються.
Кошик: видалений контакт лежить 30 днів і його можна відновити. Далі щоденне прибирання видаляє рядок остаточно, а фото — зі сховища; якщо сховище не відповіло, видалення фото повторюється раз на добу приблизно тиждень, а що не вдалося прибрати й тоді, позначається для нас окремо. Так само з таблицями: видалена таблиця разом зі своїми групами 30 днів лежить у кошику таблиць, і її можна відновити в налаштуваннях, у розділі «Дані». Далі щоденне прибирання видаляє її остаточно. Самі контакти лишаються в «Усі контакти».
Видалення акаунта: каскадом зникають усі рядки в базі, прибираються токени підтверджень, окремо перелічуються і видаляються всі ваші файли у сховищі. Якщо сховище не відповіло або не встигло, прибирання файлів повторюється раз на добу приблизно тиждень, а що не вдалося прибрати й тоді, позначається для нас окремо. Відкладеної заморозки немає. Межа, яку ми не контролюємо: Neon тримає автоматичну історію бази для відновлення на момент часу, і видалені рядки лишаються в ній ще до 6 годин, доки не випадуть самі.
Якщо станеться витік, що створює ризик для вас, повідомимо листом без зволікань — з тим, що відомо на той момент, — і повідомимо CNPD, коли цього вимагає закон.
Автоблокування: поки наскрізне шифрування вимкнене, це інтерфейсний замок — він накриває застосунок і питає пароль, але контакти вже розшифровані сервером і лежать у памʼяті вкладки, а жива сесія дозволяє дістати їх запитом. З увімкненим наскрізним шифруванням замок робить більше: він скидає ключі вкладки й кеш із розшифрованими даними, а знімає його лише ваш секрет — паскі (завжди з Face ID, відбитком або кодом пристрою), фраза або ключ відновлення. Пароля входу він тоді не питає: секрет шифрування захищає відкриту вкладку сильніше.
Код і його вивезення: сторінки віддаються з політикою безпеки вмісту (CSP). Вона закриває звичні канали, якими підмінена залежність винесла б ваш секрет: запити на чужі адреси (fetch, XHR, WebSocket, EventSource, sendBeacon), картинку-маячок, сабміт форми на чужий домен, чужий iframe і WebRTC у браузерах на Chromium. Чого вона НЕ закриває: верхньорівневої навігації — переходу на чужу адресу, у якій секрет їде частиною самого посилання. Цього не вміє жодна директива CSP, бо ту, що мала це вміти, прибрали з чернетки стандарту. Отже CSP ускладнює вивезення, а не унеможливлює його. З тієї ж чесності: скрипти дозволені лише з одноразовим nonce на кожну відповідь і 'strict-dynamic', без 'unsafe-inline', тож вставлений у сторінку інлайновий скрипт не виконається. Від підміненої залежності це не рятує: її код — частина нашої ж збірки і виконується з тією самою довірою. Стилі поки дозволяють інлайн ('unsafe-inline' у style-src).
Журнали: технічні логи Vercel і Neon містять адреси запитів разом із параметрами, коди відповідей і час, а журнал запитів Vercel — ще й вашу IP-адресу. Серед параметрів трапляються одноразові токени з посилань у листах (скидання пароля, підтвердження адреси); після використання або закінчення строку вони нічого не відкривають. Змісту контактів у журналах немає. При кожному вході бібліотека автентифікації записує в рядок сесії вашу IP-адресу і рядок браузера (user-agent). Той самий рядок наш сервер читає рівно в одному місці — у запиті, яким ви додаєте паскі: з нього складається назва «ОС · браузер» словами з готового переліку, і в базу їде лише ця назва, а не сам рядок. Ще раз рядок браузера дивиться сама ваша вкладка — щоб запропонувати правильний вибір файлів для фото; нікуди він при цьому не йде. IP-адресу бібліотека використовує ще для обмеження спроб входу: у нашій таблиці лічильників лежить лише ключований хеш ключа, з якого адресу не відновити перебором; самої адреси в ній немає. Профілів ми ні з IP-адреси, ні з рядка браузера не будуємо і нікому їх не передаємо. Аналітики і рекламних трекерів у застосунку немає взагалі.
Cookies: лише потрібні для роботи — сесія входу і ваші налаштування (мова, формат дат, автоблокування). Аналітики й рекламних cookies немає.