diff --git a/web/src/app/compare/page.tsx b/web/src/app/compare/page.tsx
index e55cc67..cfe3da4 100644
--- a/web/src/app/compare/page.tsx
+++ b/web/src/app/compare/page.tsx
@@ -20,8 +20,8 @@ const engineTable = [
footprint: "Small models available (~74MB tiny)",
bestFor: "Most users who want strong speed + quality",
icon: Zap,
- iconColor: "text-amber-500",
- iconBg: "bg-amber-500/10",
+ iconColor: "text-primary",
+ iconBg: "bg-muted",
},
{
engine: "Whisper (OpenAI)",
@@ -31,8 +31,8 @@ const engineTable = [
footprint: "Large dependency footprint (~2.3GB)",
bestFor: "Users already standardized on PyTorch stack",
icon: Sparkles,
- iconColor: "text-violet-500",
- iconBg: "bg-violet-500/10",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
engine: "VOSK",
@@ -42,8 +42,8 @@ const engineTable = [
footprint: "Very lightweight (~40MB model)",
bestFor: "Older hardware and minimal-resource environments",
icon: Cpu,
- iconColor: "text-cyan-500",
- iconBg: "bg-cyan-500/10",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
engine: "Remote API",
@@ -53,8 +53,8 @@ const engineTable = [
footprint: "No local model required",
bestFor: "Powerful LAN servers or shared transcription backends",
icon: Server,
- iconColor: "text-green-500",
- iconBg: "bg-green-500/10",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
];
@@ -109,7 +109,7 @@ export default function CompareEnginesPage() {
Speech Engine Comparison
-
+
whisper.cpp vs Whisper vs VOSK vs Remote API on Linux
@@ -125,7 +125,7 @@ export default function CompareEnginesPage() {
return (
@@ -154,10 +154,10 @@ export default function CompareEnginesPage() {
})}
-
+
-
+
Engine
Speed
Hardware
@@ -172,7 +172,7 @@ export default function CompareEnginesPage() {
return (
@@ -206,7 +206,7 @@ export default function CompareEnginesPage() {
-
+
Switching Between Engines
@@ -219,7 +219,7 @@ export default function CompareEnginesPage() {
-
+
When to pick whisper.cpp
@@ -231,7 +231,7 @@ export default function CompareEnginesPage() {
-
+
When to pick Whisper
Choose OpenAI Whisper if your environment already depends on
@@ -239,7 +239,7 @@ export default function CompareEnginesPage() {
-
+
When to pick VOSK
Choose VOSK on older laptops, low-RAM systems, or lightweight VMs
@@ -247,7 +247,7 @@ export default function CompareEnginesPage() {
-
+
When to pick Remote API
@@ -265,11 +265,11 @@ export default function CompareEnginesPage() {
-
- Next steps
+
+ Next steps
-
+
Install by distro:
-
+
Use interactive install to detect your hardware and pick the best
engine defaults.
-
+
After install, tune model size, VAD sensitivity, or Remote API
settings for your preferred latency and accuracy level.
diff --git a/web/src/app/desktop-reliability/page.tsx b/web/src/app/desktop-reliability/page.tsx
index 1cba7b7..57329e4 100644
--- a/web/src/app/desktop-reliability/page.tsx
+++ b/web/src/app/desktop-reliability/page.tsx
@@ -125,7 +125,7 @@ export default function DesktopReliabilityPage() {
Desktop Reliability
-
+
Reliable Voice Dictation on Real Linux Desktops
@@ -142,9 +142,9 @@ export default function DesktopReliabilityPage() {
return (
-
+
{feature.title}
@@ -156,13 +156,13 @@ export default function DesktopReliabilityPage() {
})}
-
- Reliability Work by Release
+
+ Reliability Work by Release
{releaseMap.map((release) => (
{release.version}
@@ -174,8 +174,8 @@ export default function DesktopReliabilityPage() {
-
-
Why This Matters
+
+
Why This Matters
{[
"Dictation should survive laptop lid closes, docking changes, and USB re-enumeration.",
@@ -184,15 +184,15 @@ export default function DesktopReliabilityPage() {
"Settings should fit smaller displays and window managers with different decoration behavior.",
].map((item) => (
-
+
{item}
))}
-
-
Where to Debug Issues
+
+
Where to Debug Issues
If dictation works in one app but not another, start with the
display server and input method path. Wayland sessions often depend
@@ -208,8 +208,8 @@ export default function DesktopReliabilityPage() {
-
- Related Guides
+
+ Related Guides
Wayland support
diff --git a/web/src/app/faq/page.tsx b/web/src/app/faq/page.tsx
index b40d9f6..15c597d 100644
--- a/web/src/app/faq/page.tsx
+++ b/web/src/app/faq/page.tsx
@@ -18,7 +18,7 @@ const faqCategories = [
{
category: "Getting Started",
icon: Zap,
- iconColor: "text-amber-500",
+ iconColor: "text-primary",
questions: [
{
q: "How do I install Vocalinux?",
@@ -37,7 +37,7 @@ const faqCategories = [
{
category: "Privacy & Security",
icon: Lock,
- iconColor: "text-green-500",
+ iconColor: "text-primary",
questions: [
{
q: "Is Vocalinux really 100% offline?",
@@ -56,7 +56,7 @@ const faqCategories = [
{
category: "Speech Recognition",
icon: Mic,
- iconColor: "text-blue-500",
+ iconColor: "text-primary",
questions: [
{
q: "Which speech recognition engines are available?",
@@ -79,7 +79,7 @@ const faqCategories = [
{
category: "Usage & Features",
icon: Volume2,
- iconColor: "text-violet-500",
+ iconColor: "text-primary",
questions: [
{
q: "How do I start and stop dictation?",
@@ -106,7 +106,7 @@ const faqCategories = [
{
category: "Performance",
icon: Cpu,
- iconColor: "text-cyan-500",
+ iconColor: "text-primary",
questions: [
{
q: "How much RAM does Vocalinux need?",
@@ -166,7 +166,7 @@ export default function FaqPage() {
Help Center
-
+
Frequently Asked Questions
@@ -181,10 +181,10 @@ export default function FaqPage() {
return (
-
-
+
+
{category.category}
@@ -194,7 +194,7 @@ export default function FaqPage() {
{category.questions.map((item, index) => (
{item.q}
{item.a}
@@ -206,8 +206,8 @@ export default function FaqPage() {
})}
-
- Still have questions?
+
+ Still have questions?
diff --git a/web/src/app/for-developers/page.tsx b/web/src/app/for-developers/page.tsx
index ac3d689..4a6958a 100644
--- a/web/src/app/for-developers/page.tsx
+++ b/web/src/app/for-developers/page.tsx
@@ -21,8 +21,8 @@ const useCases = [
"Dictate inline comments, JSDoc, docstrings, and README sections without leaving your editor.",
example: "This function validates user input and returns true if valid",
icon: FileCode2,
- iconColor: "text-blue-500",
- iconBg: "bg-blue-100 dark:bg-blue-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Git Commit Messages",
@@ -30,8 +30,8 @@ const useCases = [
"Speak your commit messages naturally - no more brief, unhelpful commits because typing is slow.",
example: "fix authentication timeout when server is under heavy load",
icon: Terminal,
- iconColor: "text-orange-500",
- iconBg: "bg-orange-100 dark:bg-orange-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Pull Request Descriptions",
@@ -39,8 +39,8 @@ const useCases = [
"Write detailed PR descriptions explaining your changes, rationale, and testing approach.",
example: "This PR refactors the user service to improve testability and adds error handling",
icon: FileText,
- iconColor: "text-purple-500",
- iconBg: "bg-purple-100 dark:bg-purple-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Technical Documentation",
@@ -48,8 +48,8 @@ const useCases = [
"Create API docs, architecture guides, and technical specifications at speaking speed.",
example: "The API accepts a JSON payload with the following fields",
icon: FileText,
- iconColor: "text-emerald-500",
- iconBg: "bg-emerald-100 dark:bg-emerald-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Code Review Comments",
@@ -57,8 +57,8 @@ const useCases = [
"Write thorough code review feedback without the fatigue of typing detailed explanations.",
example: "Consider extracting this logic into a separate function for reusability",
icon: MessageSquare,
- iconColor: "text-rose-500",
- iconBg: "bg-rose-100 dark:bg-rose-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Pair Programming Notes",
@@ -66,8 +66,8 @@ const useCases = [
"Dictate notes while pairing - keep your hands on the keyboard for code, use voice for meta.",
example: "Remember to add unit tests for the edge case we just discussed",
icon: Zap,
- iconColor: "text-amber-500",
- iconBg: "bg-amber-100 dark:bg-amber-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
];
@@ -160,11 +160,11 @@ export default function ForDevelopersPage() {
/>
-
+
For Developers
-
+
Voice Dictation for Developers
@@ -177,7 +177,7 @@ export default function ForDevelopersPage() {
{benefits.map((benefit) => (
{benefit.title}
{benefit.description}
@@ -186,14 +186,14 @@ export default function ForDevelopersPage() {
- Developer Use Cases
+ Developer Use Cases
{useCases.map((useCase) => {
const Icon = useCase.icon;
return (
@@ -202,8 +202,8 @@ export default function ForDevelopersPage() {
{useCase.title}
{useCase.description}
-
-
"{useCase.example}"
+
+ "{useCase.example}"
);
@@ -211,8 +211,8 @@ export default function ForDevelopersPage() {
-
- Helpful Voice Commands for Coding
+
+ Helpful Voice Commands for Coding
Use these voice commands for punctuation and symbols commonly used in code:
@@ -220,9 +220,9 @@ export default function ForDevelopersPage() {
{voiceCommands.map((cmd) => (
-
+
"{cmd.command}"
{cmd.action}
@@ -234,19 +234,19 @@ export default function ForDevelopersPage() {
-
-
+
+
Not Voice Coding - Voice Documentation
-
+
Vocalinux is designed for dictating text , not writing code syntax. For
actual code, your keyboard is still faster. But for comments, docs, messages, and
notes - voice is a game-changer. Use both together for maximum productivity.
-
- Works in Every IDE
+
+ Works in Every IDE
{[
"VS Code",
@@ -261,9 +261,9 @@ export default function ForDevelopersPage() {
].map((ide) => (
-
+
{ide}
))}
@@ -273,8 +273,8 @@ export default function ForDevelopersPage() {
-
- Start Dictating Your Docs
+
+ Start Dictating Your Docs
Install Vocalinux and start writing better documentation with less effort. Your future
self (and your team) will thank you.
@@ -282,14 +282,14 @@ export default function ForDevelopersPage() {
Install Now
RSI Prevention
diff --git a/web/src/app/gnome-kde/page.tsx b/web/src/app/gnome-kde/page.tsx
index e1e5234..c041e35 100644
--- a/web/src/app/gnome-kde/page.tsx
+++ b/web/src/app/gnome-kde/page.tsx
@@ -90,11 +90,11 @@ export default function GnomeVsKdePage() {
/>
-
+
Linux Desktop Comparison
-
+
Voice Typing on GNOME vs KDE Plasma: Linux Desktop Comparison
@@ -104,8 +104,8 @@ export default function GnomeVsKdePage() {
-
- Why desktop environment matters for voice dictation
+
+ Why desktop environment matters for voice dictation
Voice typing quality is not just about the speech engine. Your desktop environment determines
session type defaults, tray behavior, and input method routing. That affects whether dictation
@@ -113,32 +113,32 @@ export default function GnomeVsKdePage() {
-
- GNOME: what to expect
+
+ GNOME: what to expect
-
+
Wayland is the default on modern GNOME sessions, so IBus-backed text
injection is usually the primary path.
-
+
IBus integration is central for reliable cross-app dictation behavior on
Wayland.
-
+
Tray icon often needs AppIndicator support via GNOME extension, because
legacy tray behavior differs from KDE.
-
+
Known issues and workarounds: if the tray icon is missing, install/enable
AppIndicator extension; if text does not appear in apps, verify IBus daemon/engine state.
@@ -147,25 +147,25 @@ export default function GnomeVsKdePage() {
-
- KDE Plasma: what to expect
+
+ KDE Plasma: what to expect
-
+
X11 vs Wayland matters : Plasma supports both widely, so behavior can differ
between sessions.
-
+
IBus setup may be more explicit compared with GNOME defaults, depending on
distro and prior input method configuration.
-
+
System Settings integration is strong , making it easier to inspect session
type, input method behavior, and tray settings from one place.
@@ -174,11 +174,11 @@ export default function GnomeVsKdePage() {
-
- GNOME vs KDE Plasma comparison
+
+ GNOME vs KDE Plasma comparison
-
+
Feature
GNOME
KDE Plasma
@@ -188,7 +188,7 @@ export default function GnomeVsKdePage() {
{comparisonRows.map((row) => {
const Icon = row.icon;
return (
-
+
@@ -207,7 +207,7 @@ export default function GnomeVsKdePage() {
-
+
When GNOME is a better fit
Choose GNOME when you want a Wayland-first environment with familiar IBus defaults and a
@@ -216,7 +216,7 @@ export default function GnomeVsKdePage() {
-
+
When KDE Plasma is a better fit
Choose KDE Plasma when you want deeper system configurability, flexible X11/Wayland session
@@ -225,8 +225,8 @@ export default function GnomeVsKdePage() {
-
- Helpful guides
+
+ Helpful guides
Wayland setup and architecture
@@ -240,15 +240,15 @@ export default function GnomeVsKdePage() {
-
- Ready to set up voice typing on your desktop?
+
+ Ready to set up voice typing on your desktop?
Install Vocalinux and get reliable offline voice dictation on GNOME or KDE Plasma, with the
right text injection path for your session type.
Install Vocalinux
diff --git a/web/src/app/gpu-acceleration/page.tsx b/web/src/app/gpu-acceleration/page.tsx
index c52d8d8..e261d46 100644
--- a/web/src/app/gpu-acceleration/page.tsx
+++ b/web/src/app/gpu-acceleration/page.tsx
@@ -25,8 +25,8 @@ const gpuBackends = [
"Best option for AMD and Intel GPUs",
],
icon: Monitor,
- iconColor: "text-violet-500",
- iconBg: "bg-violet-100 dark:bg-violet-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
recommended: true,
},
{
@@ -40,8 +40,8 @@ const gpuBackends = [
"Works with PyTorch-based Whisper engine",
],
icon: Cpu,
- iconColor: "text-green-500",
- iconBg: "bg-green-100 dark:bg-green-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
recommended: false,
},
{
@@ -56,8 +56,8 @@ const gpuBackends = [
"Lowest power consumption option",
],
icon: MemoryStick,
- iconColor: "text-blue-500",
- iconBg: "bg-blue-100 dark:bg-blue-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
recommended: false,
},
];
@@ -178,11 +178,11 @@ export default function GpuAccelerationPage() {
/>
-
+
Performance
-
+
GPU Accelerated Voice Dictation
@@ -191,13 +191,13 @@ export default function GpuAccelerationPage() {
-
- Quick Check: Do You Have GPU Support?
+
+ Quick Check: Do You Have GPU Support?
Run this command to check if your system supports Vulkan GPU acceleration:
-
-
vulkaninfo --summary | grep deviceName
+
+ vulkaninfo --summary | grep deviceName
If you see your GPU name, you're ready for accelerated dictation!
@@ -205,17 +205,17 @@ export default function GpuAccelerationPage() {
- Supported GPU Backends
+ Supported GPU Backends
{gpuBackends.map((backend) => {
const Icon = backend.icon;
return (
@@ -238,7 +238,7 @@ export default function GpuAccelerationPage() {
{backend.advantages.map((advantage) => (
-
+
{advantage}
))}
@@ -249,8 +249,8 @@ export default function GpuAccelerationPage() {
-
- Model Performance Comparison
+
+ Model Performance Comparison
Approximate transcription times for 5 seconds of audio. GPU times assume a mid-range
Vulkan-compatible GPU.
@@ -258,7 +258,7 @@ export default function GpuAccelerationPage() {
-
+
Model
Size
CPU Time
@@ -269,7 +269,7 @@ export default function GpuAccelerationPage() {
{modelPerformance.map((row) => (
-
+
{row.model}
{row.size}
{row.cpuSpeed}
@@ -284,12 +284,12 @@ export default function GpuAccelerationPage() {
- Hardware Requirements
+ Hardware Requirements
{hardwareRequirements.map((tier) => (
{tier.category}
@@ -312,14 +312,14 @@ export default function GpuAccelerationPage() {
-
+
-
+
-
+
Intel GPU Note
-
+
Some Intel integrated GPUs don't fully support the compute features needed for
whisper.cpp GPU acceleration. Vocalinux v0.7.0+ automatically detects incompatible
Intel GPUs and falls back to CPU processing for reliability.
@@ -328,8 +328,8 @@ export default function GpuAccelerationPage() {
-
- Get Started with GPU Acceleration
+
+ Get Started with GPU Acceleration
The installer automatically detects your GPU and configures the best backend. Just run
and go.
@@ -337,14 +337,14 @@ export default function GpuAccelerationPage() {
Install Now
Compare Engines
diff --git a/web/src/app/install/[distro]/page.tsx b/web/src/app/install/[distro]/page.tsx
index ea70e7c..948964e 100644
--- a/web/src/app/install/[distro]/page.tsx
+++ b/web/src/app/install/[distro]/page.tsx
@@ -157,26 +157,26 @@ const getDistroStyles = (distro: DistroSlug) => {
if (distro === "ubuntu") {
return {
icon: Laptop,
- iconClass: "text-orange-500",
- chipClass: "border-orange-500/30 bg-orange-500/10 text-orange-600 dark:text-orange-400",
- panelClass: "from-orange-500/15 to-amber-500/10",
+ iconClass: "text-primary",
+ chipClass: "border-border bg-muted text-muted-foreground",
+ panelClass: "bg-primary/10",
};
}
if (distro === "fedora") {
return {
icon: Sparkles,
- iconClass: "text-blue-500",
- chipClass: "border-blue-500/30 bg-blue-500/10 text-blue-600 dark:text-blue-400",
- panelClass: "from-blue-500/15 to-cyan-500/10",
+ iconClass: "text-primary",
+ chipClass: "border-border bg-primary/10 text-primary",
+ panelClass: "bg-primary/10",
};
}
return {
icon: Cpu,
- iconClass: "text-emerald-500",
- chipClass: "border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400",
- panelClass: "from-emerald-500/15 to-teal-500/10",
+ iconClass: "text-primary",
+ chipClass: "border-border bg-primary/10 text-muted-foreground",
+ panelClass: "bg-primary/10",
};
};
@@ -297,18 +297,18 @@ export default async function DistroInstallPage({
{config.name} Setup Guide
-
{config.title}
+
{config.title}
{config.intro}
-
+
Install command
-
-
+
+
{config.installCommand}
@@ -316,30 +316,30 @@ export default async function DistroInstallPage({
-
+
-
+
Prerequisites
{config.prerequisites.map((item) => (
-
+
{item}
))}
-
+
-
+
Tested environments
{config.testedOn.map((item) => (
-
+
{item}
))}
@@ -347,30 +347,30 @@ export default async function DistroInstallPage({
-
+
-
+
Setup notes for {config.name}
{config.setupNotes.map((item) => (
-
+
{item}
))}
-
+
-
+
Post-install checklist
{config.postInstallChecks.map((item) => (
-
+
{item}
))}
diff --git a/web/src/app/install/page.tsx b/web/src/app/install/page.tsx
index 81ba509..2240fa0 100644
--- a/web/src/app/install/page.tsx
+++ b/web/src/app/install/page.tsx
@@ -1,6 +1,6 @@
import Link from "next/link";
import { type Metadata } from "next";
-import { ChevronRight, Cpu, Laptop, Sparkles, Terminal } from "lucide-react";
+import { ChevronRight, Cpu, Laptop, Terminal } from "lucide-react";
import { SeoSubpageShell } from "@/components/seo-subpage-shell";
import { buildPageMetadata } from "@/lib/seo";
@@ -14,17 +14,13 @@ const distroGuides = [
description:
"Install offline voice dictation on Ubuntu 22.04+ with GNOME, KDE, X11, or Wayland.",
icon: Laptop,
- accent: "from-orange-500/15 to-amber-500/10",
- iconColor: "text-orange-500",
},
{
name: "Fedora",
href: "/install/fedora/",
description:
"Set up speech-to-text on Fedora Workstation and Silverblue with distro-specific notes.",
- icon: Sparkles,
- accent: "from-blue-500/15 to-cyan-500/10",
- iconColor: "text-blue-500",
+ icon: Terminal,
},
{
name: "Arch Linux",
@@ -32,8 +28,6 @@ const distroGuides = [
description:
"Install Vocalinux on Arch, Manjaro, and EndeavourOS with package prerequisites and tips.",
icon: Cpu,
- accent: "from-emerald-500/15 to-teal-500/10",
- iconColor: "text-emerald-500",
},
];
@@ -54,71 +48,75 @@ export const metadata: Metadata = buildPageMetadata({
export default function InstallGuidesPage() {
return (
-
-
-
- Linux Installation Guides
-
-
- Install Voice Dictation on Linux
-
-
- Pick your distro guide and follow a proven setup flow for offline speech-to-text on Linux.
- Every guide is optimized for real desktop usage, not just terminal demos.
+
+ Linux installation
+ Install Voice Dictation on Linux
+
+ Pick your distro guide and follow a proven setup flow for offline
+ speech-to-text on Linux. Every guide is written for real desktop usage.
-
-
-
- Recommended interactive install
+
+
+
+ install.sh --interactive
-
+
{installCommand}
-
+
{distroGuides.map((guide) => {
const Icon = guide.icon;
return (
-
-
+
+
-
{guide.name}
-
{guide.description}
-
+ {guide.name}
+
+ {guide.description}
+
+
Read {guide.name} guide
-
+
);
})}
-
- After Installation
+
+ After installation
- Launch with
- vocalinux.
+ Launch with{" "}
+
+ vocalinux
+
+ .
- Use toggle mode (double-tap Ctrl) or push-to-talk mode to control dictation in any text field.
- Choose whisper.cpp for speed, Whisper for maximum model compatibility, or VOSK for
- low-RAM systems.
+ Use toggle mode (double-tap Ctrl) or push-to-talk to control
+ dictation in any text field.
+
+
+ Choose whisper.cpp for speed, Whisper for maximum model
+ compatibility, or VOSK for low-RAM systems.
- Need help choosing an engine? See the
-
+ Need help choosing an engine? See the{" "}
+
speech engine comparison
.
diff --git a/web/src/app/languages/page.tsx b/web/src/app/languages/page.tsx
index e7e65b4..e52ee71 100644
--- a/web/src/app/languages/page.tsx
+++ b/web/src/app/languages/page.tsx
@@ -160,11 +160,11 @@ export default function LanguagesPage() {
/>
-
+
9+ Languages
-
+
Multilingual Voice Dictation for Linux
@@ -179,7 +179,7 @@ export default function LanguagesPage() {
return (
{feature.title}
@@ -190,12 +190,12 @@ export default function LanguagesPage() {
- Supported Languages
+ Supported Languages
{supportedLanguages.map((lang) => (
{lang.flag}
@@ -209,7 +209,7 @@ export default function LanguagesPage() {
{lang.engines.map((engine) => (
{engine}
@@ -220,22 +220,22 @@ export default function LanguagesPage() {
-
- How Language Support Works
+
+ How Language Support Works
Language Selection
-
+
Select your language in Settings → Speech Engine → Language
-
+
Use "Auto" for automatic language detection (whisper.cpp/Whisper)
-
+
Switch languages on-the-fly without restarting
@@ -244,15 +244,15 @@ export default function LanguagesPage() {
Model Selection
-
+
Larger models provide better accuracy for all languages
-
+
"tiny" model works for all supported languages
-
+
Models are downloaded automatically on first use
@@ -260,8 +260,8 @@ export default function LanguagesPage() {
-
- Ready to Dictate in Your Language?
+
+ Ready to Dictate in Your Language?
Install Vocalinux and start dictating in your preferred language. All processing happens
locally on your Linux machine.
@@ -269,14 +269,14 @@ export default function LanguagesPage() {
Install Now
Compare Engines
diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx
index 9114f34..9945c4a 100644
--- a/web/src/app/layout.tsx
+++ b/web/src/app/layout.tsx
@@ -1,6 +1,6 @@
import "@/styles/globals.css";
import React from "react";
-import { GeistSans } from "geist/font/sans";
+import { Bricolage_Grotesque, Source_Sans_3 } from "next/font/google";
import { type Metadata } from "next";
import Script from "next/script";
import { ThemeProvider } from "@/components/theme-provider";
@@ -13,13 +13,25 @@ import {
TWITTER_HANDLE,
} from "@/lib/seo";
+const display = Bricolage_Grotesque({
+ subsets: ["latin"],
+ variable: "--font-display",
+ display: "swap",
+});
+
+const body = Source_Sans_3({
+ subsets: ["latin"],
+ variable: "--font-body",
+ display: "swap",
+});
+
export const viewport = {
width: "device-width",
initialScale: 1,
maximumScale: 5,
themeColor: [
{ media: "(prefers-color-scheme: light)", color: "#ffffff" },
- { media: "(prefers-color-scheme: dark)", color: "#18181b" },
+ { media: "(prefers-color-scheme: dark)", color: "#0c0c0e" },
],
};
@@ -176,7 +188,7 @@ export default function RootLayout({
return (
diff --git a/web/src/app/offline/page.tsx b/web/src/app/offline/page.tsx
index 2f2311e..0736556 100644
--- a/web/src/app/offline/page.tsx
+++ b/web/src/app/offline/page.tsx
@@ -19,32 +19,32 @@ const benefits = [
description:
"Works on airplanes, in tunnels, on remote farms. Your voice never needs to leave your machine.",
icon: WifiOff,
- iconColor: "text-blue-500",
- iconBg: "bg-blue-100 dark:bg-blue-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Zero Data Collection",
description:
"No telemetry, no analytics, no usage tracking. There's no server to send data to even if we wanted to.",
icon: Database,
- iconColor: "text-emerald-500",
- iconBg: "bg-emerald-100 dark:bg-emerald-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "No Account Required",
description:
"No signup, no login, no password to forget. Download and run - that's it.",
icon: Lock,
- iconColor: "text-violet-500",
- iconBg: "bg-violet-100 dark:bg-violet-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Your Voice Stays Yours",
description:
"Voice data is biometric. Your voice patterns, accent, and speech habits are yours alone.",
icon: Shield,
- iconColor: "text-rose-500",
- iconBg: "bg-rose-100 dark:bg-rose-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
];
@@ -135,11 +135,11 @@ export default function OfflinePage() {
/>
-
+
100% Offline
-
+
Offline Voice Dictation
@@ -155,7 +155,7 @@ export default function OfflinePage() {
return (
@@ -167,12 +167,12 @@ export default function OfflinePage() {
})}
-
- Offline vs Cloud Dictation
+
+ Offline vs Cloud Dictation
-
+
Feature
Vocalinux (Offline)
Cloud Dictation
@@ -180,20 +180,20 @@ export default function OfflinePage() {
{vsCloud.map((row) => (
-
+
{row.feature}
{row.offline ? (
-
+
) : (
-
+
)}
{row.cloud ? (
-
+
) : (
-
+
)}
@@ -204,12 +204,12 @@ export default function OfflinePage() {
- When Offline Matters Most
+ When Offline Matters Most
{sensitiveUseCases.map((useCase) => (
{useCase.title}
{useCase.description}
@@ -218,14 +218,14 @@ export default function OfflinePage() {
-
-
+
+
How Offline Processing Works
-
+
Vocalinux uses speech recognition models that run entirely on your CPU or GPU:
-
+
whisper.cpp - C++ port of OpenAI Whisper, runs locally with GPU
@@ -240,20 +240,20 @@ export default function OfflinePage() {
OpenAI Whisper - PyTorch-based, runs on NVIDIA GPU or CPU
-
+
Models are downloaded once (74MB-3.0GB depending on size), then all processing happens
locally. No network requests during dictation.
-
-
+
+
Verify It Yourself
-
+
Don't trust - verify. Vocalinux is open source. You can:
-
+
Read every line of code on{" "}
@@ -268,12 +268,12 @@ export default function OfflinePage() {
- Run with --debug to see all network activity (there is none)
+ Run with --debug to see all network activity (there is none)
- Monitor with tcpdump or{" "}
- wireshark - you'll see silence
+ Monitor with tcpdump or{" "}
+ wireshark - you'll see silence
@@ -282,8 +282,8 @@ export default function OfflinePage() {
-
- Truly Private Voice Dictation
+
+ Truly Private Voice Dictation
Install Vocalinux and take control of your voice data. No cloud, no tracking, no
compromises.
@@ -291,14 +291,14 @@ export default function OfflinePage() {
Install Now
View Source Code
diff --git a/web/src/app/open-source/page.tsx b/web/src/app/open-source/page.tsx
index 7167bd2..e9d31a9 100644
--- a/web/src/app/open-source/page.tsx
+++ b/web/src/app/open-source/page.tsx
@@ -22,32 +22,32 @@ const benefits = [
description:
"Your voice data stays with you. No subscription to cancel, no service to shut down, no company to go out of business.",
icon: Lock,
- iconColor: "text-blue-500",
- iconBg: "bg-blue-100 dark:bg-blue-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Transparent & Auditable",
description:
"Every line of code is visible. Security researchers and users can verify exactly what the software does.",
icon: Eye,
- iconColor: "text-violet-500",
- iconBg: "bg-violet-100 dark:bg-violet-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Community Driven",
description:
"Built by Linux users, for Linux users. Features and fixes come from real users, not corporate roadmaps.",
icon: Users,
- iconColor: "text-emerald-500",
- iconBg: "bg-emerald-100 dark:bg-emerald-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
{
title: "Free Forever",
description:
"GPL v3 licensed. Free to use, modify, and share. No freemium, no premium tier, no hidden costs.",
icon: Heart,
- iconColor: "text-rose-500",
- iconBg: "bg-rose-100 dark:bg-rose-900/30",
+ iconColor: "text-primary",
+ iconBg: "bg-primary/10",
},
];
@@ -133,11 +133,11 @@ export default function OpenSourcePage() {
/>
-
+
Open Source
-
+
Free & Open Source Voice Dictation
@@ -146,14 +146,14 @@ export default function OpenSourcePage() {
-
+
-
-
+
+
GPL v3 Licensed
-
+
Vocalinux is released under the GNU General Public License v3.0, which means:
@@ -163,7 +163,7 @@ export default function OpenSourcePage() {
"Free to share with others",
"Modifications must remain open",
].map((item) => (
-
+
{item}
@@ -172,14 +172,14 @@ export default function OpenSourcePage() {
- Why Open Source Matters
+ Why Open Source Matters
{benefits.map((benefit) => {
const Icon = benefit.icon;
return (
@@ -194,12 +194,12 @@ export default function OpenSourcePage() {
-
- Open Source vs Proprietary
+
+ Open Source vs Proprietary
-
+
Feature
Vocalinux
Proprietary Alternatives
@@ -207,9 +207,9 @@ export default function OpenSourcePage() {
{vsProprietary.map((row) => (
-
+
{row.feature}
- {row.vocalinux}
+ {row.vocalinux}
{row.proprietary}
))}
@@ -219,7 +219,7 @@ export default function OpenSourcePage() {
- Built on Open Source
+ Built on Open Source
Vocalinux stands on the shoulders of these excellent open source projects:
@@ -227,11 +227,11 @@ export default function OpenSourcePage() {
{techStack.map((tech) => (
{tech.name}
-
+
{tech.license}
@@ -241,11 +241,11 @@ export default function OpenSourcePage() {
-
+
-
Privacy by Design
+
Privacy by Design
Because Vocalinux is open source and runs entirely offline, you can verify that your
voice data never leaves your computer. No telemetry, no analytics, no cloud
@@ -256,7 +256,7 @@ export default function OpenSourcePage() {
(item) => (
{item}
@@ -267,14 +267,14 @@ export default function OpenSourcePage() {
-
+
-
+
-
+
Contribute to Vocalinux
-
+
We welcome contributions! Whether it's bug fixes, features, documentation, or
translations - join the community.
@@ -282,7 +282,7 @@ export default function OpenSourcePage() {
href="https://github.com/jatinkrmalik/vocalinux"
target="_blank"
rel="noopener noreferrer"
- className="inline-flex items-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-sm font-semibold text-white hover:bg-blue-700"
+ className="inline-flex items-center gap-2 rounded-full border border-border bg-background px-4 py-2 text-sm font-semibold text-foreground hover:bg-muted"
>
View on GitHub
@@ -291,22 +291,22 @@ export default function OpenSourcePage() {
-
- Join the Open Source Revolution
+
+ Join the Open Source Revolution
Install Vocalinux and experience voice dictation that respects your freedom and privacy.
Install Free
Compare Alternatives
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx
index e6c39c6..efd2b73 100644
--- a/web/src/app/page.tsx
+++ b/web/src/app/page.tsx
@@ -1,41 +1,22 @@
"use client";
import React, { useState, useEffect, useCallback } from "react";
-import { motion } from "framer-motion";
+import Image from "next/image";
import Link from "next/link";
-import { LiveDemo } from "@/components/live-demo";
import {
- Terminal,
- Activity,
- Lock,
- Zap,
- Laptop,
- Keyboard,
- Settings,
- Github,
- Star,
- Download,
- ChevronRight,
- CheckCircle2,
- Menu,
- X,
- Copy,
Check,
- Play,
- Shield,
- ShieldCheck,
- Server,
- Globe,
- Cpu,
- Volume2,
- Sparkles,
+ ChevronRight,
+ Copy,
+ Github,
+ Menu,
+ Star,
+ Terminal,
+ X,
Heart,
} from "lucide-react";
import { ThemeToggle } from "@/components/theme-toggle";
import { VocalinuxLogo } from "@/components/optimized-image";
-import { useInView } from "react-intersection-observer";
-// The one-liner install command (split into three lines for display)
// Always uses main/install.sh. The installer dynamically resolves the latest release tag via GitHub API
const installCommands = {
interactiveInstallCommand: `curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh -o /tmp/vl.sh && bash /tmp/vl.sh --interactive`,
@@ -43,7 +24,6 @@ const installCommands = {
https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \\
-o /tmp/vl.sh && \\
bash /tmp/vl.sh --interactive`,
-
uninstallCommand: `curl -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/uninstall.sh -o /tmp/vul.sh && bash /tmp/vul.sh`,
uninstallDisplayCommand: `curl -fsSL \\
https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/uninstall.sh \\
@@ -147,7 +127,7 @@ const homeJsonLd = [
name: "Does Vocalinux preserve my keyboard layout?",
acceptedAnswer: {
"@type": "Answer",
- text: "Yes! v0.10.1+ preserves your XKB keyboard layout when activating IBus, so you won't unexpectedly switch to US layout mid-dictation.",
+ text: "Yes. v0.10.1+ preserves your XKB keyboard layout when activating IBus, so you won't unexpectedly switch to US layout mid-dictation.",
},
},
],
@@ -181,51 +161,84 @@ const homeJsonLd = [
},
];
-const FeatureCard = ({
- icon,
- title,
- description,
- href,
-}: {
- icon: React.ReactNode;
- title: string;
- description: string;
- href?: string;
-}) => {
- const [ref, inView] = useInView({
- triggerOnce: true,
- threshold: 0.1,
- });
+const featureRows = [
+ {
+ title: "Stays on your machine",
+ body: "Local engines process audio on-device. No cloud upload, no telemetry, no account.",
+ href: "/offline/",
+ link: "Offline privacy",
+ },
+ {
+ title: "Works where you type",
+ body: "Terminals, browsers, IDEs, office apps, and any focused text field on X11 or Wayland.",
+ href: "/use-cases/",
+ link: "Use cases",
+ },
+ {
+ title: "Fast by default",
+ body: "whisper.cpp with Vulkan on AMD, Intel, and NVIDIA. Tiny model is about 74MB.",
+ href: "/gpu-acceleration/",
+ link: "GPU acceleration",
+ },
+ {
+ title: "Your shortcuts",
+ body: "Toggle or push-to-talk. Bind modifiers the way your hands already work.",
+ href: "/shortcuts/",
+ link: "Shortcuts",
+ },
+ {
+ title: "Desktop reliability",
+ body: "Suspend recovery, IBus hardening, layout preservation, non-ASCII injection fallbacks.",
+ href: "/desktop-reliability/",
+ link: "Reliability notes",
+ },
+ {
+ title: "Neural silence filter",
+ body: "Silero VAD drops empty buffers before recognition, with amplitude fallback if needed.",
+ href: "/voice-activity-detection/",
+ link: "Voice activity detection",
+ },
+];
- const card = (
-
-
-
- {description}
-
- {href && (
-
- Learn more{" "}
-
-
- )}
-
- );
-
- if (href) {
- return
{card};
- }
- return card;
-};
+const engines = [
+ {
+ name: "whisper.cpp",
+ badge: "Default",
+ summary: "C++ Whisper with Vulkan. Fast install, multi-vendor GPU.",
+ points: [
+ "About 1–2 min default setup",
+ "AMD / Intel / NVIDIA via Vulkan",
+ "Tiny model ~74MB",
+ ],
+ },
+ {
+ name: "Whisper",
+ summary: "Original OpenAI PyTorch path for NVIDIA CUDA workflows.",
+ points: [
+ "Same model family accuracy",
+ "CUDA when you already live in PyTorch",
+ "Larger install footprint",
+ ],
+ },
+ {
+ name: "VOSK",
+ summary: "Small footprint for older machines and tight RAM budgets.",
+ points: [
+ "CPU-friendly streaming",
+ "Models around ~40MB",
+ "Great on modest hardware",
+ ],
+ },
+ {
+ name: "Remote API",
+ summary: "Offload to a server you trust while keeping desktop injection local.",
+ points: [
+ "OpenAI-compatible endpoints",
+ "whisper.cpp server support",
+ "Local VAD still applies",
+ ],
+ },
+];
const CopyButton = ({
text,
@@ -235,7 +248,6 @@ const CopyButton = ({
className?: string;
}) => {
const [copied, setCopied] = useState(false);
-
const handleCopy = useCallback(() => {
navigator.clipboard.writeText(text);
setCopied(true);
@@ -244,49 +256,56 @@ const CopyButton = ({
return (
{copied ? (
- <>
-
- Copied!
- >
+
) : (
- <>
-
- Copy
- >
+
)}
);
};
-const FadeInSection = ({
- children,
- delay = 0,
+function TerminalBlock({
+ command,
+ displayCommand,
+ label = "terminal",
}: {
- children: React.ReactNode;
- delay?: number;
-}) => {
- const [ref, inView] = useInView({
- triggerOnce: true,
- threshold: 0.1,
- rootMargin: "0px 0px -50px 0px",
- });
+ command: string;
+ displayCommand: string;
+ label?: string;
+}) {
return (
-
- {children}
-
+
+
+
+
+
+
+
+
+
+ {label}
+
+
+
+
+
+
+ $
+ {displayCommand}
+
+
+
);
-};
+}
export default function HomePage() {
const [stars, setStars] = useState
(null);
@@ -296,18 +315,12 @@ export default function HomePage() {
fetch("https://api.github.com/repos/jatinkrmalik/vocalinux")
.then((res) => res.json())
.then((data) => {
- if (data.stargazers_count) {
- setStars(data.stargazers_count);
- }
+ if (data.stargazers_count) setStars(data.stargazers_count);
})
- .catch(() => {
- // Fallback if API fails
- setStars(null);
- });
+ .catch(() => setStars(null));
}, []);
const navLinks = [
- { href: "#demo", label: "Demo" },
{ href: "#features", label: "Features" },
{ href: "/screenshots/", label: "Screenshots" },
{ href: "#install", label: "Install" },
@@ -323,36 +336,28 @@ export default function HomePage() {
} = installCommands;
return (
-
+
- {/* Header */}
-
-
-
-
- Vocalinux
-
- v0.14.2
+
+
+
+
+
+ Vocalinux
- {/* Desktop navigation */}
-
+
{navLinks.map((link) =>
link.href.startsWith("/") ? (
{link.label}
@@ -360,7 +365,7 @@ export default function HomePage() {
{link.label}
@@ -370,1000 +375,530 @@ export default function HomePage() {
href="https://github.com/jatinkrmalik/vocalinux"
target="_blank"
rel="noopener noreferrer"
- className="flex items-center gap-2 text-muted-foreground transition-colors hover:text-foreground"
+ className="inline-flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground"
>
-
- {stars !== null && (
-
- {stars.toLocaleString()}
-
- )}
+
+ {stars !== null ? stars.toLocaleString() : "GitHub"}
+
+ Install
+
- {/* Mobile navigation toggle */}
-
+
setMobileMenuOpen(!mobileMenuOpen)}
- className="p-2 text-foreground focus:outline-none"
+ type="button"
+ onClick={() => setMobileMenuOpen((v) => !v)}
+ className="inline-flex h-9 w-9 items-center justify-center rounded-md border border-border"
aria-label="Toggle menu"
+ aria-expanded={mobileMenuOpen}
>
- {mobileMenuOpen ? (
-
- ) : (
-
- )}
+ {mobileMenuOpen ? : }
- {/* Mobile menu */}
-
-
- {navLinks.map((link) =>
- link.href.startsWith("/") ? (
-
setMobileMenuOpen(false)}
- >
- {link.label}
-
- ) : (
-
setMobileMenuOpen(false)}
- >
- {link.label}
-
- ),
- )}
-
setMobileMenuOpen(false)}
- >
-
- GitHub
-
+ {mobileMenuOpen ? (
+
-
+ ) : null}
- {/* Hero Section */}
-
-
-
- {/* Full-width shifting wave gradient */}
-
-
-
-
-
- {/* Badge */}
-
-
-
- Beta Release: Try it now!
-
-
-
-
- Voice Dictation for Linux,{" "}
-
- Finally Done Right
-
-
-
-
- 100% offline voice dictation for Linux.
-
-
- Use toggle mode or push-to-talk and start speaking.
-
-
- {/* CTA Buttons */}
-
-
-
- {/* One-Click Install Box - Redesigned */}
-
-
- {/* Header */}
-
-
-
-
-
-
- Quick Install (Interactive)
-
-
- Guided installation with hardware detection
-
-
+ {/* Hero: asymmetric copy + real screenshot (from PR #546 language) */}
+
+
+
+
+
+ Offline on Linux
+
+
+ Dictate into any app. Keep the audio home.
+
+
+ System-wide voice typing with local models. X11 and Wayland. One
+ install command.
+
+
+
+ {[
+ ["Offline", "Local engines"],
+ ["Display", "X11 + Wayland"],
+ ["Default", "whisper.cpp"],
+ ["License", "GPL-3.0"],
+ ].map(([k, v]) => (
+
+
+ {k}
+
+ {v}
+ ))}
+
+
- {/* Command box */}
-
-
-
-
- $
- {interactiveInstallDisplayCommand}
-
-
-
-
- {/* Bottom info */}
-
-
- Compatible: Ubuntu,
- Fedora, Debian, Arch, openSUSE & more
-
-
-
-
- Guided setup
-
-
-
- ~1-2 min default
-
-
-
-
- {/* Tech stack info */}
-
-
-
- whisper.cpp {" "}
- default
-
-
-
- Vulkan GPU ready
-
-
-
- Interactive engine choice
-
-
-
-
-
- {/* Trust indicators */}
-
-
-
- 100% Offline
-
-
-
- No Telemetry
-
-
-
-
- X11 & Wayland
-
-
+
+
+
+
+
+
+ Live transcription overlay
+
+ More shots
+
+
+
+
+
- {/* Demo Section - Live Interactive Demo */}
+ {/* Full-bleed install strip */}
-
-
-
-
- Try a Speech-to-Text Preview in Your Browser
+
+
+
+
+ Install in one command
-
- This preview runs when your browser exposes SpeechRecognition.
- Vocalinux itself runs offline after install.
+
+ Interactive installer detects hardware, lets you pick an engine,
+ and wires the desktop app.
-
-
-
-
-
-
- {/* Key demo points */}
-
-
- {[
- {
- icon:
,
- title: "Flexible Shortcut Modes",
- description:
- "Use toggle mode (double-tap) or push-to-talk mode to dictate anywhere",
- href: "/shortcuts/",
- },
- {
- icon:
,
- title: "Real-time Transcription",
- description:
- "Compare engines and model choices for low-latency dictation",
- href: "/compare/",
- },
- {
- icon:
,
- title: "Audio Feedback",
- description:
- "Use sound effects to know when recording starts and stops",
- href: "/shortcuts/",
- },
- ].map((item, i) => (
-
-
- {item.icon}
-
-
-
- {item.title}
-
-
-
- {item.description}
-
-
-
- ))}
-
-
+
+ Ubuntu · Fedora · Debian · Arch · openSUSE
+
+
+
+
+
+ Then launch:{" "}
+ vocalinux
+
+
+ Compare engines
+
+
+ Distro notes
+
+
- {/* Features Section */}
-
-
-
-
-
- Offline Voice Dictation Features for Linux
-
-
- Finally, Linux users get the voice dictation experience they
- deserve. no compromises on privacy, no cloud dependencies, just
- pure productivity.
+ {/* Features bento + screenshots */}
+
+
+
+
+
Built for real Linux desktops
+
+ Privacy, injection reliability, and engines that match your
+ hardware, not a cloud dashboard with a mic icon.
-
-
-
- See screenshots of the app UI
+ App screenshots
-
-
}
- title="100% Offline & Private"
- description="All processing happens on your machine. Your voice data never leaves your computer. Complete privacy guaranteed."
- href="/offline/"
- />
-
}
- title="Universal App Support"
- description="Works everywhere: terminals, browsers, IDEs, office apps, and any text input field on your Linux system."
- href="/use-cases/"
- />
-
}
- title="Blazing Fast"
- description="whisper.cpp brings C++ optimized inference with Vulkan GPU support. Works with AMD, Intel, and NVIDIA GPUs!"
- href="/gpu-acceleration/"
- />
-
}
- title="Simple Activation"
- description="Choose toggle mode (double-tap) or push-to-talk mode (hold key). Simple, predictable control."
- href="/shortcuts/"
- />
-
}
- title="X11 & Wayland Support"
- description="Works seamlessly with both display servers. Modern Wayland and traditional X11, fully supported."
- href="/wayland/"
- />
-
}
- title="Fully Configurable"
- description="Adjust model size, language, activation mode, and voice command behavior. GUI settings panel or config file, your choice."
- href="/advanced-settings/"
- />
-
}
- title="Remote API Engine"
- description="Offload transcription to an OpenAI-compatible or whisper.cpp server while keeping the same Linux desktop workflow."
- href="/remote-api/"
- />
-
}
- title="Silero Voice Activity Detection"
- description="Neural VAD drops silence-only buffers for cleaner dictation, with a safe amplitude fallback when ONNX Runtime is unavailable."
- href="/voice-activity-detection/"
- />
-
}
- title="Desktop Reliability"
- description="Suspend/resume recovery, IBus runtime hardening, keyboard layout preservation, and non-ASCII text injection fallbacks."
- href="/desktop-reliability/"
- />
+ {/*
+ Paired layout: crop the tall settings shot to a fixed frame so it
+ matches a full feature rail (all six items), instead of three short
+ cards stranded beside a full dialog screenshot.
+ */}
+
+
+
+
+
+
+ Engine and model controls in the settings GUI
+
+
+
+
+ {featureRows.map((f, i) => (
+
0 ? "border-t border-border" : ""
+ }`}
+ >
+
+
+ {f.title}
+
+
+
+
+ {f.body}
+
+
+ {f.link}
+
+
+ ))}
+
- {/* Comparison highlight */}
-
-
-
-
-
- The Linux Voice Gap, Solved
-
-
- While macOS and Windows have had built-in voice dictation
- for years, Linux users have been left behind. Until now.
-
-
- {[
- "No more cloud services that compromise privacy",
- "No more janky solutions that only work in specific apps",
- "No more complicated setup processes",
- "Just install and start dictating",
- ].map((item, i) => (
-
-
- {item}
-
- ))}
-
-
-
-
-
-
-
-
-
Vocalinux
-
- Voice dictation, finally
-
-
-
-
-
-
- 0
-
-
- Cloud calls
-
-
-
-
-
-
-
-
+
+
+
+
+ Tray status while you work
+
+
+
+
+
+ The Linux voice gap, closed
+
+
+ macOS and Windows shipped system dictation years ago. Linux
+ users got fragments. Vocalinux is the full desktop path: tray,
+ hotkeys, injection, and local models.
+
+
+ {[
+ "No cloud dependency for local engines",
+ "Works across apps, not one editor",
+ "Guided install, not a research project",
+ "Open source you can audit",
+ ].map((item) => (
+
+
+ {item}
+
+ ))}
+
-
+
- {/* Installation Section */}
-
-
-
-
-
- How to Install Voice Dictation on Linux
-
-
- One command. That's all it takes.
-
-
-
-
-
-
-
- {/* Interactive install */}
-
-
-
-
-
-
-
- Recommended: interactive installer
-
-
- Detects your system, lets you choose an engine, and sets
- up the desktop app.
-
-
-
-