{"id":1288,"date":"2024-01-18T03:57:07","date_gmt":"2024-01-18T02:57:07","guid":{"rendered":"https:\/\/hpjansson.org\/blag\/?p=1288"},"modified":"2024-01-18T17:34:59","modified_gmt":"2024-01-18T16:34:59","slug":"chafa-1-14-all-singing-all-dancing","status":"publish","type":"post","link":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/","title":{"rendered":"Chafa 1.14: All-singing, all-dancing"},"content":{"rendered":"\n<p>Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of <a href=\"https:\/\/hpjansson.org\/chafa\/\">Chafa<\/a> 1.14.0. There are <a href=\"https:\/\/github.com\/hpjansson\/chafa\/releases\/tag\/1.14.0\">release notes<\/a>, but who's got time for that? All the fun stuff is in this post. You should be reading it instead.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pixel perfection<\/h2>\n\n\n\n<p>Images can now be padded instead of stretched to fit their cell extent exactly &#8211;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1224\" height=\"640\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/yehat-view.webp\" alt=\"\" class=\"wp-image-1316\"\/><figcaption class=\"wp-element-caption\"><a href=\"https:\/\/wiki.uqm.stack.nl\/Yehat\">Yehat<\/a> terminal no longer blurry<\/figcaption><\/figure>\n\n\n\n<p>&#8211; so I'll no longer have to explain why our 50kLOC monstrosity couldn't do pixel-perfect output, while <a href=\"https:\/\/gist.github.com\/hackerb9\/a96cea91e6122d09a6c97f5eb797d5fa\">sixcat<\/a> (300LOC) did so effortlessly. Naturally, I had to make this as hard as possible for myself by splicing in padding before and after each row as they're processed for channel reordering and such, but on the plus side, this maximizes cache friendliness and parallelism behind a nice and homogeneous internal API.<\/p>\n\n\n\n<p>You can get the old behavior back with <code>--exact-size off<\/code>. It defaults to <code>auto<\/code>, which will do the right thing (i.e. pad if image fits in viewport without scaling and scaling wasn't explicitly requested).<\/p>\n\n\n\n<p>Another improvement in this vein is that sRGB is <a href=\"http:\/\/www.ericbrasseur.org\/gamma.html\">properly linearized<\/a> in scaling operations now. This is pipelined along with everything else, and should be suitably fast.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Multiplexer passthrough<\/h2>\n\n\n\n<p>Previously, it was impossible to do better than character art inside multiplexers like tmux and GNU Screen. This is no longer the case; kitty has a new trick that allows for persistent raster image placement in these, which we implement. The above mentioned multiplexers have slight differences in their passthrough protocols; we support both with the new <code>--passthrough<\/code> argument.<\/p>\n\n\n\n<p>We also support sixel passthrough. Sixels will be wrecked by multiplexer updates, so this is off by default. You can enable it with e.g. <code>-f sixel --passthrough screen<\/code>. tmux tends to dispose of the image immediately after we exit, so it may be a good idea to use <code>--passthrough tmux -d 5<\/code> there so you get a chance to look at it first.<\/p>\n\n\n\n<p>To my knowledge, Chafa is the only terminal graphics toolkit to offer passthrough for all four combinations of sixel\/kitty and tmux\/screen. I think the iTerm2 protocol would be doable too, <a href=\"https:\/\/github.com\/hpjansson\/chafa\/issues\/166\">if only<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MS Windows compatibility<\/h2>\n\n\n\n<p>It runs pretty well on Windows. You can use it in PowerShell. <a href=\"https:\/\/github.com\/oshaboy\/\">@oshaboy<\/a> added support for ConHost, so it can technically be used on very old Windows versions &#8211; although this hasn't gotten much testing yet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Python bindings<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/chafapy.mage.black\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1224\" height=\"1134\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/chafapy-snake.png\" alt=\"\" class=\"wp-image-1307\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/chafapy-snake.png 1224w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/chafapy-snake-300x278.png 300w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/chafapy-snake-768x712.png 768w\" sizes=\"auto, (max-width: 1224px) 100vw, 1224px\" \/><\/a><figcaption class=\"wp-element-caption\">Strawberry sssnek, courtesy of Erica<\/figcaption><\/figure>\n\n\n\n<p><a href=\"https:\/\/mage.black\/\">Erica Ferrua Edwardsd\u00f3ttir<\/a>'s <a href=\"https:\/\/chafapy.mage.black\/\">amazing Python bindings<\/a> have been around for a while now, yet nary a peep from me on my blag. This shameful deficit stands in contrast to the stunning professionalism of her work. You need to do this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pip install chafa.py<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/chafapy.mage.black\/usage\/installation.html\">Do it now<\/a>. Everything's well structured, the <a href=\"https:\/\/chafapy.mage.black\/\">documentation<\/a> is entertaining and well written, and there's even a <a href=\"https:\/\/chafapy.mage.black\/usage\/tutorial.html\">tutorial<\/a>. It's rare to see a project that simultaneously delivers and channels the spirit of F\/OSS this well. You'll also find it <a href=\"https:\/\/github.com\/GuardKenzie\/chafa.py\">on GitHub<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">JavaScript enablement<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/hectorm\">H\u00e9ctor Molinero Fern\u00e1ndez<\/a> started doing <a href=\"https:\/\/github.com\/hectorm\/chafa-wasm\">WebAssembly builds<\/a>, which means you can now use the Chafa API from JavaScript. Like so:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">npm install chafa-wasm<\/code><\/pre>\n\n\n\n<p>He also made a <a href=\"https:\/\/hectorm.github.io\/chafa-wasm\/\">cool web app<\/a> to show off all the bells and whistles!<\/p>\n\n\n\n<p>Cheerleading aside, I've had no hand in either of these projects. The glory belongs to their respective maintainers, along with all of the praise, stars, code submissions <sup>and issue reports, heh heh.<\/sup><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Art!<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/clort81\">@clort81<\/a> sent me this picture:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1296\" height=\"1488\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-4x.png\" alt=\"\" class=\"wp-image-1289\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-4x.png 1296w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-4x-261x300.png 261w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-4x-768x882.png 768w\" sizes=\"auto, (max-width: 1296px) 100vw, 1296px\" \/><\/figure>\n\n\n\n<p>What's special about it? Well, it's character art!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1341\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x-1920x1341.png\" alt=\"\" class=\"wp-image-1291\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x-1920x1341.png 1920w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x-300x210.png 300w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x-768x536.png 768w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x-1536x1073.png 1536w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png 1927w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<p>You have to zoom in a bit before it becomes obvious; there're only two colors per character cell.<\/p>\n\n\n\n<p>The glyphs are something else, though. You see, @clort81 wasn't happy with the limited offering of block drawing symbols in Unicode, and set out to create <a href=\"https:\/\/hpjansson.org\/misc\/blapinus.pcf.gz\">Blapinus<\/a>, a 6125-glyph (!) hand-pixeled 6&#215;12 PCF font with all the shapes you could ever want.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1806\" height=\"930\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/blapinus-fontforge.png\" alt=\"\" class=\"wp-image-1300\" style=\"width:840px;height:auto\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/blapinus-fontforge.png 1806w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/blapinus-fontforge-300x154.png 300w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/blapinus-fontforge-768x395.png 768w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/blapinus-fontforge-1536x791.png 1536w\" sizes=\"auto, (max-width: 1806px) 100vw, 1806px\" \/><figcaption class=\"wp-element-caption\">Best <a href=\"https:\/\/www.unicode.org\/faq\/private_use.html\">PUA<\/a><\/figcaption><\/figure>\n\n\n\n<p>Plug that into your terminal (and Chafa), et voil\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo cp blapinus.pcf.gz \/usr\/share\/fonts\/misc\/\nxterm -font -blap-*<\/code><\/pre>\n\n\n\n<p>Note that your fonts may live somewhere else, so relocate accordingly. Then inside XTerm, run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">chafa -f symbols --glyph-file blapinus.pcf.gz --symbols imported hello.png<\/code><\/pre>\n\n\n\n<p>If you see strange symbols in your output, you can try excluding some wide and ambiguous code points, e.g. <code>--symbols imported-wide-ued00..uffff<\/code>.<\/p>\n\n\n\n<p>You can probably set this up in other terminals and display servers too, but know that it could be a long and winding path you're going down. Traveler beware. Or push the pedal to the metal and write a trip report. I'd love to read it.<\/p>\n\n\n\n<p><em>If<\/em> your terminal renders the font correctly, this can even have somewhat practical qualities:<\/p>\n\n\n\n<p>First, it integrates perfectly with tmux and GNU Screen. Redraw, scrollback and editing just works, no passthrough tricks required.<\/p>\n\n\n\n<p>Second, albeit lossy, the compression ratio is surprisingly good. Assuming four bytes per pixel, a 6&#215;12 cell is 288 bytes uncompressed. We turn this into 39 bytes at most (a maximum of 36 bytes for the direct color sequence plus 3 bytes for the UTF-8 character), or an 86% reduction. Not bad, considering the compression dictionary is a 100kB font file.<\/p>\n\n\n\n<p>Deflate will further compress this kind of data by 3\/4, so if you're running this in a compressed ssh session, you can expect the total gain to be about 95%.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prior art!<\/h2>\n\n\n\n<p>I've mentioned <a href=\"https:\/\/cdluminate.github.io\/\">Mo Zhou<\/a>'s work <a href=\"https:\/\/hpjansson.org\/blag\/2019\/08\/05\/chafa-1-2-0\/\">before<\/a>, but I'd be remiss not to bring it up here; they focused their considerable ML skills on a <a href=\"https:\/\/github.com\/hpjansson\/chafa\/tree\/master\/tools\/fontgen\">generator<\/a> that takes a lot of the pain out of the font creation process. Just point it at an image collection, and by the magic of k-means clustering and a minimal increase in your carbon footprint, out pops a new font brimming with delectable puzzle pieces. You get scalable TTF, with SVG as an intermediate format, which is more agreeable with modern rendering stacks. Here it is in VTE:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1499\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-1920x1499.png\" alt=\"\" class=\"wp-image-1305\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-1920x1499.png 1920w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-300x234.png 300w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-768x600.png 768w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-1536x1199.png 1536w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/fontgen-example-1-2048x1599.png 2048w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<p>This ML-generated font makes for a more organic look. There are unfortunately still some artifacts caused &#8211; presumably &#8211; by VTE's cell padding. The generator has offset hacks to work around it, but it's hard to make custom connective glyphs look perfect in every terminal.<\/p>\n\n\n\n<p>You can read more about it in one of our <a href=\"https:\/\/github.com\/hpjansson\/chafa\/issues\/20\">longest-running<\/a> GitHub issues. We're taking it <a href=\"https:\/\/github.com\/hpjansson\/chafa\/issues\/150\">all the way<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cool applications<\/h2>\n\n\n\n<p>Chafa's found its way into the nooks and crannies of many a sweet application by now. I'd especially like to mention these three here:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/github.com\/ansiwave\/ansiwave\"><img loading=\"lazy\" decoding=\"async\" width=\"1316\" height=\"938\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/ansiwave-logo.png\" alt=\"\" class=\"wp-image-1320\" srcset=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/ansiwave-logo.png 1316w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/ansiwave-logo-300x214.png 300w, https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/ansiwave-logo-768x547.png 768w\" sizes=\"auto, (max-width: 1316px) 100vw, 1316px\" \/><\/a><\/figure>\n\n\n\n<p><a href=\"https:\/\/github.com\/ansiwave\/ansiwave\">ANSIWAVE BBS<\/a>, the brainchild of <a href=\"https:\/\/sekao.net\/\">Zach Oakes<\/a>, is written in Nim and contains an embedded build of Chafa for character graphics generation. As a one-time (and sometimes) BBS sysop and denizen, this hits me right in the feels.<\/p>\n\n\n\n<p><a href=\"https:\/\/kyoheiu.dev\/felix\/\">Felix<\/a> is a nice file browser by <a href=\"https:\/\/kyoheiu.dev\/\">Kyohei Uto<\/a> written in Rust. It uses Chafa as an external image previewer.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/ravachol\/kew\">kew<\/a>, a terminal music player by the mysterious <a href=\"https:\/\/github.com\/ravachol\">@ravachol<\/a>, is written in C and uses the native Chafa API to generate cover previews. Development on this has been moving very quickly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A laid-back place to chat about all this stuff<\/h2>\n\n\n\n<p>Issue trackers are formal and supposedly high-SNR. If you'd like a more relaxed place to chat about Chafa, your own programs, terminal graphics (modern or ancient), graphics programming in general or artistic expression related to any of these, drop by our <s>secret business<\/s> Matrix channel, <strong><a href=\"https:\/\/matrix.to\/#\/#chafa:matrix.org\">#chafa:matrix.org<\/a><\/strong>. We'll be waiting.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"300\" src=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2023\/02\/90s-go_for_it.gif\" alt=\"It's the 90s. Go for it.\" class=\"wp-image-1227\"\/><\/figure><\/div>\n\n\n<p>I'm also <a href=\"https:\/\/mstdn.social\/@hpj\">enjoying Mastodon<\/a> these days. Occasional announcements and amusements go there. It's good.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Thanks<\/h2>\n\n\n\n<p>Last, but not least: a big thank you to everyone who wrote code, reported bugs, filed suggestions and helped test this time around. And an extra big thanks to all the packagers and distributors who make the F\/OSS world turn. You're the best.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.<\/p>\n","protected":false},"author":1,"featured_media":1291,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[20,19,22,21,39],"class_list":["post-1288","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computing","tag-ansi-art","tag-chafa","tag-release","tag-terminal-graphics","tag-textmode"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu<\/title>\n<meta name=\"description\" content=\"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu\" \/>\n<meta property=\"og:description\" content=\"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\" \/>\n<meta property=\"og:site_name\" content=\"Et tu, Cthulhu\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-18T02:57:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-18T16:34:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1927\" \/>\n\t<meta property=\"og:image:height\" content=\"1346\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hans Petter Jansson\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hpj\" \/>\n<meta name=\"twitter:site\" content=\"@hpj\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hans Petter Jansson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\"},\"author\":{\"name\":\"Hans Petter Jansson\",\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c\"},\"headline\":\"Chafa 1.14: All-singing, all-dancing\",\"datePublished\":\"2024-01-18T02:57:07+00:00\",\"dateModified\":\"2024-01-18T16:34:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\"},\"wordCount\":1221,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c\"},\"image\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png\",\"keywords\":[\"ansi art\",\"chafa\",\"release\",\"terminal graphics\",\"textmode\"],\"articleSection\":[\"Computing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\",\"url\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\",\"name\":\"Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu\",\"isPartOf\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png\",\"datePublished\":\"2024-01-18T02:57:07+00:00\",\"dateModified\":\"2024-01-18T16:34:59+00:00\",\"description\":\"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.\",\"breadcrumb\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage\",\"url\":\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png\",\"contentUrl\":\"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png\",\"width\":1927,\"height\":1346},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/hpjansson.org\/blag\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chafa 1.14: All-singing, all-dancing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/hpjansson.org\/blag\/#website\",\"url\":\"https:\/\/hpjansson.org\/blag\/\",\"name\":\"Et tu, Cthulhu\",\"description\":\"Personal blag of Hans Petter Jansson: Fun with computers edition\",\"publisher\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/hpjansson.org\/blag\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c\",\"name\":\"Hans Petter Jansson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/33402e5005b34e5ee4ba4f9fd0c5d754f4505d5fb455736e5c585676cb7f2075?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/33402e5005b34e5ee4ba4f9fd0c5d754f4505d5fb455736e5c585676cb7f2075?s=96&d=retro&r=g\",\"caption\":\"Hans Petter Jansson\"},\"logo\":{\"@id\":\"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/hpjansson.org\/\",\"https:\/\/x.com\/hpj\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu","description":"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/","og_locale":"en_US","og_type":"article","og_title":"Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu","og_description":"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.","og_url":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/","og_site_name":"Et tu, Cthulhu","article_published_time":"2024-01-18T02:57:07+00:00","article_modified_time":"2024-01-18T16:34:59+00:00","og_image":[{"width":1927,"height":1346,"url":"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png","type":"image\/png"}],"author":"Hans Petter Jansson","twitter_card":"summary_large_image","twitter_creator":"@hpj","twitter_site":"@hpj","twitter_misc":{"Written by":"Hans Petter Jansson","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#article","isPartOf":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/"},"author":{"name":"Hans Petter Jansson","@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c"},"headline":"Chafa 1.14: All-singing, all-dancing","datePublished":"2024-01-18T02:57:07+00:00","dateModified":"2024-01-18T16:34:59+00:00","mainEntityOfPage":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/"},"wordCount":1221,"commentCount":2,"publisher":{"@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c"},"image":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage"},"thumbnailUrl":"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png","keywords":["ansi art","chafa","release","terminal graphics","textmode"],"articleSection":["Computing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/","url":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/","name":"Chafa 1.14: All-singing, all-dancing - Et tu, Cthulhu","isPartOf":{"@id":"https:\/\/hpjansson.org\/blag\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage"},"image":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage"},"thumbnailUrl":"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png","datePublished":"2024-01-18T02:57:07+00:00","dateModified":"2024-01-18T16:34:59+00:00","description":"Dear friends, comrades, partners in crime and moderate profit! I am pleased to announce the immediate availability of Chafa 1.14.0.","breadcrumb":{"@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#primaryimage","url":"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png","contentUrl":"https:\/\/hpjansson.org\/blag\/wp-content\/uploads\/2024\/01\/face-eyes-16x.png","width":1927,"height":1346},{"@type":"BreadcrumbList","@id":"https:\/\/hpjansson.org\/blag\/2024\/01\/18\/chafa-1-14-all-singing-all-dancing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hpjansson.org\/blag\/"},{"@type":"ListItem","position":2,"name":"Chafa 1.14: All-singing, all-dancing"}]},{"@type":"WebSite","@id":"https:\/\/hpjansson.org\/blag\/#website","url":"https:\/\/hpjansson.org\/blag\/","name":"Et tu, Cthulhu","description":"Personal blag of Hans Petter Jansson: Fun with computers edition","publisher":{"@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hpjansson.org\/blag\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/a86f9dc39a36a8184d6e6f9a759f235c","name":"Hans Petter Jansson","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/33402e5005b34e5ee4ba4f9fd0c5d754f4505d5fb455736e5c585676cb7f2075?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/33402e5005b34e5ee4ba4f9fd0c5d754f4505d5fb455736e5c585676cb7f2075?s=96&d=retro&r=g","caption":"Hans Petter Jansson"},"logo":{"@id":"https:\/\/hpjansson.org\/blag\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/hpjansson.org\/","https:\/\/x.com\/hpj"]}]}},"_links":{"self":[{"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/posts\/1288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/comments?post=1288"}],"version-history":[{"count":33,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/posts\/1288\/revisions"}],"predecessor-version":[{"id":1332,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/posts\/1288\/revisions\/1332"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/media\/1291"}],"wp:attachment":[{"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/media?parent=1288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/categories?post=1288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hpjansson.org\/blag\/wp-json\/wp\/v2\/tags?post=1288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}