feat(web): rebrand marketing site to Voculinux

Names, wordmarks, package and install references move to voculinux;
site domain to voculinux.com with renamed public assets. Layout keeps
Carbon spacing/type/motion discipline remapped to the house palette
(teal interactive, warm paper, system stacks, red reserved). Header
and footer gain Bongbetic attribution chrome linking hosted brand
assets; no brand binaries vendored. Engine copy states whisper.cpp as
guaranteed default, others as best-effort extras, remote API as
user-configured with audio leaving the machine. Nix page carries a
fork-status note (upstream flake installs Vocalinux).

Refs #24
This commit is contained in:
soubarnak
2026-11-06 02:30:01 +05:30
parent 27f157355d
commit f26e0a9111
88 changed files with 1028 additions and 942 deletions
+12 -12
View File
@@ -10,7 +10,7 @@ import { chromium } from "playwright-core";
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
const pub = join(root, "public");
const mark = join(pub, "brand/vocalinux-mark-circle.svg");
const mark = join(pub, "brand/voculinux-mark-circle.svg");
const chrome =
process.env.CHROME_PATH ||
["/usr/bin/chromium-browser", "/usr/bin/chromium"].find(Boolean);
@@ -33,15 +33,15 @@ const skipIcons = process.env.OG_ONLY === "1";
const sizes = [
[16, join(pub, "favicon-16x16.png")],
[32, join(pub, "favicon-32x32.png")],
[32, join(pub, "vocalinux-32x32.png")],
[64, join(pub, "vocalinux-64x64.png")],
[32, join(pub, "voculinux-32x32.png")],
[64, join(pub, "voculinux-64x64.png")],
[96, join(pub, "favicon-96x96.png")],
[96, join(pub, "vocalinux-96x96.png")],
[192, join(pub, "vocalinux-192x192.png")],
[96, join(pub, "voculinux-96x96.png")],
[192, join(pub, "voculinux-192x192.png")],
[192, join(pub, "icon-192x192.png")],
[512, join(pub, "vocalinux-512x512.png")],
[512, join(pub, "voculinux-512x512.png")],
[512, join(pub, "icon-512x512.png")],
[512, join(pub, "vocalinux.png")],
[512, join(pub, "voculinux.png")],
];
if (!skipIcons) {
@@ -50,8 +50,8 @@ if (!skipIcons) {
if (dest.endsWith(".png") && !dest.includes("favicon-")) {
const webp = dest.replace(/\.png$/i, ".webp");
if (
dest.includes("vocalinux-") ||
dest.endsWith("/vocalinux.png")
dest.includes("voculinux-") ||
dest.endsWith("/voculinux.png")
) {
toWebp(dest, webp);
}
@@ -119,7 +119,7 @@ const ogHtml = `<!doctype html>
<div class="copy">
<div class="brand">
<img src="${markData}" alt="" />
Vocalinux
Voculinux
</div>
<h1>Dictate locally.<br><em>In any app.</em></h1>
<p class="lede">Hold Right Alt. Text lands in the focused window. Local engines by default.</p>
@@ -128,11 +128,11 @@ const ogHtml = `<!doctype html>
<span>No telemetry</span>
<span>AGPL-3.0</span>
</div>
<p class="url">vocalinux.com</p>
<p class="url">voculinux.com</p>
</div>
<div class="right">
<div class="workbench">
<div class="panel"><span>Vocalinux</span><span><i class="rec"></i>listening</span></div>
<div class="panel"><span>Voculinux</span><span><i class="rec"></i>listening</span></div>
<div class="window">
<div class="titlebar"><span>notes.txt</span><span class="dots" aria-hidden="true"><i></i><i></i><i class="close"></i></span></div>
<div class="body">
+3 -3
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env node
/**
* Viewport QA for the Vocalinux marketing home page.
* Viewport QA for the Voculinux marketing home page.
* Uses system Google Chrome via playwright-core (no browser download).
*
* Usage:
@@ -74,7 +74,7 @@ try {
scrollWidth: de.scrollWidth,
clientWidth: de.clientWidth,
overflowX,
hasVocalinux: bodyText.includes("Vocalinux"),
hasVoculinux: bodyText.includes("Voculinux"),
hasInstallCta: !!document.querySelector('a[href="#install"]'),
hasGradientText: !!document.querySelector('[class*="bg-clip-text"]'),
h1: hero ? hero.innerText.trim() : null,
@@ -128,7 +128,7 @@ try {
const ok =
!metrics.overflowX &&
metrics.hasVocalinux &&
metrics.hasVoculinux &&
metrics.hasInstallCta &&
!metrics.hasGradientText &&
metrics.heroInBounds &&