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.
193 lines
5.3 KiB
TypeScript
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>
|
|
);
|
|
}
|