feat: translatable privacy policy

i forgor

also fix inconsistencies with link colours
This commit is contained in:
Maya 2025-10-19 20:04:43 +03:00
parent cf2e351424
commit 728281187c
No known key found for this signature in database
5 changed files with 89 additions and 81 deletions

View File

@ -251,6 +251,37 @@
}
},
"privacy": {
"title": "Privacy Policy"
"title": "Privacy Policy",
"summary": {
"title": "Summary",
"description": "VERT's privacy policy is very simple: we do not collect or store any data on you at all. We don't use cookies or trackers, analytics are completely private, and all conversions (except videos) happen locally on your browser. Videos are deleted after being downloaded, or an hour, unless explicitly given permission by you to be stored; it will only be used for the purpose of troubleshooting. VERT self-hosts a Coolify instance for hosting the website and vertd (for video conversion), and a Plausible instance for completely anonymous and aggregated analytics.<br/><br/>Note this may only apply to the official VERT instance at [vert_link]vert.sh[/vert_link]; third-party instances may handle your data differently."
},
"conversions": {
"title": "Conversions",
"description": "Most conversions (images, documents, audio) happen entirely locally on your device using WebAssembly versions of the relevant tools (e.g. ImageMagick, Pandoc, FFmpeg). This means your files never leave your device and we will never have access to them.<br/><br/>Video conversions are performed on our servers because they require more processing power and cannot be done very quickly on the browser yet. Videos you convert with VERT are deleted after being downloaded, or after one hour, unless you explicitly give permission for us to store them longer purely for troubleshooting purposes."
},
"conversion_errors": {
"title": "Conversion Errors",
"description": "When a video conversion fails, we may collect some anonymous data to help us diagnose the issue. This data may include:",
"list_job_id": "The job ID, which is the anonymized file name",
"list_format_from": "The format you converted from",
"list_format_to": "The format you converted to",
"list_stderr": "The FFmpeg stderr output of your job (error message)",
"list_video": "The actual video file (if given explicit permission)",
"footer": "This information is used solely for the purpose of diagnosing conversion issues. The actual video file will only ever be collected if you give us permission to do so, where it will only be used for troubleshooting."
},
"analytics": {
"title": "Analytics",
"description": "We self-host a Plausible instance for completely anonymous and aggregated analytics. Plausible does not use cookies and complies with all major privacy regulations (GDPR/CCPA/PECR). You can opt out of analytics in the \"Privacy & data\" section in [settings_link]settings[/settings_link] and read more about Plausible's privacy practices [plausible_link]here[/plausible_link]."
},
"local_storage": {
"title": "Local Storage",
"description": "We use your browser's local storage to save your settings, and your browser's session storage to temporarily store the GitHub contributors list for the \"About\" section to reduce repeated GitHub API requests. No personal data is stored or transmitted.<br/><br/>The WebAssembly versions of the conversion tools we use (FFmpeg, ImageMagick, Pandoc) are also stored locally on your browser when you first visit the website, so you don't need to redownload them each visit. No personal data is stored or transmitted. You may view or delete this data at any time in the \"Privacy & data\" section in [settings_link]settings[/settings_link]."
},
"contact": {
"title": "Contact",
"description": "For questions, email us at: [email_link]hello@vert.sh[/email_link]. If you are using a third-party instance of VERT, please contact the hoster of that instance instead."
},
"last_updated": "Last updated: 2025-10-19"
}
}

View File

@ -49,7 +49,7 @@
),
],
[true],
["text-blue-500 font-normal hover:underline"],
["text-blue-500 font-normal"],
))}
</span>
</p>
@ -59,7 +59,6 @@
m["convert.errors.vertd_details_footer"](),
"/privacy",
[true],
["text-blue-500 font-normal hover:underline"],
))}
</p>
</div>

View File

@ -103,7 +103,6 @@
m["about.credits.github_description"](),
GITHUB_URL_VERT,
true,
"text-blue-500 font-normal hover:underline",
),
)}
</p>
@ -115,7 +114,6 @@
m["about.credits.no_contributors"](),
GITHUB_URL_VERT,
true,
"text-blue-500 font-normal hover:underline",
),
)}
</p>

View File

@ -52,6 +52,7 @@
"discord_link",
m["about.sponsors.description"](),
DISCORD_URL,
true
))}
<span class="inline-block mx-[2px] relative top-[2px]">
<button

View File

