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
- Use only "desktop" and/or "mobile" in the manifest frontends list.
- Fix misspellings (e.g. "dekstop" -> "desktop").
- 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
- Only declare desktop and/or mobile
- Lint manifest frontends against the two-value enum
- Watch for typos like 'dekstop'
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
- no supported frontend
- 199
- invalid marketplace package manifest
- too many layers: %d
- invalid or duplicate layer ID
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/25fd8da1e40305ce.
Report an issue: GitHub.