Files
voculinux/web/src/app/layout.tsx
T
xavierk c9be45d3c3 fix(web): link the fork's own source host and drop the upstream star count
The header badge fetched the star count of VocaHQ/vocalinux at build time
and labelled it as Voculinux's. The fetch and the count are gone; the
header, footer and social "source" links now go to the fork repository at
git.bongbetic.com/xavierk/voculinux, as do the issue links, the docs
anchors, the home page JSON-LD and the xbps release card.

Upstream GitHub stays only where it is the real artefact or provenance and
is labelled as such: the install script, the AppImage release card, the
upstream card and the changelog release links. The changelog now says its
entries are upstream history, the open-source page no longer claims
VocaHQ membership or an active GitHub community, and the organization
JSON-LD drops the upstream author as founder. DESIGN.md and PRODUCT.md
follow.
2026-11-06 18:22:17 +05:30

193 lines
5.3 KiB
TypeScript

import "@/styles/globals.css";
import React from "react";
import { type Metadata } from "next";
import Script from "next/script";
import {
absoluteUrl,
DEFAULT_OG_IMAGE_ALT,
DEFAULT_OG_IMAGE_PATH,
SOURCE_REPO_URL,
SITE_NAME,
SITE_URL,
TWITTER_HANDLE,
} from "@/lib/seo";
export const viewport = {
width: "device-width",
initialScale: 1,
maximumScale: 5,
themeColor: "#f4f1e8",
};
export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: {
default: "Voculinux: Offline Speech to Text & Voice Dictation for Linux",
template: "%s | Voculinux",
},
description:
"Free, open-source speech to text for Linux. Offline voice dictation and voice typing in any app with whisper.cpp, VOSK or Parakeet, on X11 and Wayland.",
applicationName: SITE_NAME,
keywords: [
"voice dictation linux",
"speech to text linux",
"offline voice dictation",
"linux voice typing",
"whisper.cpp linux",
"vosk linux",
"remote api speech recognition",
"silero vad linux",
"whisper.cpp advanced settings",
"ibus voice dictation",
"wayland voice dictation",
"x11 speech recognition",
"open source dictation software",
"voice typing ubuntu",
"voice typing fedora",
"voice typing arch linux",
],
authors: [{ name: "Jatin K Malik", url: "https://github.com/jatinkrmalik" }],
creator: "Jatin K Malik",
publisher: SITE_NAME,
icons: {
icon: [
{ url: "/brand/voculinux-mark-circle.svg", type: "image/svg+xml" },
{ url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" },
{ url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" },
{ url: "/favicon-96x96.png", sizes: "96x96", type: "image/png" },
{ url: "/voculinux.png", type: "image/png", sizes: "512x512" },
],
apple: [
{ url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" },
],
shortcut: "/favicon-32x32.png",
},
manifest: "/site.webmanifest",
appleWebApp: {
capable: true,
statusBarStyle: "default",
title: SITE_NAME,
},
formatDetection: {
telephone: false,
email: false,
address: false,
},
referrer: "strict-origin-when-cross-origin",
openGraph: {
type: "website",
locale: "en_US",
url: absoluteUrl("/"),
siteName: SITE_NAME,
title: "Voculinux: Offline Speech to Text & Voice Dictation for Linux",
description:
"Voice dictation for Linux with local engines or an optional Remote API. Install in minutes and dictate in any app on Ubuntu, Fedora, Arch, X11, or Wayland.",
images: [
{
url: DEFAULT_OG_IMAGE_PATH,
width: 1200,
height: 630,
alt: DEFAULT_OG_IMAGE_ALT,
},
],
},
twitter: {
card: "summary_large_image",
title: "Voculinux: Offline Speech to Text & Voice Dictation for Linux",
description:
"Speech-to-text for Linux with whisper.cpp and VOSK. Local engines by default, optional Remote API, open source.",
images: [DEFAULT_OG_IMAGE_PATH],
creator: TWITTER_HANDLE,
site: TWITTER_HANDLE,
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
alternates: {
canonical: absoluteUrl("/"),
languages: {
"en-US": absoluteUrl("/"),
},
},
category: "Technology",
};
const organizationJsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
"@id": `${absoluteUrl("/")}#organization`,
name: SITE_NAME,
url: absoluteUrl("/"),
logo: absoluteUrl("/voculinux.png"),
description: "Open-source, offline voice dictation software for Linux.",
sameAs: [SOURCE_REPO_URL, "https://bongbetic.com"],
};
const webSiteJsonLd = {
"@context": "https://schema.org",
"@type": "WebSite",
"@id": `${absoluteUrl("/")}#website`,
name: SITE_NAME,
url: absoluteUrl("/"),
inLanguage: "en-US",
description:
"Voculinux provides offline speech-to-text and voice dictation for Linux desktops.",
publisher: {
"@id": `${absoluteUrl("/")}#organization`,
},
potentialAction: {
"@type": "SearchAction",
target: {
"@type": "EntryPoint",
urlTemplate: `${SOURCE_REPO_URL}/issues?q={search_term_string}`,
},
"query-input": {
"@type": "PropertyValueSpecification",
valueRequired: true,
valueName: "search_term_string",
},
},
};
const siteWideJsonLd = [organizationJsonLd, webSiteJsonLd];
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" className="scroll-smooth" suppressHydrationWarning>
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(siteWideJsonLd) }}
/>
</head>
<body>
<Script
src="https://www.googletagmanager.com/gtag/js?id=G-7NBBNJNNQ7"
strategy="lazyOnload"
/>
<Script id="google-analytics" strategy="lazyOnload">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-7NBBNJNNQ7');
`}
</Script>
{children}
</body>
</html>
);
}