<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CLI on NoRaincheck</title><link>https://noraincheck.github.io/tags/cli/</link><description>Recent content in CLI on NoRaincheck</description><generator>Hugo</generator><language>en-US</language><copyright>NoRaincheck</copyright><lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://noraincheck.github.io/tags/cli/index.xml" rel="self" type="application/rss+xml"/><item><title>Inpainting with Generative AI</title><link>https://noraincheck.github.io/posts/inpainting-gen-ai/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/inpainting-gen-ai/</guid><description>&lt;h2 id="inpainting-with-generative-ai"&gt;Inpainting with Generative AI&lt;/h2&gt;&#10;&lt;p&gt;If anything, trying to do generative AI (images) via CLI is unusually &amp;lsquo;hard&amp;rsquo;. Mostly because most flows use ComfyUI. I have found ComfyUI to be great when trying things out, or doing things interactively.&lt;/p&gt;&#10;&lt;p&gt;The easiest way to use CLI/scripting has definitely been &lt;code&gt;stable-diffusion.cpp&lt;/code&gt;: &lt;a href="https://github.com/leejet/stable-diffusion.cpp"&gt;https://github.com/leejet/stable-diffusion.cpp&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;For inpainting, it looks like the below&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;./bin/sd-cli &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; --diffusion-model flux-2-klein-9b-Q4_0.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; --vae flux2_dev_diffusion_pytorch_model.safetensors &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; --llm Qwen3-8B-Q3_K_M.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; --init-img bench.jpg &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; --mask dog-bench-mask.png &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; -p &lt;span class="s2"&gt;&amp;#34;a lovely dog&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; --cfg-scale &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; --sampling-method euler &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -t &lt;span class="m"&gt;24&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; --color &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; --steps &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; -W &lt;span class="m"&gt;512&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt; --vae-tiling &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt; --vae-tile-overlap 0.125 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt; -o dog-lovely-bench.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What is important (to me) is that I find that binary masks that &amp;lsquo;grows a bit&amp;rsquo; is better than providing a fuzzy mask, on my hardware this runs reasonably quickly (~15s per step at 512x512).&lt;/p&gt;</description></item><item><title>Starting Up Matrix with Docker Compose</title><link>https://noraincheck.github.io/posts/starting-up-matrix-with-docker-compose/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/starting-up-matrix-with-docker-compose/</guid><description>&lt;h2 id="starting-up-matrix-with-docker-compose"&gt;Starting Up Matrix with Docker Compose&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;March 2026&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Matrix has a lot of complicated self-hosting docs, mainly to do with federation&#10;and hosting. If you&amp;rsquo;re just self-hosting and not worried about setting up&#10;ingresses/federating, its actually fairly simple to setup Matrix. Here is a&#10;&lt;code&gt;docker-compose.yml&lt;/code&gt; file that will do it. The only bit of configuration is to&#10;pull up the &lt;code&gt;element_config.json&lt;/code&gt; though that can be left as default values (you&#10;can override them later)&lt;/p&gt;</description></item><item><title>Thoughts of ffmpeg and whisper filters</title><link>https://noraincheck.github.io/posts/thoughts-of-ffmpeg-and-whisper-filters/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/thoughts-of-ffmpeg-and-whisper-filters/</guid><description>&lt;h2 id="thoughts-of-ffmpeg-and-whisper-filters"&gt;Thoughts of ffmpeg and whisper filters&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;January 2026&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve been experimenting with &lt;code&gt;ffmpeg&lt;/code&gt; and the &lt;code&gt;whisper&lt;/code&gt; filters. In general I&#10;think its awesome that such functionality exists, but at the same time, I don&amp;rsquo;t&#10;believe it addresses the particular painpoints when you go beyond the &amp;lsquo;obvious&amp;rsquo;&#10;thing.&lt;/p&gt;&#10;&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;&#10;&lt;p&gt;On &lt;code&gt;macos&lt;/code&gt; to install &lt;code&gt;ffmpeg&lt;/code&gt; with the &lt;code&gt;whisper&lt;/code&gt; filters, the easiest way is&#10;via &lt;a href="https://github.com/homebrew-ffmpeg/homebrew-ffmpeg/"&gt;brew&lt;/a&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;brew tap homebrew-ffmpeg/ffmpeg&#10;brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-whisper-cpp&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="considerations"&gt;Considerations&lt;/h3&gt;&#10;&lt;p&gt;One of the cool functionalities of &lt;code&gt;whisper-cpp&lt;/code&gt; is the ability to integrate&#10;voice activity detection (VAD). This works out of the box with the whisper&#10;filter. Unfortunately what does not work is integrating translations, instead it&#10;is expected you create the translation yourself.&lt;/p&gt;</description></item><item><title>Thinking Local LLMs and AI</title><link>https://noraincheck.github.io/posts/thinking-local-llms-and-ai/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/thinking-local-llms-and-ai/</guid><description>&lt;h2 id="thinking-local-llms-and-ai"&gt;Thinking Local LLMs and AI&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Running models locally is nothing new. Infact I&amp;rsquo;ve always had a particular&#10;affinity to &lt;code&gt;llama.cpp&lt;/code&gt;. Recently, there is the newly introduced local text to&#10;image (z-image-turbo) generation model that can &amp;lsquo;comfortable&amp;rsquo; be run locally&#10;(albeit perhaps a bit slow without a dedicated GPU).&lt;/p&gt;&#10;&lt;p&gt;Usage would look something like (using &lt;code&gt;justfile&lt;/code&gt; to template it) using&#10;&lt;code&gt;stable-diffusion.cpp&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;no-cd&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;sd_generate:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PROMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gum input --placeholder &lt;span class="s2"&gt;&amp;#34;prompt for image generation&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;OUTPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;gum input --placeholder &lt;span class="s2"&gt;&amp;#34;output png file&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;DYLD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/dyld/library &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; sd --difffusion-model z_image_turbo-Q4_0.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; --vae /path/diffusion_pytorch_model.safetensors &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; --llm Qwen3-4B-Instruct-2507-Q6_K.gguf &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; --cfg-scale 1.0 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; --offload-to-cpu &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; --diffusion-fa &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -H &lt;span class="m"&gt;512&lt;/span&gt; -W &lt;span class="m"&gt;512&lt;/span&gt; --steps &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PROMPT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On M1 Macbook Pro with offload cpu enabled it will take roughly 2 minutes per a&#10;step, whereas not offloading will improve performance at the cost of memory&#10;consumption (n.b. you should have &lt;code&gt;--offload-to-cpu&lt;/code&gt; turned on if you are using&#10;a low memory variant).&lt;/p&gt;</description></item><item><title>What if I tried self-hosting LLM Code Tooling?</title><link>https://noraincheck.github.io/posts/what-if-i-tried-self-hosting-llm-code-tooling/</link><pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/what-if-i-tried-self-hosting-llm-code-tooling/</guid><description>&lt;h2 id="what-if-i-tried-self-hosting-llm-code-tooling"&gt;What if I tried self-hosting LLM Code Tooling?&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;July 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Currently Code AI tooling is going through a weird cycle. We have the Windsurf x&#10;OpenAI deal falling through, Cursor with some interesting (bad) pricing changes,&#10;Claude Code being a loss leader &amp;ndash; which leads me to think, so what would&#10;self-hosting this on a laptop look like?&lt;/p&gt;&#10;&lt;p&gt;Firstly, there are a lot of options which exist already, however the reality is&#10;that my using of AI auto-complete and agentic mode is fairly limited. With that&#10;in mind, I think my current setup is rooted mainly in the &lt;code&gt;llama.cpp&lt;/code&gt; world of&#10;things.&lt;/p&gt;</description></item><item><title>Maintaining Scripts using Just and Gum</title><link>https://noraincheck.github.io/posts/maintaining-scripts-using-just-and-gum/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/maintaining-scripts-using-just-and-gum/</guid><description>&lt;h2 id="maintaining-scripts-using-just-and-gum"&gt;Maintaining Scripts using Just and Gum&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;April 2025&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve found maintaining shell scripts and aliases to be a bit of a mess. I know&#10;people have their own systems with dotfiles, but it never &amp;lsquo;stuck&amp;rsquo; with me. I&amp;rsquo;m&#10;trialing a new approach using &lt;a href="https://github.com/charmbracelet/gum/"&gt;gum&lt;/a&gt; and&#10;&lt;a href="https://github.com/casey/just"&gt;just&lt;/a&gt;, both which can be installed via &lt;code&gt;brew&lt;/code&gt;.&#10;This makes it so there less memorisation of what different programs do, and&#10;their parameters, since you can control and name variables to a flow that you&#10;like. Combined with &lt;code&gt;just&lt;/code&gt;&amp;rsquo;s ability to target &lt;code&gt;justfile&lt;/code&gt; from different&#10;directories, this makes centralising scripts and cli commands very&#10;straightforward.&lt;/p&gt;</description></item><item><title>Python &amp; TypeScript - in Review (2024)</title><link>https://noraincheck.github.io/posts/python-typescript-in-review-2024/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><guid>https://noraincheck.github.io/posts/python-typescript-in-review-2024/</guid><description>&lt;h2 id="python--typescript---in-review-2024"&gt;Python &amp;amp; TypeScript - in Review (2024)&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;December 2024&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;One thing that I like to stress is the importance of &lt;em&gt;tooling&lt;/em&gt; and&#10;&lt;a href="https://en.wikipedia.org/wiki/Convention_over_configuration"&gt;relying on defaults&lt;/a&gt;.&#10;By being able to speak consistently within ones own projects or using commonly&#10;seen patterns reduces the mental overhead. These could be folder structures or&#10;idioms, especially things which permeate across different programming languages&#10;or frameworks.&lt;/p&gt;&#10;&lt;p&gt;Here are some of my thoughts on Python and TypeScript; coming from someone who&#10;is predominantly a Python developer and does minimal front-end work.&lt;/p&gt;</description></item></channel></rss>