From 04c8645e2a55a096b4d9815a6da750bfb6d173ee Mon Sep 17 00:00:00 2001 From: Jatin K Malik Date: Sun, 5 Apr 2026 17:25:02 -0700 Subject: [PATCH] feat(web): add v0.10.1 updates and 5 new SEO pages (#383) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(web): add v0.10.1 updates and 5 new SEO pages ## New SEO Pages (5) - /vs-nerd-dictation/ - Vocalinux vs Nerd Dictation comparison - /whisper-model-guide/ - Whisper model sizes explained - /voice-typing-vscode/ - How to dictate in VS Code on Linux - /writers/ - Voice dictation for writers on Linux - /gnome-kde/ - Voice typing on GNOME vs KDE Plasma ## Existing Page Updates - homepage: Update JSON-LD featureList with v0.10.1 features, add new FAQs, link new pages in footer - troubleshooting: Add suspend/resume recovery, tray resources, settings dialog fixes - shortcuts: Add sound effects toggle, left/right modifier distinction, PTT improvements - wayland: Add keyboard layout preservation, clipboard fallback note - compare: Add engine switching safety notes - faq: Add suspend/resume and keyboard layout FAQs - alternatives: Link to new Nerd Dictation comparison - seo-subpage-shell: Add new pages to navigation - sitemap: Add 5 new URLs Fixes #257 (SEO expansion) * fix(web): add theme toggle to subpages, fix dark mode button contrast, simplify footer nav - Add light/dark theme toggle to SeoSubpageShell header (all subpages) - Fix duplicate useState/useEffect imports causing build error - Fix unclosed div in header markup - Add dark:text-black to CTA buttons across all 15 subpages for contrast on bright green bg - Add dark:text-black to footer CTA button in SeoSubpageShell - Simplify subpage footer to mainNavCategories (5 condensed categories) instead of full navCategories * fix(web): fix list items stacking, add all new pages to nav, restructure footer - Fix inline-flex → flex on all li elements across 13 pages so bullet points always stack on separate lines instead of running together horizontally - Add all 5 new SEO pages to subpage nav mainNavCategories (Whisper Models, For Writers, VS Code, GNOME vs KDE under Features/Use Cases; new Compare dropdown with vs Nerd Dictation, Alternatives, Offline, Open Source) - Add /vs-nerd-dictation/ to homepage footer Learn column - Restructure homepage footer from 2 crowded columns into 4 lean categorised columns (Get Started, Learn, Use Cases, Support) — responsive 2-col on mobile/tablet, 5-col on desktop --- web/public/sitemap.xml | 30 +++ web/src/app/alternatives/page.tsx | 27 ++- web/src/app/autostart/page.tsx | 2 +- web/src/app/changelog/page.tsx | 8 +- web/src/app/compare/page.tsx | 14 +- web/src/app/faq/page.tsx | 11 +- web/src/app/for-developers/page.tsx | 2 +- web/src/app/gnome-kde/page.tsx | 259 +++++++++++++++++++++ web/src/app/gpu-acceleration/page.tsx | 4 +- web/src/app/install/[distro]/page.tsx | 8 +- web/src/app/languages/page.tsx | 14 +- web/src/app/offline/page.tsx | 16 +- web/src/app/open-source/page.tsx | 4 +- web/src/app/page.tsx | 191 ++++++---------- web/src/app/privacy/page.tsx | 16 +- web/src/app/rsi-prevention/page.tsx | 18 +- web/src/app/shortcuts/page.tsx | 36 ++- web/src/app/troubleshooting/page.tsx | 30 ++- web/src/app/use-cases/page.tsx | 4 +- web/src/app/voice-typing-vscode/page.tsx | 273 ++++++++++++++++++++++ web/src/app/vs-nerd-dictation/page.tsx | 218 ++++++++++++++++++ web/src/app/wayland/page.tsx | 27 ++- web/src/app/whisper-model-guide/page.tsx | 277 +++++++++++++++++++++++ web/src/app/writers/page.tsx | 262 +++++++++++++++++++++ web/src/components/seo-subpage-shell.tsx | 121 ++++++++-- 25 files changed, 1665 insertions(+), 207 deletions(-) create mode 100644 web/src/app/gnome-kde/page.tsx create mode 100644 web/src/app/voice-typing-vscode/page.tsx create mode 100644 web/src/app/vs-nerd-dictation/page.tsx create mode 100644 web/src/app/whisper-model-guide/page.tsx create mode 100644 web/src/app/writers/page.tsx diff --git a/web/public/sitemap.xml b/web/public/sitemap.xml index 2af5421..f69c849 100644 --- a/web/public/sitemap.xml +++ b/web/public/sitemap.xml @@ -127,4 +127,34 @@ monthly 0.8 + + https://vocalinux.com/vs-nerd-dictation/ + 2026-03-30 + monthly + 0.8 + + + https://vocalinux.com/whisper-model-guide/ + 2026-03-30 + monthly + 0.8 + + + https://vocalinux.com/voice-typing-vscode/ + 2026-03-30 + monthly + 0.8 + + + https://vocalinux.com/writers/ + 2026-03-30 + monthly + 0.8 + + + https://vocalinux.com/gnome-kde/ + 2026-03-30 + monthly + 0.8 + diff --git a/web/src/app/alternatives/page.tsx b/web/src/app/alternatives/page.tsx index 12651de..94ec314 100644 --- a/web/src/app/alternatives/page.tsx +++ b/web/src/app/alternatives/page.tsx @@ -1,6 +1,6 @@ import Link from "next/link"; import { type Metadata } from "next"; -import { CheckCircle2, ChevronRight, Cloud, DollarSign, Lock, Server, Shield, XCircle, Zap } from "lucide-react"; +import { CheckCircle2, ChevronRight, DollarSign, Lock, Server, Shield, XCircle, Zap } from "lucide-react"; import { SeoSubpageShell } from "@/components/seo-subpage-shell"; import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; @@ -232,6 +232,29 @@ export default function AlternativesPage() { ))} +
+

Read the Nerd Dictation comparison

+

+ Want a direct Linux-focused breakdown of CLI vs GUI workflows, Wayland behavior, and GPU + support? Read our dedicated page. +

+
+ + Read the Nerd Dictation comparison + + + + Engine comparison + +
+
+

The Bottom Line

@@ -241,7 +264,7 @@ export default function AlternativesPage() {

Install Vocalinux diff --git a/web/src/app/autostart/page.tsx b/web/src/app/autostart/page.tsx index 674b799..cb8eba2 100644 --- a/web/src/app/autostart/page.tsx +++ b/web/src/app/autostart/page.tsx @@ -287,7 +287,7 @@ export default function AutostartPage() {
Install Now diff --git a/web/src/app/changelog/page.tsx b/web/src/app/changelog/page.tsx index c4219e8..2174c01 100644 --- a/web/src/app/changelog/page.tsx +++ b/web/src/app/changelog/page.tsx @@ -273,7 +273,7 @@ export default function ChangelogPage() {
    {release.highlights.map((highlight) => ( -
  • +
  • {highlight}
  • @@ -300,15 +300,15 @@ export default function ChangelogPage() {

    Stay Updated

      -
    • +
    • Watch the repository on GitHub for release notifications
    • -
    • +
    • Re-run the installer to update to the latest version
    • -
    • +
    • Check the{" "} diff --git a/web/src/app/compare/page.tsx b/web/src/app/compare/page.tsx index 98aa054..c5f8e07 100644 --- a/web/src/app/compare/page.tsx +++ b/web/src/app/compare/page.tsx @@ -60,7 +60,7 @@ export default function CompareEnginesPage() { headline: "Whisper.cpp vs Whisper vs VOSK for Linux Voice Dictation", description: "Technical comparison of speech recognition engines for offline Linux voice typing.", - dateModified: "2026-02-12", + dateModified: "2026-03-30", author: { "@type": "Person", name: "Jatin K Malik", @@ -138,12 +138,22 @@ export default function CompareEnginesPage() {
    +
    +

    Switching Between Engines

    +

    + You can switch between whisper.cpp, Whisper, and VOSK at any time from Settings. v0.10.1+ + safely stops recognition before switching to prevent segfaults. Each engine has its own + model files. +

    +
    +

    When to pick whisper.cpp

    Choose whisper.cpp when you want the best speed-to-accuracy ratio and broad hardware support. - It is the default in Vocalinux for a reason. + It is the default in Vocalinux for a reason. Safe engine switching - v0.10.1+ stops + recognition before switching to prevent crashes.

    diff --git a/web/src/app/faq/page.tsx b/web/src/app/faq/page.tsx index 4d32a8d..9a00c15 100644 --- a/web/src/app/faq/page.tsx +++ b/web/src/app/faq/page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { type Metadata } from "next"; import { BookOpen, ChevronRight, CircleHelp, Cpu, Laptop, Lock, Mic, Volume2, Zap } from "lucide-react"; import { SeoSubpageShell } from "@/components/seo-subpage-shell"; -import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; +import { buildPageMetadata } from "@/lib/seo"; const faqCategories = [ { @@ -75,6 +75,14 @@ const faqCategories = [ q: "Does Vocalinux work with Wayland?", a: "Yes. Vocalinux supports both X11 and Wayland, including IBus-based flows on Wayland with improved active-method detection for more reliable text injection.", }, + { + q: "What happens when I close my laptop lid?", + a: "Vocalinux v0.10.1+ automatically recovers speech recognition after system suspend/resume. The app detects when your system wakes up and restarts the recognition engine and keyboard shortcuts. No manual restart needed - just start dictating as usual.", + }, + { + q: "Does Vocalinux preserve my keyboard layout?", + a: "Yes! v0.10.1+ preserves your XKB keyboard layout when activating IBus for text injection. Unlike other tools that switch to US layout, Vocalinux keeps your configured layout so you can dictate without unexpected character changes.", + }, { q: "Can I use voice commands?", a: "Yes. Vocalinux supports commands like 'new line', 'delete that', 'select all', and more. Voice commands are optional and can be enabled or disabled in Settings.", @@ -119,6 +127,7 @@ export default function FaqPage() { const faqJsonLd = { "@context": "https://schema.org", "@type": "FAQPage", + dateModified: "2026-03-30", mainEntity: faqCategories.flatMap((cat) => cat.questions.map((q) => ({ "@type": "Question", diff --git a/web/src/app/for-developers/page.tsx b/web/src/app/for-developers/page.tsx index 2025d15..0720de0 100644 --- a/web/src/app/for-developers/page.tsx +++ b/web/src/app/for-developers/page.tsx @@ -282,7 +282,7 @@ export default function ForDevelopersPage() {
    Install Now diff --git a/web/src/app/gnome-kde/page.tsx b/web/src/app/gnome-kde/page.tsx new file mode 100644 index 0000000..e1e5234 --- /dev/null +++ b/web/src/app/gnome-kde/page.tsx @@ -0,0 +1,259 @@ +import Link from "next/link"; +import { type Metadata } from "next"; +import { + CheckCircle2, + ChevronRight, + Keyboard, + Monitor, + Settings2, + Waypoints, + Wrench, +} from "lucide-react"; +import { SeoSubpageShell } from "@/components/seo-subpage-shell"; +import { absoluteUrl, buildPageMetadata } from "@/lib/seo"; + +const comparisonRows = [ + { + feature: "Default display stack", + gnome: "Wayland by default on most modern GNOME distributions", + kde: "Wayland or X11, with X11 still common in some setups", + icon: Monitor, + }, + { + feature: "Text injection approach", + gnome: "IBus-first for native Wayland dictation", + kde: "IBus-first on Wayland, with xdotool fallback on X11", + icon: Keyboard, + }, + { + feature: "Input method setup", + gnome: "Typically straightforward with existing IBus defaults", + kde: "May need explicit IBus selection in System Settings", + icon: Settings2, + }, + { + feature: "Tray indicator behavior", + gnome: "Usually needs AppIndicator extension for tray visibility", + kde: "Native system tray support out of the box", + icon: Waypoints, + }, + { + feature: "Troubleshooting profile", + gnome: "Extension + IBus engine activation checks", + kde: "Session type checks (X11 vs Wayland) + input method routing", + icon: Wrench, + }, +]; + +export const metadata: Metadata = buildPageMetadata({ + title: "Voice Typing on GNOME vs KDE Plasma: Linux Desktop Comparison", + description: + "Compare voice dictation on GNOME vs KDE Plasma. How desktop environment affects text injection, IBus setup, and Wayland compatibility for Linux voice typing.", + path: "/gnome-kde", + keywords: [ + "voice typing GNOME linux", + "voice dictation KDE plasma", + "linux desktop voice recognition comparison", + "GNOME vs KDE voice input", + ], +}); + +export default function GnomeVsKdePage() { + const articleJsonLd = { + "@context": "https://schema.org", + "@type": "Article", + headline: "Voice Typing on GNOME vs KDE Plasma: Linux Desktop Comparison", + description: + "Compare voice dictation on GNOME vs KDE Plasma. How desktop environment affects text injection, IBus setup, and Wayland compatibility for Linux voice typing.", + dateModified: "2026-03-30", + author: { + "@type": "Person", + name: "Jatin K Malik", + url: "https://github.com/jatinkrmalik", + }, + publisher: { + "@type": "Organization", + name: "Vocalinux", + logo: { + "@type": "ImageObject", + url: absoluteUrl("/vocalinux.png"), + }, + }, + mainEntityOfPage: absoluteUrl("/gnome-kde"), + }; + + return ( + +