400 lines
21 KiB
HTML
400 lines
21 KiB
HTML
<!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 .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 .15s ease, border-color .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">
|
||
<p>This is the privacy policy for <b>Vojo</b>, a chat app built on the open
|
||
<a href="https://matrix.org" rel="noopener">Matrix</a> protocol. It's maintained by
|
||
the Vojo Project, an independent developer. If you have questions about anything
|
||
here, write to <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
|
||
|
||
<p>We try to keep this short and readable. If something is unclear, ask.</p>
|
||
|
||
<h2>How Vojo works, briefly</h2>
|
||
<p>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 is the one holding your
|
||
data, not us.</p>
|
||
|
||
<h2>What we hold and what we use it for</h2>
|
||
<p>To make the app work we keep the obvious things: your account, the messages and
|
||
rooms you send and receive, the media you share, and basic technical data (IP
|
||
address, connection times) generated when your device talks to our servers. Your
|
||
device also caches messages and keys locally so you can read them offline and stay
|
||
signed in.</p>
|
||
|
||
<p>Direct conversations are end-to-end encrypted by default. In an encrypted room
|
||
we can see who's talking to whom and when, but not what they're saying. In an
|
||
unencrypted room we see the content too.</p>
|
||
|
||
<p>Voice calls are encrypted between participants. When your device can't reach the
|
||
other side directly, the audio is relayed through our infrastructure on its way
|
||
through — we don't record it and we don't keep it.</p>
|
||
|
||
<p>We use this data to run the service: deliver messages, sync your devices, ring
|
||
your phone for incoming calls, keep limited logs to fight abuse and spam. That's
|
||
the whole list. No advertising, no analytics, no resale, no profiling.</p>
|
||
|
||
<h2>Who else is involved</h2>
|
||
<ul>
|
||
<li><b>Our hosting provider.</b> The
|
||
<a href="https://www.hostinger.com" rel="noopener">Hostinger</a>
|
||
infrastructure carrying <code>vojo.chat</code> sits in the European Union.</li>
|
||
<li><b>Google's push service.</b> Push notifications go through Google so your
|
||
phone can wake up and ring or buzz. For end-to-end encrypted chats the
|
||
notification only carries the routing info needed to fetch the message
|
||
locally — the content stays on your Matrix server. For unencrypted chats
|
||
Google may see a short preview (who, where, snippet). This is the only
|
||
routine reason data leaves the EU; we rely on the Standard Contractual
|
||
Clauses for that transfer.</li>
|
||
<li><b>Bot checks.</b> Signing up, and a couple of optional features, briefly
|
||
load a third-party "are you a human" check. That provider sees your
|
||
interaction with the puzzle and is governed by its own privacy policy.</li>
|
||
<li><b>Optional bridges.</b> If you choose to connect Telegram, Discord or
|
||
WhatsApp through Vojo, your messages with those networks have to pass
|
||
through bridge infrastructure we run, and the network itself sees them
|
||
too. None of this turns on unless you opt in.</li>
|
||
</ul>
|
||
|
||
<h2>Permissions on your phone</h2>
|
||
<p>On Android we ask for: the microphone (only used during calls); notifications
|
||
(so we can show you messages and ring for calls); permission to show calls over
|
||
the lock screen and to keep a call running with the screen off; and network access.
|
||
That's it. We don't touch your address book, photo library, SMS, precise location
|
||
or call log.</p>
|
||
|
||
<h2>How long we keep things</h2>
|
||
<p>Your messages and account stay on your Matrix server until you delete them or
|
||
ask us to deactivate the account. Deletion is processed within about thirty days.
|
||
Server access logs are kept for no more than thirty days and then rotated out.</p>
|
||
|
||
<p>Data cached on your device goes away when you uninstall Vojo or clear its data
|
||
in your phone's settings. Signing out ends your session but doesn't always scrub
|
||
every cached message immediately — the cleanest reset is an uninstall.</p>
|
||
|
||
<h2>Your rights</h2>
|
||
<p>If you live in the EU/EEA (and in many other places the law works similarly),
|
||
you can ask us to show you what we hold, fix something that's wrong, delete your
|
||
data, hand it over in a portable form, or stop a particular use. You can also
|
||
withdraw any consent you've given for optional features, and complain to your
|
||
local data-protection authority if you think we're handling things badly. Email
|
||
the address at the top and we'll take it from there.</p>
|
||
|
||
<h2>Kids, changes, contact</h2>
|
||
<p>Vojo isn't aimed at anyone under 16, and we don't knowingly collect data from
|
||
children. If we change this policy in a way that actually affects you, we'll
|
||
update the date above and try to flag it inside the app. The current version
|
||
always lives at <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>. For
|
||
anything else: <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
|
||
</section>
|
||
|
||
<section lang="ru" data-lang="ru" hidden>
|
||
<p>Это политика конфиденциальности <b>Vojo</b> — чат-приложения на открытом
|
||
протоколе <a href="https://matrix.org" rel="noopener">Matrix</a>. Его поддерживает
|
||
проект Vojo, независимый разработчик. Если по тексту возникают вопросы — пишите
|
||
на <a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</a>.</p>
|
||
|
||
<p>Постарались уложиться в нормальный читаемый объём. Если что-то непонятно —
|
||
спрашивайте.</p>
|
||
|
||
<h2>Как устроено</h2>
|
||
<p>Ваши сообщения, профиль и список комнат живут на Matrix-сервере. По умолчанию
|
||
это <code>vojo.chat</code>, который держим мы. Вы можете войти на любой другой
|
||
Matrix-сервер, которому доверяете — если так, оператором ваших данных будет тот
|
||
сервер, не мы.</p>
|
||
|
||
<h2>Что у нас лежит и зачем</h2>
|
||
<p>Чтобы приложение работало, у нас лежат предсказуемые вещи: ваш аккаунт, ваши
|
||
сообщения и комнаты, медиа, и базовые технические данные (IP, время запросов),
|
||
которые возникают, когда устройство разговаривает с нашими серверами. На самом
|
||
устройстве лежит локальный кэш сообщений и ключей — чтобы можно было читать
|
||
офлайн и не входить заново каждый раз.</p>
|
||
|
||
<p>Личные переписки по умолчанию защищены end-to-end шифрованием. В зашифрованной
|
||
комнате мы видим, кто кому пишет и когда, но не видим, что именно. В
|
||
незашифрованных комнатах мы видим и содержимое.</p>
|
||
|
||
<p>Голосовые звонки шифруются между участниками. Если устройство не может
|
||
дотянуться до собеседника напрямую, аудио ретранслируется через нашу
|
||
инфраструктуру по пути — мы его не записываем и не храним.</p>
|
||
|
||
<p>Все эти данные мы используем для того, чтобы сервис работал: доставка
|
||
сообщений, синхронизация устройств, входящие звонки, ограниченные логи для борьбы
|
||
со спамом и злоупотреблениями. Это весь список. Никакой рекламы, аналитики,
|
||
перепродажи или профилирования.</p>
|
||
|
||
<h2>Кто ещё в этом участвует</h2>
|
||
<ul>
|
||
<li><b>Наш хостинг.</b>
|
||
<a href="https://www.hostinger.com" rel="noopener">Hostinger</a> держит
|
||
инфраструктуру <code>vojo.chat</code> в Европейском союзе.</li>
|
||
<li><b>Push-сервис Google.</b> Push-уведомления идут через Google, чтобы
|
||
телефон проснулся и зазвонил. Для зашифрованных переписок уведомление
|
||
несёт только маршрутную информацию, нужную для того чтобы подгрузить
|
||
сообщение локально — содержимое остаётся на Matrix-сервере. Для
|
||
незашифрованных Google может видеть короткий предпросмотр (кто, где,
|
||
фрагмент). Это единственный регулярный случай, когда данные выходят за
|
||
пределы ЕС; передача идёт по Стандартным договорным условиям Европейской
|
||
комиссии.</li>
|
||
<li><b>Капча.</b> При регистрации и в паре дополнительных функций ненадолго
|
||
подгружается сторонняя проверка «вы не робот». Этот провайдер видит ваше
|
||
взаимодействие с капчей и регулируется собственной политикой.</li>
|
||
<li><b>Опциональные мосты.</b> Если вы решите подключить Telegram, Discord
|
||
или WhatsApp через Vojo, сообщения с этими сетями неизбежно проходят
|
||
через мостовую инфраструктуру, которую держим мы, и сама сеть тоже их
|
||
видит. Без вашего явного действия это не включается.</li>
|
||
</ul>
|
||
|
||
<h2>Разрешения на телефоне</h2>
|
||
<p>На Android приложение просит: микрофон (используется только во время звонка);
|
||
уведомления (чтобы показывать сообщения и звонки); право показывать звонок поверх
|
||
локскрина и держать его при выключенном экране; доступ к сети. И всё. Мы не
|
||
трогаем адресную книгу, фотогалерею, SMS, точную геолокацию и журнал вызовов.</p>
|
||
|
||
<h2>Сколько мы это храним</h2>
|
||
<p>Сообщения и аккаунт лежат на Matrix-сервере до тех пор, пока вы их не
|
||
удалите или не попросите деактивировать аккаунт. Удаление обрабатывается в
|
||
течение тридцати дней. Журналы доступа на сервере хранятся не более тридцати
|
||
дней, затем уходят на ротацию.</p>
|
||
|
||
<p>Кэш на устройстве пропадает, когда вы удаляете Vojo или очищаете его данные в
|
||
настройках телефона. Выход из аккаунта прекращает сессию, но не всегда подчищает
|
||
весь кэш сразу — самый чистый способ обнулиться — это переустановка.</p>
|
||
|
||
<h2>Ваши права</h2>
|
||
<p>Если вы живёте в ЕС/ЕЭЗ (а во многих других местах закон работает похоже), вы
|
||
можете попросить нас показать, что у нас лежит, поправить неверное, удалить,
|
||
отдать в переносимом виде, остановить конкретное использование. Можно отозвать
|
||
согласие на дополнительные функции и пожаловаться в местный надзорный орган, если
|
||
кажется, что мы что-то делаем не так. Напишите на адрес сверху, и пойдём
|
||
разбираться.</p>
|
||
|
||
<h2>Дети, изменения, контакты</h2>
|
||
<p>Vojo не рассчитан на людей младше 16 лет, и мы сознательно не собираем данные
|
||
детей. Если что-то поменяется так, что это вас реально касается, обновим дату в
|
||
начале и постараемся отметить это в самом приложении. Текущая версия всегда
|
||
лежит по адресу <a href="https://vojo.chat/privacy">vojo.chat/privacy</a>. По
|
||
любым другим вопросам:
|
||
<a href="mailto:vojochatdev@gmail.com">vojochatdev@gmail.com</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>
|