diff --git a/README.md b/README.md index c648b45..a57f65d 100644 --- a/README.md +++ b/README.md @@ -83,15 +83,17 @@ No internet required. No data leaves your machine. Just speak and type. ## 📸 Screenshots -Here are some screenshots showcasing Vocalinux in action: +Vocalinux in action, plus the settings tabs from v0.14.0-beta. Full gallery on the [website screenshots page](https://vocalinux.com/screenshots/). + +### Product - - @@ -99,17 +101,44 @@ Here are some screenshots showcasing Vocalinux in action: +
+ Transcription in Action
Real-time voice-to-text transcription
+ System Tray
System tray with listening indicator
About View
- About view with version info + About dialog with version info
Log Viewer
Log viewer for debugging
+ +### Settings + + - + + + + + + +
- Features Overview
- Overview of key features and configuration options with annotations +
+ Speech Engine settings
+ Speech Engine +
+ Recognition settings
+ Recognition +
+ Audio settings
+ Audio +
+ Shortcuts and hotkeys
+ Shortcuts & Hotkeys +
+ General settings
+ General +
+ Advanced tuning and settings
+ Advanced
diff --git a/resources/screenshots/01-settings-dialog.png b/resources/screenshots/01-settings-dialog.png deleted file mode 100644 index 66daf66..0000000 Binary files a/resources/screenshots/01-settings-dialog.png and /dev/null differ diff --git a/resources/screenshots/04-features-overview.png b/resources/screenshots/04-features-overview.png deleted file mode 100644 index fc631d2..0000000 Binary files a/resources/screenshots/04-features-overview.png and /dev/null differ diff --git a/resources/screenshots/05-about-view.png b/resources/screenshots/05-about-view.png index f77c21d..e2531f5 100644 Binary files a/resources/screenshots/05-about-view.png and b/resources/screenshots/05-about-view.png differ diff --git a/resources/screenshots/settings-advanced.png b/resources/screenshots/settings-advanced.png new file mode 100644 index 0000000..cfee7f2 Binary files /dev/null and b/resources/screenshots/settings-advanced.png differ diff --git a/resources/screenshots/settings-audio.png b/resources/screenshots/settings-audio.png new file mode 100644 index 0000000..8329c85 Binary files /dev/null and b/resources/screenshots/settings-audio.png differ diff --git a/resources/screenshots/settings-general.png b/resources/screenshots/settings-general.png new file mode 100644 index 0000000..07d4bee Binary files /dev/null and b/resources/screenshots/settings-general.png differ diff --git a/resources/screenshots/settings-recognition.png b/resources/screenshots/settings-recognition.png new file mode 100644 index 0000000..95c3038 Binary files /dev/null and b/resources/screenshots/settings-recognition.png differ diff --git a/resources/screenshots/settings-shortcuts.png b/resources/screenshots/settings-shortcuts.png new file mode 100644 index 0000000..7bf3eb1 Binary files /dev/null and b/resources/screenshots/settings-shortcuts.png differ diff --git a/resources/screenshots/settings-speech-engine.png b/resources/screenshots/settings-speech-engine.png new file mode 100644 index 0000000..2605ec0 Binary files /dev/null and b/resources/screenshots/settings-speech-engine.png differ diff --git a/web/public/screenshots/00-transcription.png b/web/public/screenshots/00-transcription.png new file mode 100644 index 0000000..9f53501 Binary files /dev/null and b/web/public/screenshots/00-transcription.png differ diff --git a/web/public/screenshots/02-system-tray.png b/web/public/screenshots/02-system-tray.png new file mode 100644 index 0000000..12dcdda Binary files /dev/null and b/web/public/screenshots/02-system-tray.png differ diff --git a/web/public/screenshots/03-log-viewer.png b/web/public/screenshots/03-log-viewer.png new file mode 100644 index 0000000..85e95c7 Binary files /dev/null and b/web/public/screenshots/03-log-viewer.png differ diff --git a/web/public/screenshots/05-about-view.png b/web/public/screenshots/05-about-view.png new file mode 100644 index 0000000..e2531f5 Binary files /dev/null and b/web/public/screenshots/05-about-view.png differ diff --git a/web/public/screenshots/settings-advanced.png b/web/public/screenshots/settings-advanced.png new file mode 100644 index 0000000..cfee7f2 Binary files /dev/null and b/web/public/screenshots/settings-advanced.png differ diff --git a/web/public/screenshots/settings-audio.png b/web/public/screenshots/settings-audio.png new file mode 100644 index 0000000..8329c85 Binary files /dev/null and b/web/public/screenshots/settings-audio.png differ diff --git a/web/public/screenshots/settings-general.png b/web/public/screenshots/settings-general.png new file mode 100644 index 0000000..07d4bee Binary files /dev/null and b/web/public/screenshots/settings-general.png differ diff --git a/web/public/screenshots/settings-recognition.png b/web/public/screenshots/settings-recognition.png new file mode 100644 index 0000000..95c3038 Binary files /dev/null and b/web/public/screenshots/settings-recognition.png differ diff --git a/web/public/screenshots/settings-shortcuts.png b/web/public/screenshots/settings-shortcuts.png new file mode 100644 index 0000000..7bf3eb1 Binary files /dev/null and b/web/public/screenshots/settings-shortcuts.png differ diff --git a/web/public/screenshots/settings-speech-engine.png b/web/public/screenshots/settings-speech-engine.png new file mode 100644 index 0000000..2605ec0 Binary files /dev/null and b/web/public/screenshots/settings-speech-engine.png differ diff --git a/web/public/sitemap.xml b/web/public/sitemap.xml index 48e5dde..7eda680 100644 --- a/web/public/sitemap.xml +++ b/web/public/sitemap.xml @@ -42,6 +42,12 @@ weekly 0.7 + + https://vocalinux.com/screenshots/ + 2026-07-14 + monthly + 0.8 + https://vocalinux.com/faq/ 2026-06-11 diff --git a/web/src/app/__tests__/screenshots-page.test.ts b/web/src/app/__tests__/screenshots-page.test.ts new file mode 100644 index 0000000..e53f4a8 --- /dev/null +++ b/web/src/app/__tests__/screenshots-page.test.ts @@ -0,0 +1,88 @@ +import fs from "fs"; +import path from "path"; + +/** + * Structural checks for the screenshots gallery: page source, public assets, + * nav discoverability, and homepage link. Exercises the real shipped files + * under web/ rather than re-implementing gallery data in the test. + */ +describe("Screenshots page and assets", () => { + const webRoot = process.cwd(); + const pagePath = path.join(webRoot, "src/app/screenshots/page.tsx"); + const shellPath = path.join(webRoot, "src/components/seo-subpage-shell.tsx"); + const homePath = path.join(webRoot, "src/app/page.tsx"); + const publicScreenshotsDir = path.join(webRoot, "public/screenshots"); + + const expectedAssets = [ + "00-transcription.png", + "02-system-tray.png", + "03-log-viewer.png", + "05-about-view.png", + "settings-speech-engine.png", + "settings-recognition.png", + "settings-audio.png", + "settings-shortcuts.png", + "settings-general.png", + "settings-advanced.png", + ]; + + let pageSource: string; + let shellSource: string; + let homeSource: string; + + beforeAll(() => { + pageSource = fs.readFileSync(pagePath, "utf-8"); + shellSource = fs.readFileSync(shellPath, "utf-8"); + homeSource = fs.readFileSync(homePath, "utf-8"); + }); + + it("ships a dedicated /screenshots page module with lightbox gallery", () => { + expect(fs.existsSync(pagePath)).toBe(true); + expect(pageSource).toMatch(/export default function ScreenshotsPage/); + expect(pageSource).toContain('path: "/screenshots"'); + expect(pageSource).toContain("Vocalinux Screenshots"); + expect(pageSource).toContain("ScreenshotGallery"); + const galleryPath = path.join( + webRoot, + "src/components/screenshot-gallery.tsx", + ); + expect(fs.existsSync(galleryPath)).toBe(true); + const gallerySource = fs.readFileSync(galleryPath, "utf-8"); + expect(gallerySource).toContain('role="dialog"'); + expect(gallerySource).toContain("aria-modal"); + expect(gallerySource).toContain("View larger"); + }); + + it("references every public screenshot asset from the page source", () => { + for (const file of expectedAssets) { + const assetPath = path.join(publicScreenshotsDir, file); + expect(fs.existsSync(assetPath)).toBe(true); + expect(fs.statSync(assetPath).size).toBeGreaterThan(1000); + expect(pageSource).toContain(`/screenshots/${file}`); + } + }); + + it("does not embed a full homepage gallery (link-only on home)", () => { + // Homepage should link to the gallery, not list every settings shot. + expect(homeSource).toContain('href: "/screenshots/"'); + expect(homeSource).toContain('href="/screenshots/"'); + expect(homeSource).not.toContain("/screenshots/settings-speech-engine.png"); + expect(homeSource).not.toContain("/screenshots/05-about-view.png"); + }); + + it("exposes Screenshots in the shared subpage shell nav", () => { + expect(shellSource).toContain('href: "/screenshots/"'); + expect(shellSource).toContain('label: "Screenshots"'); + }); + + it("includes captioned settings and product sections", () => { + expect(pageSource).toContain("Speech Engine"); + expect(pageSource).toContain("Recognition"); + expect(pageSource).toContain("Audio"); + expect(pageSource).toContain("Shortcuts"); + expect(pageSource).toContain("General"); + expect(pageSource).toContain("Advanced"); + expect(pageSource).toContain("Transcription in action"); + expect(pageSource).toContain("About"); + }); +}); diff --git a/web/src/app/__tests__/seo-assets.test.ts b/web/src/app/__tests__/seo-assets.test.ts index b3160c5..37e1462 100644 --- a/web/src/app/__tests__/seo-assets.test.ts +++ b/web/src/app/__tests__/seo-assets.test.ts @@ -37,6 +37,7 @@ describe("SEO Assets", () => { "https://vocalinux.com/voice-activity-detection/", "https://vocalinux.com/advanced-settings/", "https://vocalinux.com/desktop-reliability/", + "https://vocalinux.com/screenshots/", ]; expectedUrls.forEach((url) => { diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 2740986..aa9e26a 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -309,6 +309,7 @@ export default function HomePage() { const navLinks = [ { href: "#demo", label: "Demo" }, { href: "#features", label: "Features" }, + { href: "/screenshots/", label: "Screenshots" }, { href: "#install", label: "Install" }, { href: "#guides", label: "Guides" }, { href: "#faq", label: "FAQ" }, @@ -346,15 +347,25 @@ export default function HomePage() { {/* Desktop navigation */}
- {navLinks.map((link) => ( - - {link.label} - - ))} + {navLinks.map((link) => + link.href.startsWith("/") ? ( + + {link.label} + + ) : ( + + {link.label} + + ), + )}
- {navLinks.map((link) => ( - setMobileMenuOpen(false)} - > - {link.label} - - ))} + {navLinks.map((link) => + link.href.startsWith("/") ? ( + setMobileMenuOpen(false)} + > + {link.label} + + ) : ( + setMobileMenuOpen(false)} + > + {link.label} + + ), + )} +
+ + See screenshots of the app UI + + +
+
} @@ -1851,6 +1883,14 @@ export default function HomePage() { Install Guide +
  • + + Screenshots + +
  • +