Политика приватности COCOFLY
Версия 0.2.0 · сентябрь 2026 · English below
Это описание того, какие данные игра COCOFLY хранит и зачем, написанное тем, кто её сделал. Оно не является юридической консультацией. Если что-то в тексте расходится с тем, что делает код, верен код — он открыт, и ссылки на нужные файлы приведены ниже.
Оператор (controller): сопровождающий проекта (the project maintainer), частное лицо, резидент Кипра (ЕС). Контакт: [privacy@example.com — заменить]. Данные обрабатываются инфраструктурой Cloudflare (Workers, D1, Static Assets) от имени оператора.
1. Игра без входа в аккаунт
По умолчанию COCOFLY ничего не отправляет о вас на сервер, кроме анонимных счётчиков (п. 3). В браузере (localStorage) хранятся:
cocofly.save.v2— сохранение игры (состояние Коко: время, показатели, квартира, журнал событий за последние 150 записей, ваши подсказки ей);cocofly.settings— язык, тема, звук, скорость, автосохранение в облако;cocofly.meta— прогресс режима «Поколения» (открытые аллели, номер поколения, родословная).
Эти данные не покидают ваше устройство, пока вы не войдёте в аккаунт. Кнопка «Сохранить файл» выгружает сохранение в JSON на ваш диск; «Начать заново» перезаписывает его. Очистка данных сайта в браузере удаляет всё перечисленное.
2. Аккаунт и облачное сохранение (только если вы вошли)
Вход добровольный и нужен для синхронизации между устройствами и таблицы рекордов. При входе сервер хранит в базе D1:
| Что | Зачем | Где в коде |
|---|---|---|
| адрес e-mail, дата подтверждения | вход, ссылки подтверждения/сброса пароля | api/migrations/0001_init.sql → users |
| хеш пароля (PBKDF2-SHA-256, 100 000 итераций, соль); сам пароль не хранится | вход | api/src/util.js |
| никнейм (2–24 символа, необязателен), язык интерфейса | подпись в таблице рекордов | users.nickname, users.lang |
| даты создания аккаунта и последнего визита (не чаще раза в сутки) | счётчики DAU/WAU в админке | users.created_at, users.last_seen_at |
| текущее сохранение игры и до 5 предыдущих версий | облачное сохранение, откат | saves, save_history |
| профиль режима «Поколения» (≤ 32 КБ JSON) | синхронизация библиотеки штаммов | profiles |
| результаты (режим, очки, дни, поколение, геном, дата) — лучшие 3 на режим | таблица рекордов | scores |
| сессии: хеш токена cookie, срок, строка User-Agent (до 200 символов) | поддержание входа, ограничение злоупотреблений | sessions |
| одноразовые ссылки: хеш токена, e-mail, назначение, срок | подтверждение почты и сброс пароля | magic_links |
Таблица рекордов публична: никнейм, очки/дни/яйца, до трёх символов генома и дата видны всем игрокам. Если не задать никнейм, ваши результаты в неё не попадают. E-mail никогда не показывается.
Сохранение игры содержит только игровое состояние. Текст, который вы вводите в поле «Написать Коко», не сохраняется — он лишь сопоставляется с готовым набором предложений; в сохранение попадает идентификатор предложения и ответ Коко.
2b. Приложение COCOFLY для iPhone (v0.7)
- Та же игра, упакованная в приложение. Сохранение хранится в памяти приложения на телефоне; в облако оно попадает, только если вы вошли в аккаунт (п. 2). Удаление приложения стирает данные на телефоне. Аккаунт удаляется прямо в приложении (п. 9).
- Apple Health (HealthKit) — по желанию и только чтение. После карточки с объяснением и системного запроса приложение читает дневные итоги: шаги, время сна (только стадии сна, без «в постели»), выпитую воду, минуты тренировок и минуты осознанности. Они округляются и используются на устройстве, чтобы дать Коко бонусы. Сами значения не записываются в сохранение игры, не отправляются на сервер COCOFLY и никому не передаются, не используются для рекламы, маркетинга или анализа и не хранятся в iCloud; в сохранение попадает только игровой результат (на сколько выросли показатели Коко). Приложение ничего не записывает в «Здоровье». Выключить: «Не читать „Здоровье“» в карточке Apple Health; запретить доступ полностью — Настройки iOS → Конфиденциальность и безопасность → Здоровье → COCOFLY.
- Ежедневное напоминание — локальное уведомление iOS, которое создаётся на телефоне, только если вы его включили; сервер о нём не знает.
- Мозг Коко (ИИ) в приложении включается только после отдельного разрешения (карточка «Мысли Коко с помощью ИИ»). Тогда то, что вы пишете Коко (чат и вечерняя рефлексия), и сводка её дня без имени и e-mail уходят через сервер COCOFLY в Claude API (Anthropic, PBC, США), чтобы получить ответ. COCOFLY эти тексты не хранит; по условиям Anthropic данные API не используются для обучения моделей. Разрешение можно отозвать той же карточкой — тогда Коко отвечает готовыми фразами.
- Нет рекламы, покупок, SDK аналитики и отслеживания (App Tracking Transparency не нужен). Анонимные счётчики событий — как в п. 3. Таблица рекордов с никами в приложении пока не показывается.
- Apple как оператор App Store и TestFlight получает сведения о загрузках и, если вы разрешили «Делиться с разработчиками», отчёты о сбоях — по собственной политике приватности Apple.
- Ссылка на Patreon в приложении показывается только на витрине App Store США и открывает сайт Patreon в браузере; COCOFLY не получает ваших платёжных данных.
3. Анонимные счётчики событий
Клиент раз в 5 минут (и при уходе со страницы) отправляет на POST /api/events список имён событий с количеством: session, minutes, mode_start_<режим>, suggest_accepted, suggest_refused, tool_<инструмент>, achievement, death_<причина>, login. Сервер прибавляет их к суточным суммам (events_daily: день, имя, счётчик). С ними не хранится ни IP-адрес, ни идентификатор пользователя, ни cookie — это агрегаты вроде «в четверг было 120 сессий». Хранятся 400 дней и нужны, чтобы понимать, какие режимы и инструменты вообще используются. Отдельного «не отслеживать» переключателя нет, потому что персональных данных в этих счётчиках нет.
4. Cloudflare Web Analytics (если включено)
Администратор может включить Cloudflare Web Analytics — счётчик посещений без cookie и без межсайтового трекинга. Тогда страница подгружает static.cloudflareinsights.com/beacon.min.js, и Cloudflare получает стандартные данные запроса (адрес страницы, тип браузера, страна по IP). Это описано в политике Cloudflare (https://www.cloudflare.com/web-analytics/). В открытом коде видно, включено ли это: analyticsToken в ответе GET /api/config.
5. Cookie
Единственная cookie — cf_session (строго необходимая): ставится только после входа, HttpOnly; Secure; SameSite=Lax, живёт 30 дней и продлевается не чаще раза в сутки. Она нужна, чтобы не вводить пароль каждый раз. Аналитических, рекламных и сторонних cookie нет, поэтому баннер согласия на cookie не показывается. Выход из аккаунта удаляет cookie и сессию.
6. Технические данные, которые видит сервер
- IP-адрес. Cloudflare передаёт его каждому запросу. Он не записывается в журналы приложения и не связывается с аккаунтом. Для защиты от перебора счётчики попыток на
/api/auth/request,/api/auth/login,/api/auth/verifyи/api/auth/resetведутся по IP в таблицеrate_limits; эти строки удаляются в течение ~48 часов (api/src/db.js,maybeMaintenance). Остальные лимиты считаются в памяти воркера и не пишутся в базу. - User-Agent хранится в строке сессии (см. п. 2), чтобы отличать устройства.
- Шрифты. Страницы загружают шрифты Manrope и JetBrains Mono с серверов Google Fonts; Google видит IP-адрес запроса. Это стандартное поведение веб-шрифтов; если для вас это критично, блокировщик шрифтов ничего не сломает — интерфейс переключится на системный шрифт.
- Cloudflare как хостинг-провайдер ведёт собственные технические журналы по своим условиям.
7. Электронная почта
Письма отправляются только двух видов: ссылка подтверждения почты и ссылка сброса пароля. Отправитель — сервис Resend (https://resend.com), который получает ваш адрес и текст письма только для доставки. Ссылки живут 30 минут и работают один раз. Если провайдер почты не настроен, письмо не уходит, а ссылка ждёт в служебной таблице outbox, где её видит только администратор (адрес и ссылка) — доставленные записи удаляются через 30 дней. Рассылок, уведомлений и маркетинга нет.
8. Сроки хранения
| Данные | Срок |
|---|---|
| локальные данные браузера | пока вы их не удалите |
| аккаунт, сохранение, профиль, рекорды | пока существует аккаунт |
| история сохранений | последние 5 версий |
| сессии | 30 дней без продления; истёкшие удаляются автоматически |
| одноразовые ссылки | 30 минут; удаляются через сутки после истечения |
| счётчики попыток по IP | ~48 часов |
отправленные письма в outbox | 30 дней |
| анонимные суточные счётчики | 400 дней |
| резервные копии администратора (экспорт из админки) | по усмотрению оператора; см. п. 10 |
9. Ваши права и удаление аккаунта
Кнопка «Удалить аккаунт и все данные» в окне входа сразу и необратимо удаляет пользователя, сессии, сохранение, историю сохранений, профиль и все результаты (DELETE /api/account). Администратор может сделать то же самое по вашей просьбе. По GDPR у вас также есть право на доступ, исправление (никнейм и язык меняются в игре), ограничение обработки и переносимость — сохранение в любой момент выгружается кнопкой «Сохранить файл», остальное пришлём по запросу на контактный адрес. Жалобу можно подать в надзорный орган вашей страны; для Кипра это Уполномоченный по защите персональных данных (dataprotection.gov.cy).
Обратите внимание: ещё не доставленные ссылки в outbox и одноразовые ссылки не удаляются вместе с аккаунтом, а истекают и вычищаются по срокам из п. 8.
10. Кому передаются данные
Никому не продаются и не передаются для рекламы. Рекламы в игре нет. Обработчики: Cloudflare (хостинг, база данных, опциональная аналитика), Resend (почта), Google Fonts (шрифты). Данные могут храниться в дата-центрах Cloudflare за пределами ЕС; Cloudflare использует стандартные договорные положения ЕС. Резервные копии из админки могут содержать e-mail, никнеймы и сохранения (никогда — хеши паролей); оператор хранит их на своём устройстве и удаляет по мере ненадобности. Данные могут быть раскрыты только если этого потребует закон.
11. Дети
Возрастной проверки нет: игра подходит для любого возраста, не содержит рекламы, покупок и профилирования. Единственное персональное данное, которое мы можем запросить, — e-mail при добровольном создании аккаунта. Если вам меньше 16 лет (или меньше возраста цифрового согласия в вашей стране), попросите родителя или опекуна создать аккаунт с вами или играйте без входа — все функции игры доступны офлайн.
12. Правовые основания (GDPR)
Исполнение договора с вами (ст. 6(1)(b)) — аккаунт, сохранения, рекорды; законный интерес (ст. 6(1)(f)) — безопасность, лимиты, анонимные счётчики, чтобы поддерживать бесплатный сервис; согласие (ст. 6(1)(a)) — вы сами решаете, создавать ли аккаунт.
13. Изменения
Изменения публикуются в этом файле и на странице /privacy.html с новой версией и датой; существенные изменения будут отмечены в объявлении в шапке игры. История версий — в CHANGELOG.md.
COCOFLY privacy policy
Version 0.2.0 · September 2026
This is a description of what the COCOFLY game stores and why, written by the person who built it. It is not legal advice. Where this text and the code disagree, the code is authoritative — it is open source, and the relevant files are referenced below.
Controller: the project maintainer, a private individual resident in Cyprus (EU). Contact: [privacy@example.com — replace]. Processing runs on Cloudflare infrastructure (Workers, D1, Static Assets) on the controller's behalf.
1. Playing without an account
By default COCOFLY sends nothing about you to the server except anonymous counters (section 3). Your browser (localStorage) keeps:
cocofly.save.v2— the game save (Coco's state: time, metrics, apartment, the last 150 log entries, your suggestions to her);cocofly.settings— language, theme, sound, speed, cloud-autosave switch;cocofly.meta— Generations-mode progress (discovered alleles, generation number, lineage).
None of this leaves your device until you sign in. "Save file" downloads the save as JSON to your disk; "Start over" overwrites it. Clearing site data in your browser removes everything above.
2. Account and cloud save (only when you sign in)
Signing in is optional; it enables cross-device sync and the leaderboard. When you do, the server stores in its D1 database:
| What | Why | Where in the code |
|---|---|---|
| e-mail address, verification date | sign-in, verification/reset links | api/migrations/0001_init.sql → users |
| password hash (PBKDF2-SHA-256, 100 000 iterations, salted); the password itself is never stored | sign-in | api/src/util.js |
| nickname (2–24 characters, optional), interface language | leaderboard label | users.nickname, users.lang |
| account creation date and last-seen date (updated at most once a day) | DAU/WAU counters in the admin panel | users.created_at, users.last_seen_at |
| current game save and up to 5 previous versions | cloud save, rollback | saves, save_history |
| Generations profile (≤ 32 KB JSON) | sync of the strain library | profiles |
| scores (mode, points, days, generation, genome, date) — best 3 per mode | leaderboard | scores |
| sessions: hash of the cookie token, expiry, User-Agent string (up to 200 chars) | staying signed in, abuse limits | sessions |
| one-time links: token hash, e-mail, purpose, expiry | e-mail verification and password reset | magic_links |
The leaderboard is public: nickname, points/days/eggs, up to three genome symbols and the date are visible to all players. Without a nickname your scores are not listed. E-mail is never shown.
A game save contains game state only. Text typed into "Text Coco" is not stored — it is only matched against a fixed list of suggestions; the save records the suggestion id and Coco's reply.
2b. The COCOFLY iPhone app (v0.7)
- The same game, packaged as an app. The save lives in the app's storage on your phone and goes to the cloud only if you sign in (section 2). Deleting the app erases the data on the phone. The account can be deleted inside the app (section 9).
- Apple Health (HealthKit) — optional and read-only. After an explanation card and the system prompt, the app reads daily totals: steps, time asleep (sleep stages only, not "in bed"), water, exercise minutes and mindful minutes. They are rounded and used on the device to give Coco bonuses. The values themselves are not written into the game save, are never sent to the COCOFLY server or shared with anyone, are never used for advertising, marketing or data mining and are not stored in iCloud; the save only receives the game result (how much Coco's needs went up). The app never writes to Health. Turn it off with "Stop reading Health" on the Apple Health card; revoke access completely in iOS Settings → Privacy & Security → Health → COCOFLY.
- The daily reminder is an iOS local notification created on the phone, only if you turn it on; the server knows nothing about it.
- Coco's AI brain in the app works only after a separate permission (the "Coco's thoughts with AI" card). Then what you write to Coco (chat and the evening reflection) and a summary of her day, without your name or e-mail, go through the COCOFLY server to the Claude API (Anthropic, PBC, USA) to get a reply. COCOFLY does not store these texts; under Anthropic's terms API data is not used to train models. Withdraw the permission on the same card — Coco then answers with ready-made lines.
- No ads, no purchases, no analytics or advertising SDKs, no tracking (App Tracking Transparency is not needed). Anonymous event counters work as in section 3. The public leaderboard with nicknames is not shown in the app for now.
- Apple, as the operator of the App Store and TestFlight, receives download information and — if you allowed "Share with App Developers" — crash reports, under Apple's own privacy policy.
- The Patreon link is shown in the app only on the United States App Store storefront and opens Patreon's website in the browser; COCOFLY never receives your payment details.
3. Anonymous event counters
Every 5 minutes (and when you leave the page) the client posts to POST /api/events a list of event names with counts: session, minutes, mode_start_<mode>, suggest_accepted, suggest_refused, tool_<tool>, achievement, death_<cause>, login. The server adds them to daily totals (events_daily: day, name, count). No IP address, user id or cookie is stored with them — they are aggregates such as "120 sessions on Thursday". They are kept for 400 days and exist to show which modes and tools are used at all. There is no separate opt-out switch because these counters contain no personal data.
4. Cloudflare Web Analytics (when enabled)
The administrator may enable Cloudflare Web Analytics — a cookieless visit counter with no cross-site tracking. The page then loads static.cloudflareinsights.com/beacon.min.js and Cloudflare receives standard request data (page URL, browser type, country derived from IP). See https://www.cloudflare.com/web-analytics/. Whether it is on is visible in the open source: analyticsToken in the GET /api/config response.
5. Cookies
The only cookie is cf_session (strictly necessary). It is set only after you sign in, HttpOnly; Secure; SameSite=Lax, lives 30 days and is renewed at most once a day. It exists so you do not have to type your password every time. There are no analytics, advertising or third-party cookies, so no cookie banner is shown. Signing out deletes the cookie and the session.
6. Technical data the server sees
- IP address. Cloudflare passes it with every request. It is not written to application logs and not linked to your account. To resist brute force, attempt counters for
/api/auth/request,/api/auth/login,/api/auth/verifyand/api/auth/resetare keyed by IP in therate_limitstable; those rows are deleted within about 48 hours (api/src/db.js,maybeMaintenance). All other limits are counted in Worker memory and never written to the database. - User-Agent is stored with the session row (section 2) to tell devices apart.
- Fonts. Pages load Manrope and JetBrains Mono from Google Fonts servers; Google sees the IP address of that request. This is standard web-font behaviour; blocking fonts breaks nothing — the interface falls back to a system font.
- Cloudflare, as the hosting provider, keeps its own technical logs under its own terms.
7. E-mail
Only two kinds of e-mail are ever sent: an e-mail verification link and a password reset link. They go through Resend (https://resend.com), which receives your address and the message body solely for delivery. Links are valid for 30 minutes and work once. If no mail provider is configured, nothing is sent and the link waits in an internal outbox table visible only to the administrator (address and link); delivered rows are deleted after 30 days. There are no newsletters, notifications or marketing.
8. Retention
| Data | Kept for |
|---|---|
| local browser data | until you delete it |
| account, save, profile, scores | while the account exists |
| save history | last 5 versions |
| sessions | 30 days without renewal; expired ones are purged automatically |
| one-time links | 30 minutes; purged a day after expiry |
| IP-keyed attempt counters | ~48 hours |
sent messages in outbox | 30 days |
| anonymous daily counters | 400 days |
| administrator backups (admin-panel export) | at the controller's discretion; see section 10 |
9. Your rights and account deletion
The "Delete account and all data" button in the sign-in dialog immediately and irreversibly erases the user, sessions, save, save history, profile and all scores (DELETE /api/account). The administrator can do the same on request. Under the GDPR you also have the rights of access, rectification (nickname and language are editable in the game), restriction and portability — the save can be exported at any time with "Save file"; the rest we will send on request to the contact address. You may complain to the supervisory authority of your country; for Cyprus that is the Commissioner for Personal Data Protection (dataprotection.gov.cy).
Note: undelivered outbox entries and one-time links are not removed together with the account; they expire and are purged on the schedule in section 8.
10. Who receives data
Nothing is sold or shared for advertising. The game has no ads. Processors: Cloudflare (hosting, database, optional analytics), Resend (e-mail), Google Fonts (fonts). Data may be stored in Cloudflare data centres outside the EU; Cloudflare relies on the EU Standard Contractual Clauses. Admin-panel backups may contain e-mails, nicknames and saves (never password hashes); the controller keeps them on their own device and deletes them when no longer needed. Data is disclosed only if required by law.
11. Children
There is no age gate: the game is suitable for all ages and has no advertising, purchases or profiling. The only personal data we may ask for is an e-mail address when you voluntarily create an account. If you are under 16 (or under the age of digital consent in your country), ask a parent or guardian to create the account with you, or play without signing in — every game feature works offline.
12. Legal bases (GDPR)
Performance of a contract with you (Art. 6(1)(b)) — account, saves, scores; legitimate interest (Art. 6(1)(f)) — security, rate limits, anonymous counters that keep a free service running; consent (Art. 6(1)(a)) — you decide whether to create an account at all.
13. Changes
Changes are published in this file and on /privacy.html with a new version and date; material changes will be flagged in the announcement bar of the game. Version history is in CHANGELOG.md.