Run a print, jog the toolhead, watch temperatures, adjust Z offset live, probe the bed, follow the current layer's toolpath and check the camera — over Moonraker, in the terminal, without opening a browser.
Runs in any terminal. Best in kitty — the webcam and the Klipper mark come through as real images rather than coloured blocks, and frames cost about 2ms each instead of 38.
Every one of these is a photograph of a real session against a real printer, mid-print, taken in kitty — so the webcam, the plots and the Klipper mark are the actual images the graphics protocol draws, not an approximation in coloured blocks. Nothing here is a mockup.
The same tabs and the same keys (d, g, c, m, f, b, w, s), wired to made-up printer data so you can click around before installing anything. The screenshots above are the real thing.
live offset +0.000mm probe z_offset 0.850
| Filename | Size | Modified |
|---|---|---|
| ARTICULATED_ice_dragon_fixed_p1_6h28m_0.20mm_215C_PLA_ENDER6.gcode printing | 27.2 MB | 2026-08-16 03:55 |
| ender6_cooling_duct_v3_petg.gcode | 8.6 MB | 2026-08-14 21:08 |
| bed_level_test_pla.gcode | 1.4 MB | 2026-08-12 19:44 |
http://mainsailos.local/webcam/?action=snapshot
~/.config/klipper-tui/settings.json
One websocket to Moonraker, and a terminal. Nothing is installed on the printer.
The current layer as the nozzle draws it, read straight from the running file over HTTP range requests. Printed moves are coloured ahead of what is still to come. Zoom, pan, click to centre, or let it follow the print.
Ten minutes of hotend and bed at four times the vertical resolution of block characters, seeded from Moonraker's temperature store so the graph is already full when you open it.
The heightmap fills in point by point as the probe runs — including a run you started in Mainsail, which it joins in progress. Probe count is overridable per run, with a duration estimate as you type.
Babystep in 0.01mm and 0.05mm while the first layer goes down, then fold the result into the probe's saved offset with one button. It picks Z_OFFSET_APPLY_PROBE or _ENDSTOP based on what your config has.
Homing, jogging, disabling the motors, probing the bed, extruding by hand, running a macro — anything that would wreck a running print asks first, and only while a print is actually running.
Feedrate and extrusion percentages with presets and a custom entry, plus velocity, acceleration, square corner velocity and minimum cruise ratio, seeded from the printer's own configuration.
Part fan, generic fans and the ones Klipper drives itself, discovered from the printer. Automatic fans are shown with their speed and no controls, because setting them by hand would just be overridden.
Every [gcode_macro] in your config becomes a button, discovered at connect time. Underscore-prefixed helpers stay hidden, and PAUSE, RESUME and CANCEL_PRINT are already the job controls.
Send G-code and get the printer's replies. Tab completes against the commands your printer actually reports, plus the plain G and M codes; up and down walk back through what you have sent.
kitty is the one to use. It and ghostty get the graphics protocol — a real image, and the frame goes out as raw pixels rather than a PNG, which is 2ms of encoding instead of 38. Sixel terminals get sixel; everything else falls back to half-blocks, which works but looks like it.
Any of the sixteen panels can be on the dashboard or on its own tab. The layout follows the width of the terminal, packing two or three across when there is room and falling back to one column when there is not.
Ominous, Mainsail and Forge ship alongside Nord, Gruvbox, Dracula, Tokyo Night, Catppuccin Mocha, Monokai and Solarized. Pick one from Settings, or add your own to the config file.
Zero software needed on your printer. klipper-tui runs purely on your client machine and connects to Moonraker.
Python 3.10 or newer, on Linux or macOS. Nothing is installed on the printer — it only needs to be reachable at the address you already type into Mainsail.
Install in an isolated environment with a global executable:
pipx install klipper-tui
Point klipper-tui to your printer's Moonraker IP or mDNS address:
klipper-tui mainsailos.local
Put the host in your shell config and run it bare. KLIPPER_PORT,
KLIPPER_WEBCAM_URL, KLIPPER_RENDER and
KLIPPER_THEME work the same way.
export KLIPPER_HOST=192.168.1.50
klipper-tui
Fly through tabs and controls without taking your hands off the keyboard.
| Key / Shortcut | Action | Category |
|---|---|---|
| d | Dashboard tab | Navigation |
| g | Graph tab | Navigation |
| c | Console tab | Navigation |
| m | Move tab — jog, Z offset, position, toolpath | Navigation |
| f | Files tab | Navigation |
| b | Mesh tab | Navigation |
| w | Webcam tab | Navigation |
| s | Settings tab | Navigation |
| Ctrl + E | Emergency stop, immediately and without confirming | Safety |
| t | Next theme. Settings has the full list if you would rather pick | Appearance |
| Tab | Complete the command name in the console | Console |
| ↑ / ↓ | Walk back through the commands you have sent | Console |
| Double-click | Print that file, from the Files tab | Files |
| Ctrl + P | Textual's command palette | General |
| q | Quit | General |
Clone or install klipper-tui and control your Klipper machine straight from your shell.