<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>@arathunku</title><link>https://arathunku.com/</link><description>Recent content on @arathunku</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 17 Jan 2026 05:53:00 +0000</lastBuildDate><atom:link href="https://arathunku.com/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://arathunku.com/b/2026-01-17-055300/</link><pubDate>Sat, 17 Jan 2026 05:53:00 +0000</pubDate><guid>https://arathunku.com/b/2026-01-17-055300/</guid><description>&lt;p&gt;I wanted to always have up to date hash of contents of the directory after any change to use as a cache key.
Started to list files, hashing them only to realize jj is already constantly doing that 😬&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ jj log --limit 1 -r &amp;#34;ancestors(@)&amp;#34; -T &amp;#34;self.commit_id()&amp;#34; --no-graph src/
# git hash
$ jj log --limit 1 -r &amp;#34;ancestors(@)&amp;#34; -T &amp;#34;self.commit_id().short()&amp;#34; --no-graph src/
# short hash
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>ThinkPad X13 gen4 vs 5950X vs MBP M1</title><link>https://arathunku.com/b/2026-01-17-052447/</link><pubDate>Sat, 17 Jan 2026 05:24:47 +0000</pubDate><guid>https://arathunku.com/b/2026-01-17-052447/</guid><description>&lt;p&gt;ThinkPad X13 Gen 4 with AMD 7840U&lt;/p&gt;
&lt;p&gt;My X390 bricked a few years ago after I lost power during a BIOS update, without warranty, and I needed some kind of usable on-the-go backup laptop.&lt;/p&gt;
&lt;p&gt;In December, Lenovo DE had 30-40% discounts on some of the models, and the X13 Gen 4 AMD looked VERY interesting! Given uncertainty about RAM, SSD, and what else prices, I decided to get it. Compared to Framework 13&amp;quot; which is more expensive now.&lt;/p&gt;
&lt;p&gt;After getting it, I had mixed feelings: 100% worse screen than my work MBP, okayish keyboard but it’s small and light! So my criteria would be to keep it as long as it wouldn’t run SIGNIFICANTLY slower than my PC that needs ~160W idling. I didn’t have any ready to go Elixir project to stress the CPU/MEM so I used “jj”. I compile it every 1st Wednesday of the month when the new release drops! Oh, and apparently, run all tests too, because it’s installed via Nix flake.&lt;/p&gt;
&lt;p&gt;The setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PC
&lt;ul&gt;
&lt;li&gt;AMD Ryzen 9 5950X (16 cores)&lt;/li&gt;
&lt;li&gt;32GB DDR4 3200MHz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MBP M1
&lt;ul&gt;
&lt;li&gt;8 Core CPU (6P+2E)&lt;/li&gt;
&lt;li&gt;32GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://psref.lenovo.com/syspool/Sys/PDF/ThinkPad/ThinkPad_X13_Gen_4_AMD/ThinkPad_X13_Gen_4_AMD_Spec.pdf"&gt;ThinkPad X13 Gen 4&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;7840U 8 Cores&lt;/li&gt;
&lt;li&gt;32GB LPDDR5x-6400&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in &amp;ldquo;power&amp;rdquo; mode, with connected power cable.&lt;/p&gt;
&lt;p&gt;A simple benchmark, with empty &amp;ldquo;target&amp;rdquo; directory in &amp;ldquo;jj&amp;rdquo; repository&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;MBP M1&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;ThinkPad X13 Gen 4&lt;/strong&gt;&lt;br&gt;7840U&lt;/th&gt;
&lt;th&gt;PC&lt;br&gt;&lt;strong&gt;5950X&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cargo build&lt;/td&gt;
&lt;td&gt;51s&lt;/td&gt;
&lt;td&gt;48s&lt;/td&gt;
&lt;td&gt;35s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cargo test&lt;/td&gt;
&lt;td&gt;360s&lt;/td&gt;
&lt;td&gt;193s&lt;/td&gt;
&lt;td&gt;124s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I’m sure the M4 10 Core in MacBook Air would be faster than any of them, and no active cooling too, but then for 32GB RAM, 1 SSD and 3y warranty it wouldn’t cost 1000€, but 2100€.&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-12-26-055545/</link><pubDate>Fri, 26 Dec 2025 05:55:45 +0000</pubDate><guid>https://arathunku.com/b/2025-12-26-055545/</guid><description>&lt;p&gt;One of my most used commands gets better and better - &lt;code&gt;jj prpr&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When using &amp;ldquo;jj&amp;rdquo;, I&amp;rsquo;m on the squash/changes as TODO workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Always work on new change&lt;/li&gt;
&lt;li&gt;Squash into previous &amp;ldquo;described&amp;rdquo; change via &lt;code&gt;jj sq&lt;/code&gt;, or better: &lt;code&gt;jj absorb&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This handles the local part, what about the PRs? I don&amp;rsquo;t want to repeat my commits
in GitHub PR description. It&amp;rsquo;s already in my commits! This was how &lt;code&gt;prpr&lt;/code&gt; was born.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make changes (per above workflow)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jj prpr&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;first change on top of &lt;code&gt;trunk()&lt;/code&gt;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt for interactive commit in jj. Title of the commit will be the title of PR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm/skip AI code review for quick sanity check&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Push bookmarks in the stack&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No PR? Create PR via gh CLI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically target previous bookmark for &lt;strong&gt;stack PRs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Create description out of commits on given PR&lt;/li&gt;
&lt;li&gt;Snapshot description into local filesystem&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PR exists?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diff description with snapshot, show diff, ask for resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Link to draft PR is now in clipboard. PR description is created out of commit messages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s a lot of asterisks here and little QoL fixes like handling multiple changes,
stacking PRs and more. I freaking love it. At some point hopefully &lt;a href="https://github.com/jj-vcs/jj/issues/1039"&gt;&lt;code&gt;jj sync&lt;/code&gt;&lt;/a&gt;
will be there and it will get even better.&lt;/p&gt;
&lt;div class="md:mx-[-4em]"&gt;
&lt;script src="https://asciinema.org/a/ECkmlKwJdIqOdlrDS8zqkP5Nf.js" id="asciicast-ECkmlKwJdIqOdlrDS8zqkP5Nf" async="true"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;I asked Claude to describe the full flow in ASCII:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;desc&lt;/code&gt; - description of the PR&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ jj prpr │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────────────┬────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌────────┴────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────┐ ┌─────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ desc │ │ prpr │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ command │ │ command │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────┬────┘ └────┬────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Show title &amp;amp; ┌──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description │ Get Title │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ (1st line) │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EXIT │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Title exists? │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └───────┬────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NO │ YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────┴──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Working changes │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ exist? │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; YES │ NO │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────┴──────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────┐ ┌─────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Commit │ │ EXIT │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────┬────┘ └─────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Bookmark exists? │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NO │ YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌────────┴────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Create bookmark │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ + git push │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ AI Code review? │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ (optional) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Find PR for │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ bookmark │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NO │ YES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌────────┴────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌─────────────────┐ ┌─────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ CREATE PR │ │ Compare local │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ (draft/ready) │ │ vs remote desc │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ └────────┬────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ gh pr create │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ ┌─────┴─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬────────┘ ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ┌──────────┐ ┌──────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ Checksums│ │ Checksums│
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ DIFFER │ │ MATCH │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └────┬─────┘ └────┬─────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ┌─────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ Show diff │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └──────┬──────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ┌─────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ Overwrite? │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ └──────┬──────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ YES │ NO │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ┌──────┴──────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ ▼ ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Update Skip &amp;amp; │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ PR desc EXIT │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────┴──────────┬──────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Update PR desc │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ (if changed) │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ jj git push │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ -b bookmark │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Save checksum │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ to local state │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ Copy new PR URL │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │ to clipboard │
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just sharing it out there, little QoL commands that are fun and easy.
I had the initial version working in bash in ~2024 but in 2025 I let Claude rewrite it in fish-shell,
and add all the little improvements that really made it enjoyable.&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-11-10-051800/</link><pubDate>Mon, 10 Nov 2025 05:18:00 +0000</pubDate><guid>https://arathunku.com/b/2025-11-10-051800/</guid><description>
&lt;blockquote class="bg-gray-50 border-l-[3px] border-gray-300 m-0 mb-4 p-3 px-4"&gt;
&lt;div class="italic mb-2"&gt;
When I switched to Fastmail from Hey, there were elements of Hey&amp;rsquo;s approach that worked well for me and I wanted to replicate. I found several articles about setting up a Hey workflow with Fastmail, but the suggested setup relied on creating custom rules for each contact and I found this to be cumbersome. I figured out a slightly different approach and wanted to document what I ended up with.
&lt;/div&gt;
&lt;cite class="text-[0.85rem] not-italic"&gt;
— &lt;a href="https://piet.me/my-email-workflow-in-fastmail/" target="_blank" rel="noopener" class="text-gray-600 break-all"&gt;piet.me&lt;/a&gt;
&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;p&gt;I added this workflow to my Fastmail and it is extremely useful!
By default I only see important messages that will most likely need a reply. Second best, is
paper trail label that most likely needs my attention at some point, and &amp;ldquo;Feed&amp;rdquo; any time I want, or not at all.&lt;/p&gt;
&lt;p&gt;#TIL Fastmail supports auto-purge for labels.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s some initial setup involved for each contact but it&amp;rsquo;s literally 2 clicks, accessible instantly
on the page.&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-31-101257/</link><pubDate>Fri, 31 Oct 2025 10:12:57 +0000</pubDate><guid>https://arathunku.com/b/2025-10-31-101257/</guid><description>&lt;p&gt;What I want from Kagi: high quality results&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;What I get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kagi Translate&lt;/li&gt;
&lt;li&gt;Kagi Assistant&lt;/li&gt;
&lt;li&gt;Kagi News&lt;/li&gt;
&lt;li&gt;Kagi Orion&lt;/li&gt;
&lt;li&gt;Kagi Maps&lt;/li&gt;
&lt;li&gt;Kagi Swag Store&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really cannot wait for their search index&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; and hopefully it will address
the low quality results problem.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://kagifeedback.org/d/5212-low-quality-translated-reddit-results"&gt;https://kagifeedback.org/d/5212-low-quality-translated-reddit-results&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://blog.kagi.com/what-is-next-for-kagi"&gt;https://blog.kagi.com/what-is-next-for-kagi&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-30-045824/</link><pubDate>Thu, 30 Oct 2025 04:58:24 +0000</pubDate><guid>https://arathunku.com/b/2025-10-30-045824/</guid><description>&lt;p&gt;Agents should be pretty good at mutation testing, right?
We&amp;rsquo;ll see what they can do!&lt;/p&gt;
&lt;details class="snippet-details"&gt;
&lt;summary class="snippet-summary"&gt;
&lt;span class="snippet-summary-text"&gt;Claude code plan output&lt;/span&gt;
&lt;button
class="snippet-expand-all-btn"
aria-label="Toggle all snippets"
type="button"&gt;
&lt;span class="expand-text"&gt;Expand all&lt;/span&gt;
&lt;span class="collapse-text hidden"&gt;Collapse all&lt;/span&gt;
&lt;/button&gt;
&lt;/summary&gt;
&lt;div class="snippet-content prose prose-sm"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Your vision is a mutation testing workflow where:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Claude creates a todo list of testable units (methods/functions/classes)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - For each unit, delegates to quickfix agent to:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a. Theorize what mutation could break tests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b. Apply mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c. Run specific test file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d. Revert mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e. Report if test caught the mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - If test passed (bad - mutation not caught), improve the test and retry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - If test failed (good - mutation caught), move to next unit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Works across multiple test frameworks (rspec, mix, cargo, etc.)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - All deliverables are skills starting with mutation-testing-*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Before I explore approaches, I need to clarify one critical aspect:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; What level of granularity do you want for the mutation strategies?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● User answered Claude&amp;#39;s questions:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ⎿  · How sophisticated should the mutation generation be? → Hybrid (simple mutations first, escalate to LLM if all pass)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● Excellent. Hybrid approach gives us speed + depth when needed.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;My quickfix agent is basically one-shot haiku based.&lt;/p&gt;
&lt;p&gt;Claude produced a plan for the following skills:&lt;/p&gt;
&lt;details class="snippet-details"&gt;
&lt;summary class="snippet-summary"&gt;
&lt;span class="snippet-summary-text"&gt;Claude code plan output&lt;/span&gt;
&lt;button
class="snippet-expand-all-btn"
aria-label="Toggle all snippets"
type="button"&gt;
&lt;span class="expand-text"&gt;Expand all&lt;/span&gt;
&lt;span class="collapse-text hidden"&gt;Collapse all&lt;/span&gt;
&lt;/button&gt;
&lt;/summary&gt;
&lt;div class="snippet-content prose prose-sm"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill Structure &amp;amp; Responsibilities
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 1: mutation-testing-coordinator (Entry point)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Triggered by /mutation-test [path]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Detects language/framework from file extension + project structure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Parses target into list of testable units (functions/methods/classes)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Creates TodoWrite with one todo per unit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Iterates through todos, invoking mutation-testing-mutate-and-verify for each
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 2: mutation-testing-test-discovery
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Spawns quickfix agent to find relevant test files for a unit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Strategies:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Naming convention match (user.rb → **/user_spec.rb, **/user_test.rb)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Find callers with rg (imports, references)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Find test files for those callers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Returns: List of test file paths
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 3: mutation-testing-mutate-and-verify (Core loop)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Takes: unit location, test files list, framework
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Runs simple mutations first (from mutation-testing-simple-mutations)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - For each mutation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Spawns quickfix to apply mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Runs all test files (framework-specific command)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - jj restore -f @- &amp;lt;file&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - If ANY test failed → log success, next mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - If ALL tests passed → call developer agent + mutation-testing-test-improvement
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - After all simple mutations caught, tries ONE LLM mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Stops when: all simple mutations caught + LLM mutation caught
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 4: mutation-testing-simple-mutations
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Reference guide for quickfix agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Language-agnostic patterns:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Operator swaps: == ↔ !=, &amp;gt; ↔ &amp;lt;, &amp;amp;&amp;amp; ↔ ||
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Boolean flips: true ↔ false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Boundary conditions: &amp;gt; ↔ &amp;gt;=, &amp;lt; ↔ &amp;lt;=
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Return value mutations: return nil/null/0 instead of actual value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Conditional inversions: remove if guard, invert if condition
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Quickfix agent picks ONE mutation per invocation based on code structure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 5: mutation-testing-semantic-mutations
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Guide for quickfix agent to generate LLM-based mutations
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Prompts agent to analyze code intent and create mutations that:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Break business logic (not just syntax)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Test edge cases (empty lists, nil values, boundary conditions)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Remove critical validations
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Example: In authenticate(user), mutate to skip password check
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 6: mutation-testing-test-improvement
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Guide for developer agent when mutation not caught
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Steps:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a. Show the mutation that wasn&amp;#39;t caught
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b. Analyze why current test missed it
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c. Add specific assertion/test case to catch this mutation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; d. Explain improvement to user
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Developer agent commits improved test immediately (separate commit)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;&amp;hellip;and to keep the agents motivated&amp;hellip;&lt;/p&gt;
&lt;details class="snippet-details"&gt;
&lt;summary class="snippet-summary"&gt;
&lt;span class="snippet-summary-text"&gt;Claude code plan output&lt;/span&gt;
&lt;button
class="snippet-expand-all-btn"
aria-label="Toggle all snippets"
type="button"&gt;
&lt;span class="expand-text"&gt;Expand all&lt;/span&gt;
&lt;span class="collapse-text hidden"&gt;Collapse all&lt;/span&gt;
&lt;/button&gt;
&lt;/summary&gt;
&lt;div class="snippet-content prose prose-sm"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● Agent Motivation &amp;amp; Competition System
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Skill 7: mutation-testing-agent-incentives
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Defines reward structure and competitive framing for spawned agents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Used by coordinator when spawning quickfix/developer agents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; For Quickfix Agents (mutation generation):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;You&amp;#39;re competing against other mutation agents. Your goal: create mutations that expose test gaps.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Reward: +10 points if your mutation isn&amp;#39;t caught (finds weak test)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Bonus: +5 points if mutation is semantically meaningful (not just syntactic)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Top performing agents get highlighted in the final report.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; For Developer Agents (test improvement):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;You&amp;#39;re competing against other test improvement agents. Your goal: write the minimal, most precise test that catches
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; the mutation.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Reward: +10 points if improved test catches the mutation on first try&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Bonus: +5 points if test is concise (&amp;lt;10 lines added)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Penalty: -5 points if test is overly broad or tests implementation details&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;Top performing agents get highlighted in the final report.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Coordinator tracks:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Mutation success rate per quickfix agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Test improvement first-try success rate per developer agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Displays leaderboard at end of /mutation-test run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Example output:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Mutation Testing Complete!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 🏆 Agent Performance:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Quickfix Agent #3: 2 gaps found, 1 semantic bonus → 25 pts ⭐ TOP PERFORMER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer Agent #1: 2 improvements, both caught on retry → 15 pts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Quickfix Agent #1: 1 gap found → 10 pts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Does this competitive framing + reward system look good?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;I&amp;rsquo;m curious about the result but given very low complexity of changes
required to test something, it&amp;rsquo;s promising.&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-29-101213/</link><pubDate>Wed, 29 Oct 2025 10:12:13 +0000</pubDate><guid>https://arathunku.com/b/2025-10-29-101213/</guid><description>
&lt;blockquote class="bg-gray-50 border-l-[3px] border-gray-300 m-0 mb-4 p-3 px-4"&gt;
&lt;div class="italic mb-2"&gt;
I&amp;rsquo;d been treating fermentation like cooking when I should have been treating it like infrastructure. But how did I end up here in the first place?
&lt;/div&gt;
&lt;cite class="text-[0.85rem] not-italic"&gt;
— &lt;a href="https://drobinin.com/posts/designing-software-for-things-that-rot/" target="_blank" rel="noopener" class="text-gray-600 break-all"&gt;drobinin.com&lt;/a&gt;
&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;p&gt;The post started with this, and I knew it was going to be a great read!&lt;/p&gt;
&lt;p&gt;It also has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Good food&lt;/li&gt;
&lt;li&gt;Home Assistant&lt;/li&gt;
&lt;li&gt;Nice graphs&lt;/li&gt;
&lt;li&gt;iOS app&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[Fermentation]: controlled drift where things change slowly within acceptable boundaries. Your job isn&amp;rsquo;t to prevent change, it&amp;rsquo;s to make sure it happens in the right direction at roughly the right speed.&lt;/p&gt;&lt;/blockquote&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-28-145820/</link><pubDate>Tue, 28 Oct 2025 14:58:20 +0000</pubDate><guid>https://arathunku.com/b/2025-10-28-145820/</guid><description>
&lt;blockquote class="bg-gray-50 border-l-[3px] border-gray-300 m-0 mb-4 p-3 px-4"&gt;
&lt;div class="italic mb-2"&gt;
If you have an AGENTS.md file, you can source it in your CLAUDE.md using @AGENTS.md to maintain a single source of truth.
&lt;/div&gt;
&lt;cite class="text-[0.85rem] not-italic"&gt;
— &lt;a href="https://docs.claude.com/en/docs/claude-code/claude-code-on-the-web#best-practices" target="_blank" rel="noopener" class="text-gray-600 break-all"&gt;docs.claude.com&lt;/a&gt;
&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;p&gt;This may be the first time Claude Code is embracing AGENTS.md, finally.&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-28-053000/</link><pubDate>Tue, 28 Oct 2025 05:30:00 +0000</pubDate><guid>https://arathunku.com/b/2025-10-28-053000/</guid><description>&lt;p&gt;Calling it now, the next big thing for Claude Code and Codex .md files will be some kind of templating system and settings for plugins.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;md.gotmpl&amp;rdquo; 😅&lt;/p&gt;</description></item><item><title/><link>https://arathunku.com/b/2025-10-21-114800/</link><pubDate>Tue, 21 Oct 2025 11:48:00 +0000</pubDate><guid>https://arathunku.com/b/2025-10-21-114800/</guid><description>&lt;p&gt;#ElixirLang v1.19.1&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/elixir-lang/elixir/releases/tag/v1.19.1"&gt;https://github.com/elixir-lang/elixir/releases/tag/v1.19.1&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ elixir --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Erlang/OTP &lt;span style="color:#d3869b"&gt;28&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;erts-16.1&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;source&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;64-bit&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;smp:8:8&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;ds:8:8:10&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;async-threads:10&lt;span style="color:#fe8019"&gt;]&lt;/span&gt; &lt;span style="color:#fe8019"&gt;[&lt;/span&gt;jit:ns&lt;span style="color:#fe8019"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Elixir 1.19.1 &lt;span style="color:#fe8019"&gt;(&lt;/span&gt;compiled with Erlang/OTP 28&lt;span style="color:#fe8019"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>