spicetify/cli · error

custom app not found

Error message

custom app not found

What it means

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.

Source

Thrown at src/utils/path-utils.go:207

	if _, err := os.Stat(customAppFolderPath); err == nil {
		customAppActualFolderPath := GetCustomAppSubfolderPath(customAppFolderPath)
		if customAppActualFolderPath != "" {
			return customAppActualFolderPath, nil
		}
		return customAppFolderPath, nil
	}

	customAppFolderPath = filepath.Join(GetExecutableDir(), "CustomApps", name)

	if _, err := os.Stat(customAppFolderPath); err == nil {
		customAppActualFolderPath := GetCustomAppSubfolderPath(customAppFolderPath)
		if customAppActualFolderPath != "" {
			return customAppActualFolderPath, nil
		}
		return customAppFolderPath, nil
	}

	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

  1. Ensure the app is installed: clone it into <spicetify-folder>/CustomApps/<name>
  2. Verify the folder name matches the name used in `spicetify config customapp <name>`
  3. Re-check config-xpui.ini custom_apps list for typos
  4. Run `spicetify path userdata` to confirm the spicetify folder you're placing apps in is the one being read

Example fix

// before
custom_apps = lyrics-plus,new-yt      // "new-yt" not in CustomApps
// after
git clone https://github.com/.../new-yt.git ~/.config/spicetify/CustomApps/new-yt
spicetify apply
Defensive patterns

Strategy: validation

Validate before calling

appFolder := filepath.Join(utils.GetSpicetifyFolder(), "CustomApps", appName)
if info, err := os.Stat(appFolder); err != nil || !info.IsDir() {
    return fmt.Errorf("custom app %q not installed under %s", appName, appFolder)
}

Try / catch

_, err := utils.GetCustomAppPath(name)
if err != nil && err.Error() == "custom app not found" {
    // clone the app into CustomApps/<name> or fix the custom_apps config, then retry
    return fmt.Errorf("install app first: git clone <repo> <spicetify>/CustomApps/%s", name)
}

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.


AI-assisted analysis of spicetify/cli@1f13f73616 (2026-08-31). Data as JSON: /api/errors/0be25968bbc371a9. Report an issue: GitHub.