{"record":{"id":"a8d9a3eb57f2a38e","repo":"glanceapp/glance","slug":"nested-groups-are-not-supported","errorCode":null,"errorMessage":"nested groups are not supported","messagePattern":"nested groups are not supported","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/glance/widget-group.go","lineNumber":25,"sourceCode":"\t\"time\"\n)\n\nvar groupWidgetTemplate = mustParseTemplate(\"group.html\", \"widget-base.html\")\n\ntype groupWidget struct {\n\twidgetBase          `yaml:\",inline\"`\n\tcontainerWidgetBase `yaml:\",inline\"`\n}\n\nfunc (widget *groupWidget) initialize() error {\n\twidget.withError(nil)\n\twidget.HideHeader = true\n\n\tfor i := range widget.Widgets {\n\t\twidget.Widgets[i].setHideHeader(true)\n\n\t\tif widget.Widgets[i].GetType() == \"group\" {\n\t\t\treturn errors.New(\"nested groups are not supported\")\n\t\t} else if widget.Widgets[i].GetType() == \"split-column\" {\n\t\t\treturn errors.New(\"split columns inside of groups are not supported\")\n\t\t}\n\t}\n\n\tif err := widget.containerWidgetBase._initializeWidgets(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (widget *groupWidget) update(ctx context.Context) {\n\twidget.containerWidgetBase._update(ctx)\n}\n\nfunc (widget *groupWidget) setProviders(providers *widgetProviders) {\n\twidget.containerWidgetBase._setProviders(providers)","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/glanceapp/glance/blob/91324e8de762702e97b0ac5c8e36271d644d8642/internal/glance/widget-group.go#L7-L43","documentation":"Thrown by the group widget's initialize() when one of its direct children has type group. Glance flattens rendering one level deep inside groups, so a group nested inside a group is rejected at config-parse time before any child widgets initialize.","triggerScenarios":"A page config where a group widget's widgets list contains another item with type: group; commonly happens when copy-pasting a working group widget into an existing group to 'merge' sections.","commonSituations":"Reorganizing a page and dropping a group block inside another group; trying to build two-level tab/section hierarchies that Glance's layout does not support.","solutions":["Move the inner group out to the page's top-level widgets list, next to the outer group","Merge the inner group's widgets directly into the outer group's widgets list","Use separate pages (or a bookmarks/widget layout) to express the extra hierarchy level"],"exampleFix":"# before\n- type: group\n  widgets:\n    - type: group\n      widgets:\n        - type: bookmark\n\n# after\n- type: group\n  widgets:\n    - type: bookmark","handlingStrategy":"validation","validationCode":"def check_groups(widgets, inside_group=False):\n    for w in widgets or []:\n        if w['type'] == 'group':\n            if inside_group:\n                raise ValueError('nested groups are not supported')\n            check_groups(w.get('widgets'), inside_group=True)\n        elif w['type'] == 'split-column':\n            check_groups(w.get('widgets'), inside_group=False)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember groups are one level deep; plan page layout as a flat list of groups","When reorganizing, paste groups beside other groups, not inside","Add a structural lint that walks widget trees and rejects group-in-group"],"tags":["config","yaml","group","layout","validation"],"backgroundTag":null,"analyzedSha":"91324e8de762702e97b0ac5c8e36271d644d8642","analyzedAt":"2026-08-15T14:12:54.279Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}