diff --git a/web/public/og-image.png b/web/public/og-image.png
new file mode 100644
index 0000000..2e578f3
Binary files /dev/null and b/web/public/og-image.png differ
diff --git a/web/public/robots.txt b/web/public/robots.txt
new file mode 100644
index 0000000..8568f6e
--- /dev/null
+++ b/web/public/robots.txt
@@ -0,0 +1,8 @@
+# Robots.txt for Vocalinux
+# https://vocalinux.com
+
+User-agent: *
+Allow: /
+
+# Sitemap location
+Sitemap: https://vocalinux.com/sitemap.xml
diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest
new file mode 100644
index 0000000..4c8d27b
--- /dev/null
+++ b/web/public/site.webmanifest
@@ -0,0 +1,26 @@
+{
+ "name": "Vocalinux",
+ "short_name": "Vocalinux",
+ "description": "Voice dictation for Linux, finally done right. 100% offline and privacy-focused.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#7c3aed",
+ "icons": [
+ {
+ "src": "/favicon-16x16.png",
+ "sizes": "16x16",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicon-32x32.png",
+ "sizes": "32x32",
+ "type": "image/png"
+ },
+ {
+ "src": "/apple-touch-icon.png",
+ "sizes": "180x180",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/web/public/sitemap.xml b/web/public/sitemap.xml
new file mode 100644
index 0000000..6023013
--- /dev/null
+++ b/web/public/sitemap.xml
@@ -0,0 +1,9 @@
+
+
+
+ https://vocalinux.com/
+ 2026-01-19
+ weekly
+ 1.0
+
+
diff --git a/web/public/vocalinux-microphone-off.svg b/web/public/vocalinux-microphone-off.svg
new file mode 100644
index 0000000..a5f8b2f
--- /dev/null
+++ b/web/public/vocalinux-microphone-off.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/web/public/vocalinux-microphone-process.svg b/web/public/vocalinux-microphone-process.svg
new file mode 100644
index 0000000..6fa2d08
--- /dev/null
+++ b/web/public/vocalinux-microphone-process.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/web/public/vocalinux-microphone.svg b/web/public/vocalinux-microphone.svg
new file mode 100644
index 0000000..a3f86d0
--- /dev/null
+++ b/web/public/vocalinux-microphone.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/web/public/vocalinux.svg b/web/public/vocalinux.svg
new file mode 100644
index 0000000..e6d7765
--- /dev/null
+++ b/web/public/vocalinux.svg
@@ -0,0 +1,5873 @@
+
\ No newline at end of file
diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx
index 0ace30c..cbf694c 100644
--- a/web/src/app/layout.tsx
+++ b/web/src/app/layout.tsx
@@ -3,44 +3,54 @@ import React from "react";
import { GeistSans } from "geist/font/sans";
import { type Metadata } from "next";
import { ThemeProvider } from "@/components/theme-provider";
-import { DevtoolsProvider } from 'creatr-devtools';
+
export const viewport = {
width: "device-width",
initialScale: 1,
- maximumScale: 1
+ maximumScale: 5,
+ themeColor: [
+ { media: "(prefers-color-scheme: light)", color: "#ffffff" },
+ { media: "(prefers-color-scheme: dark)", color: "#18181b" },
+ ],
};
+
export const metadata: Metadata = {
+ metadataBase: new URL("https://vocalinux.com"),
title: {
- default: "Vocalinux - Open-Source Voice Dictation for Linux",
+ default: "Vocalinux - Voice Dictation for Linux, Finally Done Right",
template: "%s | Vocalinux"
},
- description: "Open-source offline voice dictation for Linux using Whisper models. Privacy-focused with no cloud dependencies.",
+ description: "Free, open-source voice dictation for Linux. 100% offline with Whisper AI. Double-tap Ctrl to start. Works everywhere - X11 & Wayland. One-click install.",
applicationName: "Vocalinux",
- keywords: ["voice dictation", "linux", "speech recognition", "whisper", "offline", "privacy", "x11", "wayland", "open-source"],
- authors: [{
- name: "Vocalinux Team"
- }],
- creator: "Vocalinux Team",
- publisher: "Vocalinux Team",
+ keywords: [
+ "voice dictation linux",
+ "speech to text linux",
+ "linux voice typing",
+ "whisper linux",
+ "vosk linux",
+ "offline voice dictation",
+ "privacy voice recognition",
+ "speech recognition linux",
+ "dictation software ubuntu",
+ "voice typing fedora",
+ "wayland voice dictation",
+ "x11 speech to text",
+ "open source dictation",
+ "free speech recognition",
+ "linux accessibility",
+ "hands free typing linux",
+ "voice commands linux",
+ "GTK voice dictation"
+ ],
+ authors: [{ name: "Jatin K Malik", url: "https://github.com/jatinkrmalik" }],
+ creator: "Jatin K Malik",
+ publisher: "Vocalinux",
icons: {
- icon: [{
- url: "/favicon-16x16.png",
- sizes: "16x16",
- type: "image/png"
- }, {
- url: "/favicon-32x32.png",
- sizes: "32x32",
- type: "image/png"
- }, {
- url: "/favicon.ico",
- sizes: "48x48",
- type: "image/x-icon"
- }],
- apple: [{
- url: "/apple-touch-icon.png",
- sizes: "180x180",
- type: "image/png"
- }]
+ icon: [
+ { url: "/vocalinux.svg", type: "image/svg+xml" },
+ ],
+ apple: [{ url: "/vocalinux.svg", type: "image/svg+xml" }],
+ shortcut: "/vocalinux.svg"
},
manifest: "/site.webmanifest",
appleWebApp: {
@@ -54,34 +64,91 @@ export const metadata: Metadata = {
openGraph: {
type: "website",
locale: "en_US",
- url: "https://github.com/jatinkrmalik/vocalinux",
+ url: "https://vocalinux.com",
siteName: "Vocalinux",
- title: "Vocalinux - Open-Source Voice Dictation for Linux",
- description: "Open-source offline voice dictation for Linux using Whisper models. Works with X11 and Wayland.",
+ title: "Vocalinux - Voice Dictation for Linux, Finally Done Right",
+ description: "Free, open-source voice dictation for Linux. 100% offline & private with Whisper AI and VOSK. Double-tap Ctrl to start dictating in any app.",
images: [{
- url: "https://picsum.photos/200",
- width: 1280,
- height: 640,
- alt: "Vocalinux Open-Source Voice Dictation"
+ url: "/og-image.png",
+ width: 1200,
+ height: 630,
+ alt: "Vocalinux - Voice Dictation for Linux"
}]
},
twitter: {
card: "summary_large_image",
- title: "Vocalinux - Open-Source Voice Dictation for Linux",
- description: "Open-source offline voice dictation for Linux using Whisper models. Works with X11 and Wayland.",
- images: ["https://picsum.photos/200"]
- }
+ title: "Vocalinux - Voice Dictation for Linux, Finally Done Right",
+ description: "Free, open-source voice dictation for Linux. 100% offline & private. Double-tap Ctrl to start dictating in any app.",
+ images: ["/og-image.png"],
+ creator: "@jatinkrmalik"
+ },
+ robots: {
+ index: true,
+ follow: true,
+ googleBot: {
+ index: true,
+ follow: true,
+ "max-video-preview": -1,
+ "max-image-preview": "large",
+ "max-snippet": -1,
+ },
+ },
+ alternates: {
+ canonical: "https://vocalinux.com",
+ },
+ category: "Technology",
};
export default function RootLayout({
children
}: Readonly<{
children: React.ReactNode;
}>) {
- return
+ const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ "name": "Vocalinux",
+ "applicationCategory": "UtilitiesApplication",
+ "operatingSystem": "Linux",
+ "offers": {
+ "@type": "Offer",
+ "price": "0",
+ "priceCurrency": "USD"
+ },
+ "description": "Free, open-source voice dictation for Linux. 100% offline with Whisper AI and VOSK. Works with X11 and Wayland.",
+ "softwareVersion": "0.2.0-alpha",
+ "author": {
+ "@type": "Person",
+ "name": "Jatin K Malik",
+ "url": "https://github.com/jatinkrmalik"
+ },
+ "url": "https://vocalinux.com",
+ "downloadUrl": "https://github.com/jatinkrmalik/vocalinux",
+ "screenshot": "https://vocalinux.com/og-image.png",
+ "featureList": [
+ "100% offline voice recognition",
+ "Privacy-focused - no cloud dependencies",
+ "Works with all Linux applications",
+ "X11 and Wayland support",
+ "Double-tap Ctrl activation",
+ "Whisper AI and VOSK engines",
+ "Voice commands for punctuation",
+ "System tray integration"
+ ]
+ };
+
+ return (
+
+
+
+
{children}
- ;
-}
\ No newline at end of file
+
+ );
+}
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx
index 12728fd..fbc9d0e 100644
--- a/web/src/app/page.tsx
+++ b/web/src/app/page.tsx
@@ -1,951 +1,1067 @@
"use client";
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useCallback } from "react";
import { motion } from "framer-motion";
-import { useDoublePress } from "@/hooks/use-double-press";
-import { DictationOverlay } from "@/components/dictation-overlay";
-import { Mic, Terminal, Lock, Zap, Laptop, Keyboard, Settings, Code, Github, BookOpen, MessageSquare, Edit, Star, Download, ExternalLink, ChevronRight, CheckCircle2, Menu, X } from "lucide-react";
+import Image from "next/image";
+import { LiveDemo } from "@/components/live-demo";
+import {
+ Mic,
+ Terminal,
+ Lock,
+ Zap,
+ Laptop,
+ Keyboard,
+ Settings,
+ Code,
+ Github,
+ Edit,
+ Star,
+ Download,
+ ChevronRight,
+ CheckCircle2,
+ Menu,
+ X,
+ Copy,
+ Check,
+ Play,
+ Shield,
+ Globe,
+ Cpu,
+ Volume2,
+ Sparkles,
+ Heart,
+ ExternalLink,
+} from "lucide-react";
import { ThemeToggle } from "@/components/theme-toggle";
-import { VocalinuxLogo } from "@/components/icons";
import SyntaxHighlighter from "react-syntax-highlighter";
import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs";
import { useInView } from "react-intersection-observer";
-const installCommand = `# Install Vocalinux
-git clone https://github.com/jatinkrmalik/vocalinux.git
-cd vocalinux
-pip install -r requirements.txt
-python cli.py install`;
+
+// The one-liner install command (split into three lines for display)
+const oneClickInstallCommand = `curl \\
+ -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \\
+ | bash`;
+
+const oneClickInstallNoWhisper = `curl \\
+ -fsSL https://raw.githubusercontent.com/jatinkrmalik/vocalinux/main/install.sh \\
+ | bash -s -- --no-whisper`;
+
const FeatureCard = ({
icon,
title,
- description
-}) => {
- const [ref, inView] = useInView({
- triggerOnce: true,
- threshold: 0.1
- });
- return
-
- {description}
- ;
-};
-const CopyToClipboard = ({
- text
-}) => {
- const [copied, setCopied] = useState(false);
- const handleCopy = () => {
- navigator.clipboard.writeText(text);
- setCopied(true);
- setTimeout(() => setCopied(false), 2000);
- };
- return ;
-};
-const FadeInSection = ({
- children,
- delay = 0
+ description,
+}: {
+ icon: React.ReactNode;
+ title: string;
+ description: string;
}) => {
const [ref, inView] = useInView({
triggerOnce: true,
threshold: 0.1,
- rootMargin: "0px 0px -50px 0px"
});
- return
- {children}
- ;
+ return (
+
+
+ {description}
+
+ );
};
-export default function HomePage() {
- const [stars, setStars] = useState(0);
- const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
- const {
- isActive: isDictating,
- resetActive: resetDictation
- } = useDoublePress({
- key: "Control",
- onDoublePress: () => {
- // When double Ctrl press is detected, the overlay will show automatically
- console.log("Double Ctrl press detected!");
- }
+
+const CopyButton = ({ text, className = "" }: { text: string; className?: string }) => {
+ const [copied, setCopied] = useState(false);
+
+ const handleCopy = useCallback(() => {
+ navigator.clipboard.writeText(text);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ }, [text]);
+
+ return (
+
+ );
+};
+
+const FadeInSection = ({
+ children,
+ delay = 0,
+}: {
+ children: React.ReactNode;
+ delay?: number;
+}) => {
+ const [ref, inView] = useInView({
+ triggerOnce: true,
+ threshold: 0.1,
+ rootMargin: "0px 0px -50px 0px",
});
+ return (
+
+ {children}
+
+ );
+};
+
+export default function HomePage() {
+ const [stars, setStars] = useState(null);
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
+
useEffect(() => {
- // Set a placeholder value for stars
- setStars(1247);
+ // Fetch actual GitHub stars
+ fetch("https://api.github.com/repos/jatinkrmalik/vocalinux")
+ .then((res) => res.json())
+ .then((data) => {
+ if (data.stargazers_count) {
+ setStars(data.stargazers_count);
+ }
+ })
+ .catch(() => {
+ // Fallback if API fails
+ setStars(null);
+ });
}, []);
- return
- {/* Dictation Overlay */}
-
- {/* Header with Theme Toggle */}
-
-