siyuan-note/siyuan · error
invalid layer fit [%s]
Error message
invalid layer fit [%s]
What it means
Thrown by loadBootAppearance when a boot appearance manifest declares a layer whose "fit" value is not one of the accepted CSS-like object-fit values. Empty fit values default to "cover" so this only fires for explicitly wrong strings. It aborts loading of the whole boot appearance package.
Source
Thrown at kernel/model/boot_appearance.go:484
}
if layer.Type == "video" {
if layer.Poster == "" {
err = errors.New("video poster is required")
return nil, err
}
if _, _, err = validateBootAppearanceResource(pluginDir, appearanceDir, layer.Poster, "image"); err != nil {
return nil, fmt.Errorf("invalid video poster: %w", err)
}
} else if layer.Poster != "" {
err = errors.New("image layer cannot declare a poster")
return nil, err
}
fit := layer.Fit
if fit == "" {
fit = "cover"
}
if !isValidBootAppearanceFit(fit) {
err = fmt.Errorf("invalid layer fit [%s]", fit)
return nil, err
}
position := layer.Position
if position == "" {
position = "center"
}
if !isValidBootAppearancePosition(position) {
err = fmt.Errorf("invalid layer position [%s]", position)
return nil, err
}
item := &BootAppearanceLayer{
ID: layer.ID,
Type: layer.Type,
Src: bootAppearanceAssetURL(pkg.Name, appearanceID, layer.Src),
Fit: fit,
Position: position,
}
if layer.Poster != "" {View on GitHub (pinned to 8641553a1f)
Solutions
- Open the boot appearance package's manifest and change the layer's fit to one of: cover, contain, fill, none, scale-down (lowercase).
- Remove the fit field entirely to get the default "cover".
- Validate the manifest with a quick check before shipping: allowed set is cover|contain|fill|none|scale-down.
Example fix
// before "fit": "Cover" // after "fit": "cover"
Defensive patterns
Strategy: validation
Validate before calling
function validLayerFit(fit) { return !fit || ["cover","contain","fill","none","scale-down"].includes(fit); } Type guard
const isLayerFit = (v) => typeof v === "string" && ["cover","contain","fill","none","scale-down"].includes(v);
Try / catch
try { appearances = await getBootAppearances(); } catch (e) { if (String(e).includes("invalid layer fit")) { /* fix manifest, skip package */ } else throw e; } Prevention
- Use a manifest schema/JSON Schema validator with an enum on fit before packaging
- Always write fit values lowercase
- Omit fit when the default cover is fine
When it happens
Trigger: Calling GetBootAppearances or getBootAppearanceByID while a manifest.json contains a layer with e.g. "fit": "stretch" or "Fit": "Cover" (case-sensitive, must be lowercase cover/contain/fill/none/scale-down).
Common situations: Hand-edited manifest files, copy-pasted CSS values like "object-fit: cover", wrong casing ("Cover"), or manifests written against an older/imagined spec.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- invalid layer position [%s]
- 199
- invalid marketplace package manifest
- provider and appearance must both be empty or non-empty
- too many layers: %d
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/9c665ca659bae381.
Report an issue: GitHub.