fix(site): Phone chip, Free forever Cost copy, and privacy GA disclosure (#868)

* fix(site): align Phone chip, Cost copy, and privacy with GA

Use the official Android beta / iOS TestFlight chip on #ecosystem.
Replace Free forever with Free and open source on privacy and open-source.
Disclose vocalinux.com Google Analytics and scope no-telemetry claims to the installed app.

Fixes #867

* fix(site): make privacy GA disclosure match the live gtag

Spell out page views, the client-ID cookie, and IP/device processing for
G-7NBBNJNNQ7. Align Data Collection with PRODUCT.md, drop the hidden
telemetry weasel, and correct config.json plus the voice-storage row.
This commit is contained in:
Jatin K Malik
2026-09-29 01:07:51 -07:00
committed by GitHub
parent 244b62c8ad
commit 7b69ac2f46
3 changed files with 47 additions and 17 deletions
+2 -2
View File
@@ -42,7 +42,7 @@ const benefits = [
iconBg: "bg-primary/10",
},
{
title: "Free Forever",
title: "Free and open source",
description:
"AGPL-3.0 licensed. Free to use, modify, and share. No freemium, no premium tier, no hidden costs.",
icon: Heart,
@@ -52,7 +52,7 @@ const benefits = [
];
const vsProprietary = [
{ feature: "Cost", vocalinux: "Free forever", proprietary: "$10-500/month or $500+ license" },
{ feature: "Cost", vocalinux: "Free and open source", proprietary: "$10-500/month or $500+ license" },
{ feature: "Source Code", vocalinux: "Fully open", proprietary: "Closed, proprietary" },
{ feature: "Data Privacy", vocalinux: "Local engines by default", proprietary: "Often cloud-based" },
{ feature: "Linux Support", vocalinux: "Native", proprietary: "Limited or none" },
+1 -1
View File
@@ -984,7 +984,7 @@ export default function HomePage() {
</span>
iPhone + Android
</span>
<span className="chip">Phone beta</span>
<span className="chip">Android beta / iOS TestFlight</span>
</div>
<h3>VocaPhone</h3>
<p>
+44 -14
View File
@@ -24,7 +24,7 @@ export default function PrivacyPage() {
headline: "Vocalinux Privacy Policy",
description:
"How Vocalinux handles voice data: local engines on your machine, optional Remote API to a server you configure.",
dateModified: "2026-02-19",
dateModified: "2026-09-23",
author: {
"@type": "Person",
name: "Jatin K Malik",
@@ -92,8 +92,8 @@ export default function PrivacyPage() {
</div>
<h3 className="mb-2 text-xl font-semibold">Open Source</h3>
<p className="text-sm text-muted-foreground">
Fully open source under AGPL-3.0. Inspect the code yourself on GitHub. No hidden
telemetry or data collection.
Fully open source under AGPL-3.0. Inspect the code yourself on GitHub. The installed
app does not send usage telemetry.
</p>
</article>
</section>
@@ -107,31 +107,61 @@ export default function PrivacyPage() {
</h2>
<div className="space-y-4 text-muted-foreground">
<p>
<strong className="text-foreground">We do not collect any personal data.</strong> This
includes:
<strong className="text-foreground">
The installed Vocalinux app does not send usage telemetry.
</strong>{" "}
It does not phone home. The installed app does not do the following
for us:
</p>
<ul className="space-y-2">
<li className="flex items-start gap-2">
<CheckCircle2 className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
No voice recordings or audio data
Does not send voice recordings or audio data to us
</li>
<li className="flex items-start gap-2">
<CheckCircle2 className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
No transcribed text
Does not send transcribed text to us
</li>
<li className="flex items-start gap-2">
<CheckCircle2 className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
No usage analytics or telemetry
Does not send usage analytics or telemetry
</li>
<li className="flex items-start gap-2">
<CheckCircle2 className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
No device fingerprints
Does not send device fingerprints to us
</li>
<li className="flex items-start gap-2">
<CheckCircle2 className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
No IP addresses or location data
Does not collect IP addresses or location data for us
</li>
</ul>
<p>
Local engines keep audio on your device. Remote API sends audio only
to the server you configure.
</p>
<p>
Those limits apply to the installed app. They do not describe this
website.
</p>
</div>
</article>
<article className="rounded-[12px] border border-border bg-background p-6">
<h2 className="mb-4 flex items-center gap-2 font-display text-2xl font-semibold">
<Eye className="h-5 w-5 text-primary" />
This website (vocalinux.com)
</h2>
<div className="space-y-4 text-muted-foreground">
<p>
vocalinux.com loads Google Analytics via the googletagmanager gtag
script for measurement ID{" "}
<code className="rounded bg-muted px-1.5 py-0.5">G-7NBBNJNNQ7</code>{" "}
and runs gtag config with no IP anonymization and no cookie flags.
That sends page views and a Google Analytics client identifier (a
cookie) to Google. Google processes IP addresses and device and
browser data. The installed Vocalinux app does not send usage
telemetry.
</p>
</div>
</article>
@@ -174,7 +204,7 @@ export default function PrivacyPage() {
</h2>
<div className="space-y-4 text-muted-foreground">
<p>
Vocalinux stores configuration locally at <code className="rounded bg-muted px-1.5 py-0.5 bg-muted">~/.config/vocalinux/</code>:
Vocalinux stores configuration locally at <code className="rounded bg-muted px-1.5 py-0.5">~/.config/vocalinux/config.json</code>:
</p>
<ul className="space-y-2">
<li className="flex items-start gap-2">
@@ -191,7 +221,7 @@ export default function PrivacyPage() {
</li>
</ul>
<p>
This data is stored in plain text YAML format. You can view, edit, or delete it at
This data is stored in JSON. You can view, edit, or delete it at
any time.
</p>
</div>
@@ -232,12 +262,12 @@ export default function PrivacyPage() {
</tr>
<tr className="border-b border-border">
<td className="py-3 font-medium text-foreground">Voice recordings stored</td>
<td className="py-3 text-primary">No</td>
<td className="py-3 text-primary">Not by us; Remote API only if you enable it</td>
<td className="py-3">Varies by service</td>
</tr>
<tr>
<td className="py-3 font-medium text-foreground">Cost</td>
<td className="py-3 text-primary">Free forever</td>
<td className="py-3 text-primary">Free and open source</td>
<td className="py-3">Subscription</td>
</tr>
</tbody>