{"record":{"id":"9d9b5c3d3e3bdd38","repo":"jesseduffield/lazygit","slug":"gui-sidepanels-s-must-be-included-it-can-t-be","errorCode":null,"errorMessage":"gui.sidePanels: '%s' must be included; it can't be hidden.","messagePattern":"gui\\.sidePanels: '(.+?)' must be included; it can't be hidden\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/config/user_config_validation.go","lineNumber":94,"sourceCode":"\t\t\t\treturn fmt.Errorf(\"gui.sidePanels: unknown side panel '%s'. Allowed values: %s\",\n\t\t\t\t\tname, strings.Join(ValidSidePanelTabs, \", \"))\n\t\t\t}\n\t\t\tif seen[name] {\n\t\t\t\treturn fmt.Errorf(\"gui.sidePanels: '%s' is listed more than once; each side panel may appear only once.\", name)\n\t\t\t}\n\t\t\tseen[name] = true\n\t\t\ttotal++\n\t\t}\n\t}\n\tif total == 0 {\n\t\treturn errors.New(\"gui.sidePanels must not be empty.\")\n\t}\n\t// A lot of code focuses these panels directly (e.g. after resolving a\n\t// conflict or popping a stash), so they must always be present; otherwise\n\t// that code would focus a hidden panel.\n\tfor _, required := range []string{\"files\", \"branches\", \"commits\"} {\n\t\tif !seen[required] {\n\t\t\treturn fmt.Errorf(\"gui.sidePanels: '%s' must be included; it can't be hidden.\", required)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc validateSpinner(spinner SpinnerConfig) error {\n\tif len(spinner.Frames) == 0 {\n\t\treturn errors.New(\"gui.spinner.frames must not be empty.\")\n\t}\n\tfirstWidth := utils.StringWidth(spinner.Frames[0])\n\tif lo.SomeBy(spinner.Frames, func(frame string) bool {\n\t\treturn utils.StringWidth(frame) != firstWidth\n\t}) {\n\t\treturn errors.New(\"All gui.spinner.frames entries must have the same width.\")\n\t}\n\treturn nil\n}\n","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/jesseduffield/lazygit/blob/c477a2959b229fbf3284be0d4d2904ab61ec3c94/pkg/config/user_config_validation.go#L76-L112","documentation":"Raised by validateSidePanels in pkg/config/user_config_validation.go. After collecting all listed tabs, the validator requires that 'files', 'branches' and 'commits' are present, because much of the controller code focuses these panels directly (conflict resolution, stash popping) and would break if they were hidden.","triggerScenarios":"Omitting any of files/branches/commits from every gui.sidePanels entry, e.g. `sidePanels: [[worktree, submodules]]`, then starting lazygit.","commonSituations":"Users trying to build a minimal layout that hides the files or commits panel; upgrading from a version without sidePanels and hand-writing a partial config.","solutions":["Add the missing required tab (named in the error) to one of your gui.sidePanels entries.","If you truly want a minimal UI, keep the required tabs in a panel you rarely look at instead of removing them.","Validate the config again by relaunching lazygit."],"exampleFix":"# before\ngui:\n  sidePanels:\n    - [worktree, submodules]\n\n# after\ngui:\n  sidePanels:\n    - [files, branches, commits, worktree, submodules]","handlingStrategy":"validation","validationCode":"required := []string{\"files\", \"branches\", \"commits\"}\nfor _, r := range required {\n\tif !seen[r] {\n\t\treturn fmt.Errorf(\"side panel %s is required\", r)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include files, branches and commits somewhere in gui.sidePanels.","When minimizing the UI, park required tabs in a rarely used panel instead of removing them."],"tags":["config","gui","side-panels","required-fields"],"backgroundTag":null,"analyzedSha":"c477a2959b229fbf3284be0d4d2904ab61ec3c94","analyzedAt":"2026-08-15T08:34:32.451Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}