vojo/public/privacy.html
2026-06-03 01:20:32 +03:00

482 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" content="#0d0e11" />
<meta name="robots" content="index,follow" />
<title>Vojo — Privacy Policy</title>
<style>
:root {
--bg: #0d0e11;
--panel: #181a20;
--surface: #21232b;
--text: #e6e6e9;
--text-strong: #f4f4f6;
--muted: rgba(230, 230, 233, 0.62);
--faint: rgba(230, 230, 233, 0.38);
--divider: rgba(255, 255, 255, 0.08);
--fleet: #9580ff;
--fleet-soft: #a59cff;
color-scheme: dark;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
background: var(--bg);
color: var(--text);
font-family: -apple-system, 'SF Pro Text', 'Inter', system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
body {
min-height: 100vh;
line-height: 1.7;
font-size: 16px;
}
.frame {
max-width: 680px;
margin: 0 auto;
padding: 56px 28px 120px;
}
header.doc {
padding-bottom: 28px;
margin-bottom: 40px;
border-bottom: 1px solid var(--divider);
}
.brand {
display: flex;
align-items: center;
gap: 9px;
margin-bottom: 22px;
color: var(--muted);
font-size: 13px;
letter-spacing: 0.2px;
}
.brand-dot {
width: 8px;
height: 8px;
border-radius: 99px;
background: var(--fleet);
}
.brand-name {
color: var(--text-strong);
font-weight: 600;
}
.brand-sep {
color: var(--faint);
}
h1 {
font-size: 34px;
line-height: 1.15;
font-weight: 600;
margin: 0 0 10px;
letter-spacing: -0.6px;
color: var(--text-strong);
}
.effective {
color: var(--muted);
font-size: 14px;
margin: 0;
}
.lang-switch {
display: inline-flex;
margin-top: 24px;
font-size: 13px;
color: var(--muted);
}
.lang-switch button {
appearance: none;
-webkit-appearance: none;
background: transparent;
border: 0;
padding: 4px 0;
font: inherit;
color: var(--muted);
cursor: pointer;
transition: color 0.15s ease;
}
.lang-switch button:hover {
color: var(--text);
}
.lang-switch button[aria-pressed='true'] {
color: var(--text-strong);
font-weight: 600;
}
.lang-switch .sep {
padding: 0 10px;
color: var(--faint);
user-select: none;
}
h2 {
font-size: 20px;
font-weight: 600;
margin: 44px 0 12px;
letter-spacing: -0.2px;
color: var(--text-strong);
scroll-margin-top: 24px;
}
p {
margin: 0 0 14px;
color: var(--text);
}
ul {
margin: 0 0 18px;
padding-left: 22px;
}
ul li {
margin: 8px 0;
padding-left: 4px;
}
ul li::marker {
color: var(--faint);
}
ul li b,
p b {
color: var(--text-strong);
font-weight: 600;
}
a {
color: var(--fleet-soft);
text-decoration: none;
border-bottom: 1px solid rgba(165, 156, 255, 0.35);
transition: color 0.15s ease, border-color 0.15s ease;
}
a:hover {
color: #c0b9ff;
border-bottom-color: rgba(192, 185, 255, 0.7);
}
section[hidden] {
display: none;
}
section > h2:first-of-type {
margin-top: 0;
}
footer.doc {
margin-top: 64px;
padding-top: 24px;
border-top: 1px solid var(--divider);
font-size: 13px;
color: var(--faint);
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
footer.doc .copy {
font-family: ui-monospace, 'JetBrains Mono', monospace;
}
footer.doc a {
color: var(--muted);
border-bottom-color: transparent;
}
footer.doc a:hover {
color: var(--text);
border-bottom-color: var(--divider);
}
@media (max-width: 560px) {
.frame {
padding: 36px 20px 96px;
}
h1 {
font-size: 28px;
}
h2 {
font-size: 18px;
margin: 36px 0 10px;
}
body {
font-size: 15.5px;
line-height: 1.65;
}
}
</style>
</head>
<body>
<div class="frame">
<header class="doc">
<div class="brand">
<span class="brand-dot" aria-hidden="true"></span>
<span class="brand-name">Vojo</span>
<span class="brand-sep">·</span>
<span>Legal</span>
</div>
<h1 data-i18n-h1>Privacy Policy</h1>
<p class="effective" data-i18n-effective>Effective 13 May 2026</p>
<div class="lang-switch" role="group" aria-label="Language">
<button type="button" data-lang="en" aria-pressed="true">English</button>
<span class="sep" aria-hidden="true">/</span>
<button type="button" data-lang="ru" aria-pressed="false">Русский</button>
</div>
</header>
<section lang="en" data-lang="en">
<h2>How Vojo works</h2>
<p>
Vojo is a chat app built on the open
<a href="https://matrix.org" rel="noopener">Matrix</a> protocol, maintained by the Vojo
Project, an independent developer. Your messages, profile and rooms live on a Matrix
server. By default that's <code>vojo.chat</code>, which we run. You can also sign in to
any other Matrix server you trust — if you do, the operator of that server holds your
data, not us. We try to keep this short; if anything is unclear, write to
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.
</p>
<h2>What we hold, and why</h2>
<p>
To run the app we keep your account and profile, the messages and rooms you send and
receive, the media you share, and basic technical data such as your IP address and
connection times. Your device also caches messages and keys locally so you can read
offline and stay signed in.
</p>
<p>
We process this to deliver and sync your messages and to ring your phone for calls —
that's our agreement with you. We keep limited logs to fight spam and abuse, which is our
legitimate interest. Optional features run only if you turn them on, with your consent. We
don't advertise, run analytics in the app, sell your data or profile you.
</p>
<p>
You can turn on end-to-end encryption per chat. It isn't on by default: in a chat without
it, our server can see message content. With it on, we can see who's talking and when, but
not what's said. Voice and video calls are encrypted between participants and may pass
through our servers in transit; we don't record or store them.
</p>
<h2>Vojo AI</h2>
<p>
Vojo AI is an optional assistant. You don't have to use it — but if you start a one-to-one
chat with it, every message you send in that chat is forwarded to third-party AI providers
to write the reply: Grok by xAI (USA) and Google's Gemini (USA). In a group chat, only
messages that mention it are sent. If a reply needs current information, your question may
also be sent to Google Search to look it up. Each provider handles your text under its own
privacy policy. By using Vojo AI you agree to your messages being sent to these providers
to generate replies. Because they are in the United States, this transfers that content
outside the EU; the transfer relies on your explicit consent to this optional feature.
Replies are AI-generated and can be confidently wrong, so treat them as a first draft and
please don't send secrets. You can read the providers' policies at
<a href="https://x.ai/legal/privacy-policy" rel="noopener">x.ai/legal/privacy-policy</a>
and
<a href="https://ai.google.dev/gemini-api/terms" rel="noopener"
>ai.google.dev/gemini-api/terms</a
>.
</p>
<h2>Who else is involved</h2>
<p>
Push notifications go through Google so your phone can wake and ring. For encrypted chats
the notification carries only the routing info needed to fetch the message locally; for
unencrypted chats it may include a short preview. Signing up loads a Google
human-verification check (reCAPTCHA), and Google sees that interaction. If you choose to
connect another network you use, such as a messenger you already have an account on, your
messages with it pass through bridge infrastructure we run, and that network sees them too
— none of this is on unless you turn it on.
</p>
<p>
Our servers are hosted in the European Union. Some of the above sends data to providers
outside the EU. Apart from the Vojo AI transfer described above (which relies on your
consent), those transfers are covered by Standard Contractual Clauses, or by an adequacy
framework where the recipient is certified under one; a copy of the relevant safeguards,
and the current list of providers, is available on request at the address above.
</p>
<h2>Permissions on your phone</h2>
<p>
On Android we ask for the microphone (used only during calls), notifications, permission
to show and keep calls running over the lock screen, and network access. That's it — we
don't touch your contacts, photo library, SMS, precise location or call log.
</p>
<h2>How long we keep things, and your rights</h2>
<p>
Your messages and account stay on your Matrix server until you delete them or ask us to
deactivate the account. There is no in-app delete button yet: to have your account
deleted, email <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a> with your
<code>@username:vojo.chat</code> ID (the steps and details are at
<a href="https://vojo.chat/delete-account">vojo.chat/delete-account</a>). We complete
deletion within about thirty days. Server access logs are kept no longer than thirty days.
Data cached on your device is removed when you uninstall Vojo or clear its data in your
phone's settings.
</p>
<p>
If you live in the EU/EEA (and in many places elsewhere the law is similar), you can ask
us to show, correct, export or delete your data, restrict or stop a particular use, or
withdraw a consent you've given — and you can complain to your local data-protection
authority. Email the address at the top. Vojo isn't aimed at anyone under 16, and we don't
knowingly collect children's data. The current version of this policy always lives at
<a href="https://vojo.chat/privacy">vojo.chat/privacy</a>; if we change it in a way that
affects you, we'll update the date above and flag it in the app.
</p>
</section>
<section lang="ru" data-lang="ru" hidden>
<h2>Как устроено Vojo</h2>
<p>
Vojo — чат-приложение на открытом протоколе
<a href="https://matrix.org" rel="noopener">Matrix</a>, его поддерживает проект Vojo,
независимый разработчик. Ваши сообщения, профиль и комнаты хранятся на Matrix-сервере. По
умолчанию это <code>vojo.chat</code>, который держим мы. Вы можете войти и на любой другой
Matrix-сервер, которому доверяете — тогда вашими данными распоряжается оператор того
сервера, а не мы. Стараемся писать коротко; если что-то непонятно — напишите на
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.
</p>
<h2>Что мы храним и зачем</h2>
<p>
Чтобы приложение работало, мы храним ваш аккаунт и профиль, отправленные и полученные
сообщения и комнаты, прикреплённые медиафайлы и базовые технические данные — IP-адрес и
время обращений. На самом устройстве хранится локальный кэш сообщений и ключей, чтобы
читать офлайн и не входить заново.
</p>
<p>
Эти данные мы обрабатываем, чтобы доставлять и синхронизировать сообщения и звонить на ваш
телефон при входящем вызове — это часть нашего соглашения с вами. Ограниченные логи мы
ведём для борьбы со спамом и злоупотреблениями — это наш законный интерес. Дополнительные
функции работают только если вы их включили, по вашему согласию. Мы не показываем рекламу,
не ведём аналитику в приложении, не продаём данные и не профилируем вас.
</p>
<p>
Сквозное шифрование можно включить для каждого чата отдельно. По умолчанию оно выключено:
в чате без него содержимое сообщений видит наш сервер. Когда оно включено, мы видим, кто и
когда переписывается, но не само содержимое. Голосовые и видеозвонки шифруются между
участниками и в пути могут проходить через наши серверы; мы их не записываем и не храним.
</p>
<h2>Vojo AI</h2>
<p>
Vojo AI — необязательный ассистент. Пользоваться им необязательно, но если вы начнёте с
ним личный чат, каждое отправленное в этом чате сообщение передаётся сторонним
ИИ-сервисам, чтобы составить ответ: Grok от xAI (США) и Google Gemini (США). В групповом
чате отправляются только те сообщения, где его упомянули. Если для ответа нужна свежая
информация, ваш вопрос может также уйти в Google Поиск. Каждый сервис обрабатывает ваш
текст по своей политике конфиденциальности. Пользуясь Vojo AI, вы соглашаетесь, что ваши
сообщения отправляются этим сервисам для генерации ответов. Поскольку они находятся в США,
при этом содержимое передаётся за пределы ЕС; основанием для передачи служит ваше явное
согласие на эту необязательную функцию. Ответы генерирует ИИ, и он может уверенно
ошибаться — считайте их черновиком и не отправляйте секреты. Политики сервисов можно
прочитать на
<a href="https://x.ai/legal/privacy-policy" rel="noopener">x.ai/legal/privacy-policy</a> и
<a href="https://ai.google.dev/gemini-api/terms" rel="noopener"
>ai.google.dev/gemini-api/terms</a
>.
</p>
<h2>Кто ещё в этом участвует</h2>
<p>
Push-уведомления идут через Google, чтобы телефон проснулся и зазвонил. Для зашифрованных
чатов уведомление несёт только маршрутную информацию, по которой сообщение подгружается
локально; для незашифрованных в нём может быть короткий предпросмотр. При регистрации
загружается проверка Google, что вы человек (reCAPTCHA), и Google видит это
взаимодействие. Если вы решите подключить другую сеть, которой пользуетесь, например
мессенджер, где у вас уже есть аккаунт, сообщения с ней проходят через мостовую
инфраструктуру, которую держим мы, и сама сеть тоже их видит — без вашего включения это не
работает.
</p>
<p>
Наши серверы размещены в Европейском союзе. Часть перечисленного отправляет данные
сервисам за пределами ЕС. Кроме передачи в Vojo AI, описанной выше (она основана на вашем
согласии), эти передачи покрыты Стандартными договорными положениями (SCC) или рамочным
соглашением об адекватности, если получатель в нём сертифицирован; копию соответствующих
гарантий и актуальный список сервисов можно запросить по адресу выше.
</p>
<h2>Разрешения на телефоне</h2>
<p>
На Android приложение запрашивает микрофон (только во время звонка), уведомления, право
показывать и удерживать звонок поверх экрана блокировки и доступ к сети. И всё — мы не
обращаемся к контактам, фотогалерее, SMS, точной геолокации и журналу вызовов.
</p>
<h2>Сколько мы храним и ваши права</h2>
<p>
Сообщения и аккаунт хранятся на Matrix-сервере, пока вы их не удалите или не попросите
деактивировать аккаунт. Кнопки удаления в приложении пока нет: чтобы удалить аккаунт,
напишите на <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a> и укажите
свой ID вида <code>@username:vojo.chat</code> (шаги и подробности — на
<a href="https://vojo.chat/delete-account">vojo.chat/delete-account</a>). Удаление мы
выполняем примерно за тридцать дней. Журналы доступа на сервере хранятся не дольше
тридцати дней. Кэш на устройстве удаляется, когда вы удаляете Vojo или очищаете его данные
в настройках телефона.
</p>
<p>
Если вы живёте в ЕС/ЕЭЗ (во многих странах закон работает похоже), вы можете попросить
показать, исправить, выгрузить или удалить ваши данные, ограничить или прекратить
конкретное использование, отозвать данное ранее согласие — и пожаловаться в местный
надзорный орган по защите данных. Напишите на адрес в начале. Vojo не рассчитан на лиц
младше 16 лет, и мы сознательно не собираем данные детей. Актуальная версия этой политики
всегда доступна по адресу <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>; если
мы изменим её так, что это вас затронет, обновим дату вверху и отметим это в приложении.
</p>
</section>
<footer class="doc">
<span class="copy">© Vojo Project · 2026</span>
<a href="https://vojo.chat">vojo.chat</a>
</footer>
</div>
<script>
(function () {
var buttons = document.querySelectorAll('.lang-switch button');
var sections = document.querySelectorAll('section[data-lang]');
var h1 = document.querySelector('[data-i18n-h1]');
var eff = document.querySelector('[data-i18n-effective]');
var H1 = { en: 'Privacy Policy', ru: 'Политика конфиденциальности' };
var EFF = { en: 'Effective 13 May 2026', ru: 'Действует с 13 мая 2026 г.' };
function setLang(lang) {
buttons.forEach(function (b) {
b.setAttribute('aria-pressed', String(b.dataset.lang === lang));
});
sections.forEach(function (s) {
s.hidden = s.dataset.lang !== lang;
});
if (h1 && H1[lang]) h1.textContent = H1[lang];
if (eff && EFF[lang]) eff.textContent = EFF[lang];
document.documentElement.lang = lang;
document.title =
lang === 'ru' ? 'Vojo — Политика конфиденциальности' : 'Vojo — Privacy Policy';
try {
localStorage.setItem('vojo-privacy-lang', lang);
} catch (e) {}
}
buttons.forEach(function (b) {
b.addEventListener('click', function () {
setLang(b.dataset.lang);
});
});
var stored = null;
try {
stored = localStorage.getItem('vojo-privacy-lang');
} catch (e) {}
setLang(stored || 'en');
})();
</script>
</body>
</html>