docs: add VuePress documentation website#2096
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (11)
📝 WalkthroughSummary by CodeRabbit
WalkthroughThis PR introduces a complete VuePress-based documentation website for SoundSwitch with GitHub Pages deployment. It adds homepage components (download + donation), site configuration, global styles, many user-facing docs (getting started, configuration, usage, advanced), developer docs, and a GitHub Actions workflow to build and deploy the site. ChangesDocumentation Website with GitHub Pages Deployment
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
website/src/usage/cli.md (1)
12-12: ⚡ Quick winUse a direct link for the CLI reference.
Line 12 mentions documentation but doesn’t provide a clickable URL/path, which adds friction for readers.
🔧 Suggested edit
-For detailed command reference, see the `SoundSwitch.CLI` documentation. +For detailed command reference, see the [SoundSwitch.CLI documentation](https://github.com/Belphemur/SoundSwitch.CLI).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@website/src/usage/cli.md` at line 12, The sentence referencing SoundSwitch.CLI is not a clickable link; update the text in cli.md by replacing the plain reference "SoundSwitch.CLI" with a proper Markdown link (e.g., [SoundSwitch.CLI](<insert-URL-or-relative-path>)) so readers can click directly to the CLI documentation, choosing an absolute URL for external docs or a relative path for internal docs and keeping the display text as "SoundSwitch.CLI".website/src/.vuepress/components/HomeHero.vue (1)
180-188: ⚡ Quick winAdd dialog semantics to both modals.
The modal containers should expose dialog semantics (
role="dialog",aria-modal="true", and labelled title linkage) for assistive tech.Proposed fix
- <div class="donate-modal"> + <div + class="donate-modal" + role="dialog" + aria-modal="true" + aria-labelledby="donate-modal-title" + > ... - <h3 class="modal-title">Support SoundSwitch</h3> + <h3 id="donate-modal-title" class="modal-title">Support SoundSwitch</h3>- <div class="donate-modal"> + <div + class="donate-modal" + role="dialog" + aria-modal="true" + aria-labelledby="thanks-modal-title" + > ... - <h3 class="modal-title">Thank You!</h3> + <h3 id="thanks-modal-title" class="modal-title">Thank You!</h3>Also applies to: 210-218
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@website/src/.vuepress/components/HomeHero.vue` around lines 180 - 188, The donate modal markup (the <div class="donate-modal"> containing the close button, <h3 class="modal-title">, etc.) is missing dialog semantics; update that container to include role="dialog" and aria-modal="true" and add an aria-labelledby that references the modal title element (give the <h3 class="modal-title"> a unique id and use that id in aria-labelledby). Do the same change for the other modal block mentioned (the one around lines 210-218) so both modals expose proper dialog semantics for assistive tech.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/docs.yml:
- Around line 34-36: The workflow references outputs via
steps.deployment.outputs.page_url but the deploy step using
actions/deploy-pages@v4 lacks an id; add the missing id by adding id: deployment
to that step (the step that uses actions/deploy-pages@v4) so
steps.deployment.outputs.page_url can resolve correctly.
In `@website/src/.vuepress/components/HomeHero.vue`:
- Around line 194-195: The external donation anchor in HomeHero.vue currently
uses target="_blank" with rel="noopener"; update the anchor element that opens
the payment/donation link (the <a> in the template that contains
target="_blank") to include noreferrer as well by changing its rel value to
include "noreferrer" (e.g., "noopener noreferrer") so referrer data is not
leaked.
In `@website/src/.vuepress/config.ts`:
- Around line 8-28: The head currently injects Google AdSense and Matomo scripts
unconditionally (see the head array entries that create the script with src
'https://pagead2.googlesyndication.com/...adsbygoogle.js' and the inline script
that initializes window._mtm and window._paq and loads
'https://unami.newmail.app/js/container_dmLA4CEF.js'); change this to defer
injection until explicit user consent by implementing a consent banner/cookie
notice and gating logic: add a consent UI that stores the user's choice (e.g.,
localStorage or a cookie key like "analytics_consent"), move the inline
initialization and external script insertion into a single function (e.g.,
loadAnalyticsAndAds) that programmatically creates and appends those script tags
and initializes window._mtm/_paq, and update page startup to check the consent
key and only call loadAnalyticsAndAds after the user opts in (and call it
immediately if consent already stored). Ensure the AdSense script is only
appended after consent to avoid unconditional network calls.
In `@website/src/.vuepress/public/images`:
- Line 1: The public/images symlink pointing to ../../../../img/Documentation is
brittle across Windows and CI; replace the symlink by adding a build step or
script that copies the contents of img/Documentation into
website/src/.vuepress/public/images (or generates the images at build time), and
update any build or CI config (e.g., npm scripts or the CI pipeline) to run this
copy before the VuePress build; alternatively document the symlink requirement
in README and gate it behind an environment-specific configuration, but prefer
the deterministic copy approach so website/src/.vuepress/public/images contains
actual files at build time.
---
Nitpick comments:
In `@website/src/.vuepress/components/HomeHero.vue`:
- Around line 180-188: The donate modal markup (the <div class="donate-modal">
containing the close button, <h3 class="modal-title">, etc.) is missing dialog
semantics; update that container to include role="dialog" and aria-modal="true"
and add an aria-labelledby that references the modal title element (give the <h3
class="modal-title"> a unique id and use that id in aria-labelledby). Do the
same change for the other modal block mentioned (the one around lines 210-218)
so both modals expose proper dialog semantics for assistive tech.
In `@website/src/usage/cli.md`:
- Line 12: The sentence referencing SoundSwitch.CLI is not a clickable link;
update the text in cli.md by replacing the plain reference "SoundSwitch.CLI"
with a proper Markdown link (e.g.,
[SoundSwitch.CLI](<insert-URL-or-relative-path>)) so readers can click directly
to the CLI documentation, choosing an absolute URL for external docs or a
relative path for internal docs and keeping the display text as
"SoundSwitch.CLI".
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 688fdd3b-d798-4850-9bf6-489d2b368eec
⛔ Files ignored due to path filters (3)
website/package-lock.jsonis excluded by!**/package-lock.jsonwebsite/src/.vuepress/public/favicon.icois excluded by!**/*.icowebsite/src/.vuepress/public/logo.svgis excluded by!**/*.svg
📒 Files selected for processing (27)
.github/workflows/docs.ymlwebsite/.gitignorewebsite/package.jsonwebsite/src/.vuepress/client.tswebsite/src/.vuepress/components/GoogleAd.vuewebsite/src/.vuepress/components/HomeHero.vuewebsite/src/.vuepress/config.tswebsite/src/.vuepress/public/imageswebsite/src/.vuepress/styles/index.scsswebsite/src/.vuepress/styles/palette.scsswebsite/src/README.mdwebsite/src/advanced/README.mdwebsite/src/advanced/auto-updater.mdwebsite/src/advanced/multi-language.mdwebsite/src/advanced/troubleshooting.mdwebsite/src/configuration/README.mdwebsite/src/configuration/general.mdwebsite/src/configuration/notifications.mdwebsite/src/configuration/playback.mdwebsite/src/configuration/recording.mdwebsite/src/getting-started.mdwebsite/src/usage/README.mdwebsite/src/usage/app-rules.mdwebsite/src/usage/cli.mdwebsite/src/usage/communications.mdwebsite/src/usage/hotkeys.mdwebsite/src/usage/profiles.md
| @@ -0,0 +1 @@ | |||
| ../../../../img/Documentation No newline at end of file | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Inspecting public/images type..."
if [ -L "website/src/.vuepress/public/images" ]; then
echo "OK: images is a symlink"
target="$(readlink "website/src/.vuepress/public/images")"
echo "Target: $target"
else
echo "WARN: images is not a symlink"
ls -ld "website/src/.vuepress/public/images" || true
fi
echo
echo "Checking whether target path resolves from repo root..."
python - <<'PY'
import os
p = "website/src/.vuepress/public/images"
if os.path.islink(p):
t = os.readlink(p)
resolved = os.path.normpath(os.path.join(os.path.dirname(p), t))
print("resolved_target:", resolved)
print("exists:", os.path.exists(resolved))
else:
print("not_a_symlink")
PYRepository: Belphemur/SoundSwitch
Length of output: 265
Symlink portability risk: public/images points to ../../../../img/Documentation.
The symlink resolves correctly in the current environment, but symlinks can cause failures on Windows (where they require admin privileges by default) and in CI/CD systems that don't preserve symlinks during checkout. Ensure this works consistently across all target platforms and CI runners, or consider replacing the symlink with an alternative approach (e.g., build-time copying, documentation, or environment-specific configuration).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@website/src/.vuepress/public/images` at line 1, The public/images symlink
pointing to ../../../../img/Documentation is brittle across Windows and CI;
replace the symlink by adding a build step or script that copies the contents of
img/Documentation into website/src/.vuepress/public/images (or generates the
images at build time), and update any build or CI config (e.g., npm scripts or
the CI pipeline) to run this copy before the VuePress build; alternatively
document the symlink requirement in README and gate it behind an
environment-specific configuration, but prefer the deterministic copy approach
so website/src/.vuepress/public/images contains actual files at build time.
There was a problem hiding this comment.
Symlinks were explicitly requested to ensure assets automatically remain synced with the source without needing manual copy steps. They work correctly in our target environments.
There was a problem hiding this comment.
@Belphemur, understood — thanks for the context! I'll note this for future reviews so the symlink won't be flagged again.
(´• ω •`) ♡
✏️ Learnings added
Learnt from: Belphemur
Repo: Belphemur/SoundSwitch PR: 2096
File: website/src/.vuepress/public/images:1-1
Timestamp: 2026-05-08T01:03:36.604Z
Learning: In the SoundSwitch repository (Belphemur/SoundSwitch), `website/src/.vuepress/public/images` is an intentional symlink pointing to `../../../../img/Documentation`. This is a deliberate design decision to keep documentation assets automatically in sync with the source. Do not flag this symlink as a portability concern in future reviews, as it works correctly in all target environments used by this project.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
There was a problem hiding this comment.
Code Review
This pull request introduces several infrastructure and installer improvements, including support for ARM64 architecture, migration to .NET 10, and the addition of a new 'App Sound Lock' feature. Key changes include updating project dependencies, enhancing the installer with .NET runtime detection and uninstallation logic, and adding a process monitor for audio rule matching. I have reviewed the changes and identified a few areas for improvement: the .NET runtime detection logic in the installer needs to check both 32-bit and 64-bit registry views to avoid redundant downloads, the Markdig package version change appears to be an accidental downgrade, and the uninstaller command execution logic needs more robust quote handling.
I am having trouble creating individual review comments. Click here to see my feedback.
Installer/scripts/CodeDependencies.iss (273-275)
The Dependency_IsNetCoreInstalled function checks for the .NET runtime installation path only in the 32-bit registry view (HKLM32). On a 64-bit system, this will not find a 64-bit-only .NET runtime, which is typically registered in the native 64-bit registry view (HKLM). This could lead to the installer unnecessarily downloading and installing a runtime that is already present.
To ensure all installations are detected, you should iterate over both HKLM and HKLM32 registry roots, as is done in uninstall_dotnet.iss.
References
- When searching for registry keys (such as uninstallation strings) in an installer, iterate over both native (HKLM) and 32-bit (HKLM32) registry roots to ensure all potential cross-architecture installations or leftovers are identified.
Directory.Packages.props (12)
The version for the Markdig package has been changed from 0.42.0 to 1.1.3. This appears to be a significant version downgrade, as Markdig's versioning scheme is typically 0.x.y. This could reintroduce old bugs or remove features. Please verify if this version change is intentional. If it's a typo, it should be corrected to the intended version.
Installer/scripts/uninstall_dotnet.iss (47)
The command to execute the uninstaller wraps QuietUninstallString in an extra set of double quotes (""...""). This might cause issues if the QuietUninstallString from the registry already contains quotes, which is common for paths with spaces. For example, a command like cmd /c """"C:\Path\uninstaller.exe" /args""" would likely fail. It would be safer to handle quoting more carefully, perhaps by checking if the path is already quoted before adding more.
- Enhance website documentation for advanced features, App Rules, Profiles, configuration, and CLI usage. - Add developer guides in `docs/` for architecture, building, contributing, and internal components. - Update AGENTS.md to link to the new development documentation structure.
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (1)
website/src/advanced/troubleshooting.md (1)
7-7: ⚡ Quick winUse hyphenation for compound adjectives.
"Per App Audio" should be hyphenated as "Per-App Audio" when used as a compound adjective. This applies to both the section heading and line 9 where "per-app routing" is mentioned.
✏️ Proposed fix
-## Reset Per App Audio +## Reset Per-App Audio -Resets all audio device assignments that were made to specific programs. If audio devices are not being reassigned to programs when switching devices, click **Reset** to clear all per-app routing state. Windows will then reassign applications to their default devices, and App Sound Lock rules will reapply on the next process or window event. +Resets all audio device assignments that were made to specific programs. If audio devices are not being reassigned to programs when switching devices, click **Reset** to clear all per-app routing state. Windows will then reassign applications to their default devices, and App Sound Lock rules will reapply on the next process or window event.Note: Line 9 already correctly uses "per-app" with a hyphen in "per-app routing state," so only the heading needs updating.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@website/src/advanced/troubleshooting.md` at line 7, The heading "## Reset Per App Audio" should be updated to use hyphenation for the compound adjective; change the heading text (the line containing "## Reset Per App Audio") to "## Reset Per-App Audio" to match the already-correct "per-app routing" usage and ensure consistent hyphenation across the document.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/banner-manager.md`:
- Line 44: The sentence about manually removing a banner is a fragment—make it
an explicit, grammatical sentence by adding a subject and verb; update the
sentence that references RemovePersistentMuteBanner(microphoneId) to read
something like "You can call RemovePersistentMuteBanner(microphoneId) to
immediately remove a specific microphone's persistent banner and rearrange the
remaining ones," ensuring the function name
RemovePersistentMuteBanner(microphoneId) is kept exactly as shown.
In `@docs/contributing.md`:
- Around line 137-150: Add an explicit build step before running tests: update
the Testing section to instruct contributors to run "dotnet build
SoundSwitch.sln -c Debug" (to ensure compilation succeeds) and then run "dotnet
test SoundSwitch.sln -c Debug"; make sure the guidance references the solution
name SoundSwitch.sln and the Debug configuration so the build verification
precedes the test command.
- Around line 104-108: The fenced code block containing "feat(api)!: change
device switching API signature" and the "BREAKING CHANGE: The `SwitchDevice`
method now requires a `DeviceType` enum parameter." message lacks a language
identifier; update the opening fence from ``` to ```text (or another appropriate
language) so the block is rendered and linted correctly, ensuring the rest of
the block (including the closing ```) remains unchanged.
- Around line 30-37: Update the "Code Contributions" section so contributors
build the solution before running tests: insert a new step before the existing
test step that runs the build command `dotnet build SoundSwitch.sln -c Debug`,
then renumber the subsequent steps (so the test step becomes the next one) and
ensure the test instruction remains `dotnet test SoundSwitch.sln`; modify the
"Code Contributions" block header and list accordingly to reflect the added
build step and keep the descriptive branch naming guidance intact.
- Around line 68-74: The fenced code block example in contributing.md lacks a
language identifier; update the opening triple backticks for the snippet shown
(the block containing "type(scope): description" and the optional body/footer)
to include a language token (e.g., change ``` to ```text) so the block renders
and passes markdown linting, leaving the block contents and closing backticks
unchanged.
In `@website/src/advanced/troubleshooting.md`:
- Line 28: Remove the duplicate image markdown reference "!
[Troubleshoot](/images/Troubleshoot.png)" found at the end of the
troubleshooting.md content (it duplicates the screenshot already included
earlier); open the file, locate the line containing that exact image tag and
delete it so the file only contains the single original screenshot reference.
In `@website/src/configuration/general.md`:
- Line 24: Change the heading text "Double Click Action" to use standard
hyphenation: update the heading string to "Double-click Action" in the document
(the header line currently containing Double Click Action) unless it must
exactly match a UI label; ensure any references or links that rely on the exact
heading are updated accordingly.
---
Nitpick comments:
In `@website/src/advanced/troubleshooting.md`:
- Line 7: The heading "## Reset Per App Audio" should be updated to use
hyphenation for the compound adjective; change the heading text (the line
containing "## Reset Per App Audio") to "## Reset Per-App Audio" to match the
already-correct "per-app routing" usage and ensure consistent hyphenation across
the document.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 4c785148-90db-43bb-9f09-13219208a016
📒 Files selected for processing (22)
AGENTS.mddocs/README.mddocs/architecture.mddocs/banner-manager.mddocs/building.mddocs/contributing.mdwebsite/src/advanced/README.mdwebsite/src/advanced/auto-updater.mdwebsite/src/advanced/multi-language.mdwebsite/src/advanced/troubleshooting.mdwebsite/src/configuration/README.mdwebsite/src/configuration/general.mdwebsite/src/configuration/notifications.mdwebsite/src/configuration/playback.mdwebsite/src/configuration/recording.mdwebsite/src/getting-started.mdwebsite/src/usage/README.mdwebsite/src/usage/app-rules.mdwebsite/src/usage/cli.mdwebsite/src/usage/communications.mdwebsite/src/usage/hotkeys.mdwebsite/src/usage/profiles.md
✅ Files skipped from review due to trivial changes (17)
- website/src/advanced/README.md
- docs/architecture.md
- AGENTS.md
- docs/README.md
- website/src/configuration/README.md
- website/src/usage/communications.md
- website/src/advanced/auto-updater.md
- website/src/usage/hotkeys.md
- website/src/configuration/playback.md
- website/src/getting-started.md
- website/src/advanced/multi-language.md
- website/src/usage/app-rules.md
- website/src/configuration/recording.md
- website/src/usage/cli.md
- docs/building.md
- website/src/configuration/notifications.md
- website/src/usage/profiles.md
🚧 Files skipped from review as they are similar to previous changes (1)
- website/src/usage/README.md
Summary
website/directory..github/workflows/docs.ymlto automatically build and deploy the docs.