spicetify/cli · error
extension not found
Error message
extension not found
What it means
GetExtensionPath resolves an extension by name to a file inside the <executable-dir>/Extensions directory. It joins the executable directory with "Extensions" and the given name, then os.Stat checks existence. If the file does not exist, it returns this error instead of a path. It is the library's way of saying the requested extension is not installed.
Source
Thrown at src/utils/path-utils.go:223
}
return "", errors.New("custom app not found")
}
func GetExtensionPath(name string) (string, error) {
extFilePath := filepath.Join(userExtensionsFolder, name)
if _, err := os.Stat(extFilePath); err == nil {
return extFilePath, nil
}
extFilePath = filepath.Join(GetExecutableDir(), "Extensions", name)
if _, err := os.Stat(extFilePath); err == nil {
return extFilePath, nil
}
return "", errors.New("extension not found")
}
View on GitHub (pinned to 1f13f73616)
Solutions
- Verify the exact file name exists: list the Extensions directory next to the spicetify executable.
- Install/copy the extension file into <spicetify-executable-dir>/Extensions/.
- Check for case-sensitivity mismatches (Linux is case-sensitive).
- If using a custom install location, ensure GetExecutableDir() points at the directory that actually contains Extensions.
Example fix
// before
path, err := utils.GetExtensionPath("myext")
// after (fail fast with a clear message)
path, err := utils.GetExtensionPath("myext.js")
if err != nil {
utils.Fatal(fmt.Errorf("extension not installed; put myext.js in the Extensions dir: %w", err))
} Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.Stat(filepath.Join(utils.GetExecutableDir(), "Extensions", "myext.js")); err != nil {
return fmt.Errorf("extension myext.js is not installed in Extensions dir")
}
path, err := utils.GetExtensionPath("myext.js") Try / catch
if err != nil {
if strings.Contains(err.Error(), "extension not found") {
// install or prompt user
}
return err
} Prevention
- Keep extension names and file extensions exact and case-consistent.
- Ship a setup step that populates the Extensions directory before lookup.
- Stat the Extensions dir at startup to detect a broken install layout early.
When it happens
Trigger: Calling GetExtensionPath(name) when no file named `name` exists under GetExecutableDir()/Extensions, or when the Extensions directory itself is missing.
Common situations: Typo in the extension name or wrong file extension (e.g. "mymod" vs "mymod.js"); extension not downloaded/installed yet; custom SPICETIFY_DIR or portable install where Extensions lives elsewhere; a fresh checkout where the Extensions folder was not copied.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
AI-assisted analysis of spicetify/cli@1f13f73616 (2026-08-31).
Data as JSON: /api/errors/3228870d5b8eb556.
Report an issue: GitHub.