diff --git a/public/delete-account.html b/public/delete-account.html new file mode 100644 index 00000000..e0dadf2a --- /dev/null +++ b/public/delete-account.html @@ -0,0 +1,388 @@ + + + + + + + + Vojo — Account deletion + + + +
+ +
+
+ + Vojo + · + Account deletion +
+ +

Delete your account

+

Vojo Project · vojo.chat

+ +
+ + + +
+
+ +
+

This page explains how to request deletion of your Vojo account and the + data associated with it on the vojo.chat homeserver.

+ +

Vojo is maintained by the Vojo Project, an independent developer. The application + does not yet expose an in-app "Delete account" button; until it does, deletion is + handled by request to the address below. We reply to every request.

+ +

How to request deletion

+
    +
  1. Send an email from any address to + + with the subject “Delete account”.
  2. +
  3. In the body of the email, include your full Matrix user ID — the + @username:vojo.chat identifier shown in Settings → Account. + If you have lost access to the account, describe enough detail (approximate + creation date, the email or recovery info you remember) so we can identify it + with reasonable certainty.
  4. +
  5. We acknowledge the request within a few business days and complete deletion + within thirty days of the original request.
  6. +
+ +
+

Contact: +

+

Subject line: Delete account

+
+ +

What gets deleted

+ + +

What we cannot delete on your behalf

+ + +

Data retained after deletion

+

After your account is deactivated, server access logs may retain your IP address + and request timestamps for up to thirty additional days as part of normal abuse- + prevention rotation. Backup snapshots covering the period before deletion are + rotated out within thirty days. After that period, no personal data attributable to + your account remains on our infrastructure.

+ +

If you'd prefer to stay but stop receiving notifications

+

If you only want notifications to stop and not to lose your account entirely, + you can simply sign out of the application on your device — this removes the + push-notification binding without deactivating the account.

+ +

Privacy Policy

+

For a fuller description of what we hold and why, see our + Privacy Policy.

+
+ + + + + +
+ + + + + diff --git a/public/locales/en.json b/public/locales/en.json index a6b870ee..f3657e70 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -269,6 +269,10 @@ "clear_cache_title": "Clear Cache & Reload", "clear_cache_desc": "Clear all your locally stored data and reload from server.", "clear_cache": "Clear Cache", + "legal": "Legal", + "privacy_policy_title": "Privacy Policy", + "privacy_policy_desc": "How your data is handled.", + "privacy_policy_open": "Open", "credits": "Credits", "devtools_title": "Developer Tools", diff --git a/public/locales/ru.json b/public/locales/ru.json index bf1112f8..e0283b4b 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -269,6 +269,10 @@ "clear_cache_title": "Очистить кэш и перезагрузить", "clear_cache_desc": "Удалить все локально сохранённые данные и загрузить заново с сервера.", "clear_cache": "Очистить кэш", + "legal": "Юридическое", + "privacy_policy_title": "Политика конфиденциальности", + "privacy_policy_desc": "Как обрабатываются ваши данные.", + "privacy_policy_open": "Открыть", "credits": "Благодарности", "devtools_title": "Инструменты разработчика", diff --git a/public/privacy.html b/public/privacy.html new file mode 100644 index 00000000..51451ab6 --- /dev/null +++ b/public/privacy.html @@ -0,0 +1,400 @@ + + + + + + + + Vojo — Privacy Policy + + + +
+ +
+
+ + Vojo + · + Legal +
+ +

Privacy Policy

+

Effective 13 May 2026

+ +
+ + + +
+
+ +
+

This is the privacy policy for Vojo, a chat app built on the open + Matrix protocol. It's maintained by + the Vojo Project, an independent developer. If you have questions about anything + here, write to vojochatdev@gmail.com.

+ +

We try to keep this short and readable. If something is unclear, ask.

+ +

How Vojo works, briefly

+

Your messages, profile and rooms live on a Matrix server. By default that's + vojo.chat, 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.

+ +

What we hold and what we use it for

+

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.

+ +

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.

+ +

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.

+ +

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.

+ +

Who else is involved

+ + +

Permissions on your phone

+

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.

+ +

How long we keep things

+

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.

+ +

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.

+ +

Your rights

+

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.

+ +

Kids, changes, contact

+

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 vojo.chat/privacy. For + anything else: vojochatdev@gmail.com.

+
+ + + + + +
+ + + + + diff --git a/public/res/store/feature-graphic.png b/public/res/store/feature-graphic.png new file mode 100644 index 00000000..dfff234c Binary files /dev/null and b/public/res/store/feature-graphic.png differ diff --git a/src/app/features/settings/about/About.tsx b/src/app/features/settings/about/About.tsx index 8cd13d82..72bc5df7 100644 --- a/src/app/features/settings/about/About.tsx +++ b/src/app/features/settings/about/About.tsx @@ -80,6 +80,35 @@ export function About({ requestClose }: AboutProps) { /> + + {t('Settings.legal')} + + + {t('Settings.privacy_policy_open')} + + } + /> + + {t('Settings.credits')} /* / permanent (collapse subpaths) +// vite-plugin-static-copy maps a single fileMap key per target, so it only +// answers /.html — every other shape (/, //, +// //lobby) falls into vite's SPA fallback, cinny's router reads the +// prefix as a Matrix space alias, and redirects to //lobby. This +// middleware short-circuits the entire /* prefix to the static file. +// Add a new entry here when a new static legal/info page is introduced. +function serveStaticPagesDevMirror() { + const pages = [ + { prefix: '/privacy', file: 'public/privacy.html' }, + { prefix: '/delete-account', file: 'public/delete-account.html' }, + ]; + return { + name: 'vite-plugin-serve-static-pages-dev-mirror', + apply: 'serve', + configureServer(server) { + pages.forEach(({ prefix, file }) => { + server.middlewares.use(prefix, (_req, res, next) => { + const filePath = path.resolve(file); + if (!fs.existsSync(filePath)) return next(); + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + res.setHeader('Cache-Control', 'no-cache'); + res.end(fs.readFileSync(filePath)); + }); + }); + }, + }; +} + function serverMatrixSdkCryptoWasm(wasmFilePath) { return { name: 'vite-plugin-serve-matrix-sdk-crypto-wasm', @@ -209,6 +249,7 @@ export default defineConfig({ }, plugins: [ serveLocalConfigOverlay(), + serveStaticPagesDevMirror(), serverMatrixSdkCryptoWasm('/node_modules/.vite/deps/pkg/matrix_sdk_crypto_wasm_bg.wasm'), topLevelAwait({ // The export name of top-level await promise for each chunk module