{"record":{"id":"c75d35822112099b","repo":"kovidgoyal/kitty","slug":"screen-too-narrow-need-at-least-8-columns","errorCode":null,"errorMessage":"Screen too narrow, need at least 8 columns","messagePattern":"Screen too narrow, need at least 8 columns","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kittens/diff/ui.go","lineNumber":358,"sourceCode":"func (self *Handler) on_resize(old_size, new_size loop.ScreenSize) error {\n\tself.clear_mouse_selection()\n\tself.update_screen_size(new_size)\n\tif self.diff_map != nil && self.collection != nil && self.terminal_capabilities_received {\n\t\terr := self.render_diff()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif self.max_scroll_pos.Less(self.scroll_pos) {\n\t\t\tself.scroll_pos = self.max_scroll_pos\n\t\t}\n\t}\n\tself.draw_screen()\n\treturn nil\n}\n\nfunc (self *Handler) render_diff() (err error) {\n\tif self.screen_size.columns < 8 {\n\t\treturn fmt.Errorf(\"Screen too narrow, need at least 8 columns\")\n\t}\n\tif self.screen_size.rows < 2 {\n\t\treturn fmt.Errorf(\"Screen too short, need at least 2 rows\")\n\t}\n\tself.logical_lines, err = render(self.collection, self.diff_map, self.screen_size, self.largest_line_number, self.images_resized_to)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlast := self.logical_lines.Len() - 1\n\tself.max_scroll_pos.logical_line = last\n\tif last > -1 {\n\t\tself.max_scroll_pos.screen_line = len(self.logical_lines.At(last).screen_lines) - 1\n\t} else {\n\t\tself.max_scroll_pos.screen_line = 0\n\t}\n\tself.logical_lines.IncrementScrollPosBy(&self.max_scroll_pos, -self.screen_size.num_lines+1)\n\tif self.current_search != nil {\n\t\tself.current_search.search(self.logical_lines)","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kittens/diff/ui.go#L340-L376","documentation":"Before rendering, Handler.render_diff verifies the terminal is at least 8 columns wide. kitty sends resize events to the kitten, and when the window/pane becomes narrower than 8 columns the render is aborted with this error. The minimum exists because the diff layout (line numbers, margins, separators) cannot fit below that width.","triggerScenarios":"Resizing the kitty window below 8 columns while the diff kitten is open; splitting the kitty OS window into many tabs/OS-windows so each falls under 8 columns; opening the kitten in a tiny embedded window or with a huge font size in a minimal window; automated screenshot/tmux environments with tiny pseudo-terminals.","commonSituations":"Accidental ultra-narrow resize during use; tiling window manager layouts squeezing kitty to a sliver; font size increases (ctrl+shift+plus) shrinking effective column count below the minimum.","solutions":["Widen the kitty window to at least 8 columns and rerun/reopen the kitten.","If using a tiling WM or splits, give the kitty window more horizontal space.","Avoid launching the diff kitten from scripts in pseudo-terminals with fixed tiny COLUMNS."],"exampleFix":"# before\nkitty +kitten diff a b   # window only 4 columns wide\n\n# after\n# resize window >= 8 columns, then\nkitty +kitten diff a b","handlingStrategy":"validation","validationCode":"// Go: check terminal size before launching the kitten\nif term.IsTerminal(os.Stdout.Fd()) {\n    w, _, err := term.GetSize(int(os.Stdout.Fd()))\n    if err == nil && w < 8 {\n        return errors.New(\"terminal narrower than 8 columns; widen the window\")\n    }\n}","typeGuard":null,"tryCatchPattern":"In on_resize handlers, if render_diff returns 'Screen too narrow', skip rendering and show a placeholder frame; re-render automatically when the next resize event reports >=8 columns.","preventionTips":["Ensure the hosting kitty window is at least 8 columns before launching.","In tiling setups, enforce minimum window widths.","Treat sub-minimum sizes as transient: queue a re-render instead of crashing."],"tags":["kitty","diff-kitten","terminal-size","resize","ui"],"backgroundTag":"terminal-too-small","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}