{"record":{"id":"8ac95a3357324989","repo":"jesseduffield/lazygit","slug":"gui-sidepanels-unknown-side-panel-s-allowed-v","errorCode":null,"errorMessage":"gui.sidePanels: unknown side panel '%s'. Allowed values: %s","messagePattern":"gui\\.sidePanels: unknown side panel '(.+?)'\\. Allowed values: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/config/user_config_validation.go","lineNumber":76,"sourceCode":"\tif err := validateSpinner(config.Gui.Spinner); err != nil {\n\t\treturn err\n\t}\n\tif err := validateSidePanels(config.Gui.SidePanels); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc validateSidePanels(panels []SidePanel) error {\n\tseen := map[string]bool{}\n\ttotal := 0\n\tfor _, panel := range panels {\n\t\tif len(panel) == 0 {\n\t\t\treturn errors.New(\"gui.sidePanels: a side panel must have at least one tab.\")\n\t\t}\n\t\tfor _, name := range panel {\n\t\t\tif !slices.Contains(ValidSidePanelTabs, name) {\n\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)","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/jesseduffield/lazygit/blob/c477a2959b229fbf3284be0d4d2904ab61ec3c94/pkg/config/user_config_validation.go#L58-L94","documentation":"Raised by validateSidePanels in pkg/config/user_config_validation.go during config validation. Each tab name inside a gui.sidePanels entry must be one of the entries in the ValidSidePanelTabs list; anything else (typo, renamed panel, unsupported name) is rejected with the full allowed list echoed back.","triggerScenarios":"Setting gui.sidePanels in the config with a tab name not in ValidSidePanelTabs, e.g. `sidePanels: [[commits, worktree]]` when 'worktree' is not a valid tab, then starting lazygit so validateUserConfig runs.","commonSituations":"Typos in panel names; using a panel name from a different lazygit version (tabs gained/renamed across releases); copy-pasting an example config written for a newer or older release.","solutions":["Compare the offending name against the allowed values printed verbatim in the error message and correct the typo.","If the name looks correct, check the lazygit version's ValidSidePanelTabs slice (pkg/config/user_config_validation.go) — the panel may not exist in your build; upgrade or pick an existing tab.","Remove the unknown entry entirely if you do not need that tab."],"exampleFix":"# before\ngui:\n  sidePanels:\n    - [files, branchs, commits]\n\n# after\ngui:\n  sidePanels:\n    - [files, branches, commits]","handlingStrategy":"validation","validationCode":"// Check side-panel tab names against the same allowlist before shipping a config:\nvalid := []string{\"files\", \"branches\", \"commits\", \"worktree\", /* ... */}\nfor _, panel := range cfg.Gui.SidePanels {\n\tfor _, name := range panel {\n\t\tif !slices.Contains(valid, name) {\n\t\t\treturn fmt.Errorf(\"invalid side panel tab: %s\", name)\n\t\t}\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Copy sidePanels examples from the docs for the exact lazygit version in use.","Treat the error's allowed-values list as the source of truth and paste names verbatim.","Pin the lazygit version in dotfiles so tab names cannot drift under you."],"tags":["config","gui","side-panels"],"backgroundTag":null,"analyzedSha":"c477a2959b229fbf3284be0d4d2904ab61ec3c94","analyzedAt":"2026-08-15T08:34:32.451Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}