Chafa: Terminal Graphics for the 21st Century

1 day ago (hpjansson.org)

I learned about Chafa when I found a video editor that runs in the command line with keyboard control - vic - it just lets you insert split markers and when you exit the video is sliced up into the portions. I really like the low-fi nature of scrobbling through the video, it has low brain overhead.

https://github.com/wong-justin/vic

  • Wow. Thanks for this recommendation! I have multiple times half-baked something like this using ffmpeg to dump out thumbnails and make cuts.

I use chafa extensively, and it really is the best tool for terminal graphics in my opinion.

I use it as a fallback option for terminals without proper terminal graphics support in my TUI Jupyter client, euporie.

There are Python bindings available: https://github.com/GuardKenzie/chafa.py

Why can't we have proper graphics on terminal? years ago I remember being able to use graphics.h to draw on MS-DOS terminal and print letters on it (text mode).

  • Most popular terminals now have support for `kitty` graphics protocol which can smoothly and efficiently render raster images. So chafa is a way to get some backwards compatibility for some types of applications that want to show images but may not support that.

  • Did you try notcurses ? [0]

    [0] https://notcurses.com/

    • notcurses is probably the best option for getting the best you can out of a random terminal (see https://github.com/dankamongmen/notcurses/blob/master/TERMIN... which details the status of most terminals people use), but the main thing is to choose a decent terminal that meets your needs. I personally use xterm (after using various other terminals, both "modern" and VTE-based), as I'm on Linux, and I need to connect to various devices (e.g. networking gear) where I need a reliable terminal that handles whatever those devices throw at it. The graphical mechanisms that work for me therefore are sixel and tektronic.

  • There are multiple graphics mechanisms on terminals (both real, and the virtual ones that have replaced them), the issue is which ones your terminal supports (probably none, given most terminal/libraries are bad at supporting features that have been around since the 80s), and which libraries you are using to draw them.

I use chafa in term.everything[0], and I have nothing but good things to say about it! hpjansson is a great maintainer too, if anything even seems like it's wrong with chafa he will chime in with a fix or a suggestion[1] (I'm not the only one he does this with too [2][3]). I would definitely recommend this lib for anyone doing terminal graphics.

[0]https://github.com/mmulet/term.everything

[1]https://github.com/mmulet/term.everything/issues/5

[2]https://lobste.rs/s/qh6lil/chafa_terminal_graphics_for_21st_...

[3]https://github.com/wong-justin/vic/issues/1#issue-2586904982

If you want some hilarious insanity: t try explaining ascii/terminal rendering to a text llm and see how it struggles

Discovered this recently when I wanted to set my perfect retro feeling company logo onto the MOTD of some hardware so we'd have it on the serial port.