{"record":{"id":"0be25968bbc371a9","repo":"spicetify/cli","slug":"custom-app-not-found","errorCode":null,"errorMessage":"custom app not found","messagePattern":"custom app not found","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/utils/path-utils.go","lineNumber":207,"sourceCode":"\tif _, err := os.Stat(customAppFolderPath); err == nil {\n\t\tcustomAppActualFolderPath := GetCustomAppSubfolderPath(customAppFolderPath)\n\t\tif customAppActualFolderPath != \"\" {\n\t\t\treturn customAppActualFolderPath, nil\n\t\t}\n\t\treturn customAppFolderPath, nil\n\t}\n\n\tcustomAppFolderPath = filepath.Join(GetExecutableDir(), \"CustomApps\", name)\n\n\tif _, err := os.Stat(customAppFolderPath); err == nil {\n\t\tcustomAppActualFolderPath := GetCustomAppSubfolderPath(customAppFolderPath)\n\t\tif customAppActualFolderPath != \"\" {\n\t\t\treturn customAppActualFolderPath, nil\n\t\t}\n\t\treturn customAppFolderPath, nil\n\t}\n\n\treturn \"\", errors.New(\"custom app not found\")\n}\n\nfunc GetExtensionPath(name string) (string, error) {\n\textFilePath := filepath.Join(userExtensionsFolder, name)\n\n\tif _, err := os.Stat(extFilePath); err == nil {\n\t\treturn extFilePath, nil\n\t}\n\n\textFilePath = filepath.Join(GetExecutableDir(), \"Extensions\", name)\n\n\tif _, err := os.Stat(extFilePath); err == nil {\n\t\treturn extFilePath, nil\n\t}\n\n\treturn \"\", errors.New(\"extension not found\")\n}\n","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/spicetify/cli/blob/1f13f736163165234eef4fb792a03f9b5b732aa4/src/utils/path-utils.go#L189-L225","documentation":"GetCustomAppPath resolves the install directory of a custom app by name. It probes the spicetify CustomApps folder (and config-declared locations); if the app's folder cannot be found in any expected location, it returns \"custom app not found\" from src/utils/path-utils.go. It's invoked via GetAppManifest when applying/loading apps.","triggerScenarios":"Running `spicetify config customapp <name>` + `spicetify apply`, or calling GetCustomAppPath/GetAppManifest directly, when no directory named <name> exists under the spicetify CustomApps folder (or the path recorded in config is missing).","commonSituations":"Typoed app name in the customapp config; app repo cloned under a different folder name than the manifest name; CustomApps folder wiped by reinstall; app never downloaded (missing `spicetify config customapp` setup step); case-sensitivity issues on Linux.","solutions":["Ensure the app is installed: clone it into <spicetify-folder>/CustomApps/<name>","Verify the folder name matches the name used in `spicetify config customapp <name>`","Re-check config-xpui.ini custom_apps list for typos","Run `spicetify path userdata` to confirm the spicetify folder you're placing apps in is the one being read"],"exampleFix":"// before\ncustom_apps = lyrics-plus,new-yt      // \"new-yt\" not in CustomApps\n// after\ngit clone https://github.com/.../new-yt.git ~/.config/spicetify/CustomApps/new-yt\nspicetify apply","handlingStrategy":"validation","validationCode":"appFolder := filepath.Join(utils.GetSpicetifyFolder(), \"CustomApps\", appName)\nif info, err := os.Stat(appFolder); err != nil || !info.IsDir() {\n    return fmt.Errorf(\"custom app %q not installed under %s\", appName, appFolder)\n}","typeGuard":null,"tryCatchPattern":"_, err := utils.GetCustomAppPath(name)\nif err != nil && err.Error() == \"custom app not found\" {\n    // clone the app into CustomApps/<name> or fix the custom_apps config, then retry\n    return fmt.Errorf(\"install app first: git clone <repo> <spicetify>/CustomApps/%s\", name)\n}","preventionTips":["Ensure the CustomApps/<name> folder exists and matches the configured name exactly","Keep custom_apps entries in config-xpui.ini in sync with installed folders","Clone app repos with the folder name matching the app's manifest name","Verify the spicetify userdata folder with `spicetify path userdata` when apps go missing"],"tags":["custom-apps","missing-path","configuration"],"backgroundTag":"resource-not-found","analyzedSha":"1f13f736163165234eef4fb792a03f9b5b732aa4","analyzedAt":"2026-08-31T18:57:59.754Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}