@ -1,5 +1,6 @@
<script lang="ts">
import { m } from "$lib/paraglide/messages";
import { link, sanitize } from "$lib/store/index.svelte";
import { ShieldCheckIcon } from "lucide-svelte";
</script>
@ -13,102 +14,80 @@
class="w-full max-w-[1280px] flex flex-col md:flex-row gap-4 p-4 md:px-4 md:py-0"
>
<div class="bg-panel rounded-2xl p-6 shadow-panel text-lg font-normal">
<h2 class="text-2xl mb-3">Summary</h2>
<h2 class="text-2xl mb-3">{m["privacy.summary.title"]()}</h2>
<p class="mb-4">
VERT's privacy policy is very simple: we do not collect or store
any data on you at all. We don't use cookies or trackers,
analytics are completely private, and all conversions (except
videos) happen locally on your browser. Videos are deleted after
being downloaded, or an hour, unless explicitly given permission
by you to be stored; it will only be used for the purpose of
troubleshooting. VERT self-hosts a Coolify instance for hosting
the website and vertd (for video conversion), and a Plausible
instance for completely anonymous and aggregated analytics.
<br />
<br />
Note this may only apply to the official VERT instance at
<a href="https://vert.sh" class="underline">vert.sh</a>;
third-party instances may handle your data differently.
{@html sanitize(
link(
["vert_link"],
m["privacy.summary.description"](),
["https://vert.sh"],
[true],
),
)}
</p>
<h2 class="text-2xl mb-3">Conversions</h2>
<h2 class="text-2xl mb-3">{m["privacy.conversions.title"]()}</h2>
<p class="mb-4">
Most conversions (images, documents, audio) happen entirely
locally on your device using WebAssembly versions of the
relevant tools (e.g. ImageMagick, Pandoc, FFmpeg). This means
your files never leave your device and we will never have access
to them.
<br />
<br />
Video conversions are performed on our servers because they require
more processing power and cannot be done very quickly on the browser
yet. Videos you convert with VERT are deleted after being downloaded,
or after one hour, unless you explicitly give permission for us to
store them longer purely for troubleshooting purposes.
{@html sanitize(m["privacy.conversions.description"]())}
</p>
<h2 class="text-2xl mb-3">Conversion Errors</h2>
<h2 class="text-2xl mb-3">
{m["privacy.conversion_errors.title"]()}
</h2>
<div class="mb-4">
When a video conversion fails, we may collect some anonymous
data to help us diagnose the issue. This data may include:
{m["privacy.conversion_errors.description"]()}
<ul class="list-disc list-inside mt-2 mb-2">
<li>The job ID, which is the anonymized file name</li>
<li>The format you converted from</li>
<li>The format you converted to</li>
<li>
The FFmpeg stderr output of your job (error message)
</li>
<li>
The actual video file (if given explicit permission)
</li>
<li>{m["privacy.conversion_errors.list_job_id"]()}</li>
<li>{m["privacy.conversion_errors.list_format_from"]()}</li>
<li>{m["privacy.conversion_errors.list_format_to"]()}</li>
<li>{m["privacy.conversion_errors.list_stderr"]()}</li>
<li>{m["privacy.conversion_errors.list_video"]()}</li>
</ul>
This information is used solely for the purpose of diagnosing conversion
issues. The actual video file will only ever be collected if you
give us permission to do so, where it will only be used for troubleshooting.
{m["privacy.conversion_errors.footer"]()}
</div>
<h3 class="text-xl mt-4 mb-2">Analytics</h3>
<h3 class="text-xl mt-4 mb-2">{m["privacy.analytics.title"]()}</h3>
<p class="mb-4">
We self-host a Plausible instance for completely anonymous and
aggregated analytics. Plausible does not use cookies and
complies with all major privacy regulations (GDPR/CCPA/PECR).
You can opt out of analytics in the "Privacy & data" section in <a
href="/settings"
class="underline">settings</a
>
and read more about Plausible's privacy practices
<a
href="https://plausible.io/privacy-focused-web-analytics"
class="underline">here</a
>.
{@html sanitize(
link(
["settings_link", "plausible_link"],
m["privacy.analytics.description"](),
[
"/settings",
"https://plausible.io/privacy-focused-web-analytics",
],
[false, true],
),
)}
</p>
<h3 class="text-xl mt-4 mb-2">Local Storage</h3>
<h3 class="text-xl mt-4 mb-2">
{m["privacy.local_storage.title"]()}
</h3>
<p class="mb-4">
We use your browser's local storage to save your settings, and
your browser's session storage to temporarily store the GitHub
contributors list for the "About" section to reduce repeated
GitHub API requests. No personal data is stored or transmitted.
<br />
<br />
The WebAssembly versions of the conversion tools we use (FFmpeg,
ImageMagick, Pandoc) are also stored locally on your browser when
you first visit the website, so you dont need to redownload them
each visit. No personal data is stored or transmitted. You may view
or delete this data at any time in the "Privacy & data" section in
<a href="/settings" class="underline">settings</a>.
{@html sanitize(
link(
["settings_link"],
m["privacy.local_storage.description"](),
["/settings"],
[false],
),
)}
</p>
<h3 class="text-xl mt-4 mb-2">Contact</h3>
<h3 class="text-xl mt-4 mb-2">{m["privacy.contact.title"]()}</h3>
<p class="mb-0">
For questions, email us at: <a
href="mailto:hello@vert.sh"
class="underline">hello@vert.sh</a
>. If you are using a third-party instance of VERT, please
contact the hoster of that instance instead.
{@html sanitize(
link(
["email_link"],
m["privacy.contact.description"](),
["mailto:hello@vert.sh"],
[false],
),
)}
</p>
<p class="text-sm text-muted mt-6">Last updated: 2025-10-16</p>
<p class="text-sm text-muted mt-6">{m["privacy.last_updated"]()}</p>
</div>
</div>
</div>