browsh-org/browsh · critical
Error reading Windows registry
Error message
Error reading Windows registry: %w
What it means
getFirefoxPath looks up the installed Firefox executable under HKLM\Software\Mozilla\<flavor>\<versionString>\Main and reads PathToExe. If OpenKey fails (key or version subkey missing, or 32/64-bit view mismatch) browsh calls Shutdown, terminating with this wrapped error. It means browsh could not find the registry entry it uses to locate Firefox on Windows.
Solutions
- Verify Firefox is installed machine-wide by checking HKLM\Software\Mozilla in regedit.
- Install the official Firefox build so the Main key with PathToExe exists.
- Use a flavor/version that matches the installed registry key names.
- Run browsh elevated (if the key requires higher read access) or run a 64-bit-matching build.
Defensive patterns
Strategy: fallback
Validate before calling
// PowerShell check before running browsh Get-ItemProperty 'HKLM:\Software\Mozilla\Firefox\*\Main' -Name PathToExe -ErrorAction SilentlyContinue
Prevention
- Install Firefox machine-wide with the official installer, not the per-user stub.
- Verify the HKLM\Software\Mozilla key exists in regedit before running browsh.
- Keep browsh and Firefox bitness (32/64-bit) matched.
- Avoid registry cleaners that strip Mozilla keys.
When it happens
Trigger: registry.OpenKey on LOCAL_MACHINE for `Software\Mozilla\<flavor>\<versionString>\Main` returns an error: the exact version subkey does not exist, Firefox was installed per-user (under HKCU) instead of machine-wide, or the key is not visible to the current registry view.
Common situations: Firefox not installed at all; installed via a per-user installer (no HKLM entry); multiple Firefox versions installed and the computed versionString subkey differs from the actual key name; 32-bit browsh running on 64-bit Windows without WOW64 redirection handling.
Related errors
AI-assisted analysis of browsh-org/browsh@499ef386d4 (2026-09-02).
Data as JSON: /api/errors/d534faa2b85fdeb9.
Report an issue: GitHub.
Appendix: source
Thrown at interfacer/src/browsh/firefox_windows.go:23
import (
"fmt"
"log/slog"
"strings"
"github.com/go-errors/errors"
"golang.org/x/sys/windows/registry"
)
func getFirefoxPath() string {
versionString := getWindowsFirefoxVersionString()
flavor := getFirefoxFlavor()
k, err := registry.OpenKey(
registry.LOCAL_MACHINE,
`Software\Mozilla\`+flavor+`\`+versionString+`\Main`,
registry.QUERY_VALUE)
if err != nil {
Shutdown(fmt.Errorf("Error reading Windows registry: %w", err))
}
defer k.Close()
path, _, err := k.GetStringValue("PathToExe")
if err != nil {
Shutdown(fmt.Errorf("Error reading Windows registry: %w", err))
}
return path
}
func getWindowsFirefoxVersionString() string {
flavor := getFirefoxFlavor()
k, err := registry.OpenKey(
registry.LOCAL_MACHINE,
`Software\Mozilla\`+flavor,
registry.QUERY_VALUE)View on GitHub (pinned to 499ef386d4)