siyuan-note/siyuan · error

unsupported frontend [%s]

Error message

unsupported frontend [%s]

What it means

Thrown by normalizeBootAppearanceFrontends when the manifest declares a frontend value that is not "desktop" or "mobile" and the manifest frontends list is non-empty. Unknown frontends in an explicit list are treated as manifest errors rather than silently skipped.

Source

Thrown at kernel/model/boot_appearance.go:715

	for _, frontend := range candidates {
		if frontend == "all" && len(manifestFrontends) == 0 {
			for _, normalized := range []string{"desktop", "mobile"} {
				if !seen[normalized] {
					seen[normalized] = true
					frontends = append(frontends, normalized)
				}
			}
			continue
		}
		normalized := ""
		switch frontend {
		case "desktop":
			normalized = "desktop"
		case "mobile":
			normalized = "mobile"
		default:
			if len(manifestFrontends) > 0 {
				return nil, fmt.Errorf("unsupported frontend [%s]", frontend)
			}
			continue
		}
		if !seen[normalized] {
			seen[normalized] = true
			frontends = append(frontends, normalized)
		}
	}
	if len(frontends) == 0 && len(manifestFrontends) == 0 && len(pluginFrontends) == 0 {
		frontends = append(frontends, "desktop", "mobile")
	}
	if len(frontends) == 0 {
		return nil, errors.New("no supported frontend")
	}
	return frontends, nil
}

func validateOptionalBootAppearanceColor(color string) error {

View on GitHub (pinned to 8641553a1f)

Solutions

  1. Use only "desktop" and/or "mobile" in the manifest frontends list.
  2. Fix misspellings (e.g. "dekstop" -> "desktop").
  3. Remove unsupported frontend entries if the package targets both platforms.

Example fix

// before
"frontends": ["desktop", "browser"]
// after
"frontends": ["desktop"]
Defensive patterns

Strategy: validation

Validate before calling

function validFrontends(list) { return (list || []).every(f => f === "desktop" || f === "mobile"); }

Type guard

const isFrontend = (v) => v === "desktop" || v === "mobile";

Try / catch

try { await installBootAppearance(pkg); } catch (e) { if (String(e).includes("unsupported frontend")) { /* remove/fix the frontend entry in manifest */ } else throw e; }

Prevention

When it happens

Trigger: A manifest with "frontends": ["desktop", "mobile", "browser"] or a misspelled "dekstop"; loadBootAppearance and the frontends unit test hit this path.

Common situations: Authors inventing new frontend names, typos in desktop/mobile, or copying plugin frontends conventions from other systems.

Related errors


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/25fd8da1e40305ce. Report an issue: GitHub.