{"record":{"id":"6a0014371f4e3f64","repo":"jesseduffield/lazygit","slug":"gui-spinner-frames-must-not-be-empty","errorCode":null,"errorMessage":"gui.spinner.frames must not be empty.","messagePattern":"gui\\.spinner\\.frames must not be empty\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/config/user_config_validation.go","lineNumber":102,"sourceCode":"\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\nfunc validateDiffRenderers(diffRenderers []DiffRendererConfig) error {\n\tfor _, diffRenderer := range diffRenderers {\n\t\tswitch diffRenderer.Type {\n\t\tcase \"stdinFilter\", \"\":\n\t\t\tif diffRenderer.Command == \"\" {\n\t\t\t\treturn errors.New(\"git.diffRenderers: 'command' must be specified for diff renderer type 'stdinFilter'.\")\n\t\t\t}\n\t\t\tif len(diffRenderer.Args) > 0 {","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/jesseduffield/lazygit/blob/c477a2959b229fbf3284be0d4d2904ab61ec3c94/pkg/config/user_config_validation.go#L84-L120","documentation":"Validation error from validateSpinner (user_config_validation.go:102). gui.spinner.frames customizes the loading spinner animation; an empty frames list would give the spinner nothing to animate, so config load fails immediately.","triggerScenarios":"Setting 'gui: spinner: frames: []' in config.yml. The frames field is a user-overridable list, and the validator rejects zero entries before startup.","commonSituations":"Attempting to disable the spinner by emptying the list (use gui.spinner.enabled instead); YAML indentation putting frames under the wrong key; partial paste of a shared config.","solutions":["Provide at least one frame string, e.g. frames: ['⠋','⠙','⠹','⠸','⠼','⠴','⠦','⠧','⠇','⠏']","To disable the spinner, set gui.spinner.enabled: false rather than emptying frames","Re-run lazygit to confirm validation passes"],"exampleFix":"# before\ngui:\n  spinner:\n    frames: []\n\n# after\ngui:\n  spinner:\n    enabled: false  # to disable; or provide frames:\n    # frames: ['|','/','-','\\\\']","handlingStrategy":"validation","validationCode":"function validSpinnerFrames(frames []string) bool { return len(frames) > 0 }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["To disable the spinner use gui.spinner.enabled: false, never empty frames","Start from the documented default frames list when customizing","Keep a known-good config backup before cosmetic edits"],"tags":["config","yaml","validation","spinner"],"backgroundTag":null,"analyzedSha":"c477a2959b229fbf3284be0d4d2904ab61ec3c94","analyzedAt":"2026-08-15T08:34:32.451Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}