<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tools on Inanna Malick</title>
    <link>https://recursion.wtf/tags/tools/</link>
    <description>Recent content in Tools on Inanna Malick</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 13 Nov 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://recursion.wtf/tags/tools/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Detect: a readable alternative to find/exec/grep</title>
      <link>https://recursion.wtf/posts/detect/</link>
      <pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/detect/</guid>
      <description>&lt;h1 id=&#34;detect&#34;&gt;Detect&lt;/h1&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://crates.io/crates/detect&#34;&gt;detect&lt;/a&gt; because I was tired of looking up &lt;code&gt;find&lt;/code&gt;/&lt;code&gt;grep&lt;/code&gt;/&lt;code&gt;xargs&lt;/code&gt; syntax on Stack Overflow every time I needed to search my filesystem in any nontrivial way. It&amp;rsquo;s a Rust tool that uses a concise and readable expression language to build queries that output matching file paths.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d like to follow along, run &lt;code&gt;cargo install detect&lt;/code&gt; and try it yourself. You&amp;rsquo;ll need the Rust toolchain, which you can install using &lt;a href=&#34;https://rustup.rs/&#34;&gt;rustup&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here are some examples:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# every rust file modified in the last week that imports tokio _and_ serde (mean time: 179ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext == rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use tokio&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use serde&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; modified &amp;gt; -7d&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cargo.toml files with package edition 2018 (mean time: 42ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name == &amp;#34;Cargo.toml&amp;#34; &amp;amp;&amp;amp; toml:.package.edition == 2018&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# non-image files with size over 0.5MB (mean time: 303ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;size &amp;gt; 0.5mb &amp;amp;&amp;amp; !ext in [png, jpeg, jpg]&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# frontend code referencing JIRA tickets (mean time: 43ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext in [ts, js, css] &amp;amp;&amp;amp; content ~= JIRA-[0-9]+&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Fresh Eyes as a Service: Using LLMs to Test CLI Ergonomics</title>
      <link>https://recursion.wtf/posts/llms_as_ux_testers/</link>
      <pubDate>Fri, 15 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/llms_as_ux_testers/</guid>
      <description>&lt;p&gt;Every tool has a complexity budget. Users will only devote so much time to understanding what a tool does and how before they give up. You want to use that budget on your innovative new features, not on arbitrary or idiosyncratic syntax choices.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the problem: you can&amp;rsquo;t look at it with fresh eyes and analyze it from that perspective. Finding users for a new CLI tool is hard, especially if the user experience isn&amp;rsquo;t polished. But to polish the user experience, you need users, you need user feedback, and not just from a small group of power users. Many tools fail to grow past this stage.&lt;/p&gt;&#xA;&lt;p&gt;What you really need is a vast farm of test users that don&amp;rsquo;t retain memories between runs. Ideally, you would be able to tweak a dial and set their cognitive capacity, press a button and have them drop their short term memory. But you can&amp;rsquo;t have this, because of &amp;lsquo;The Geneva Convention&amp;rsquo; and &amp;rsquo;ethics&amp;rsquo;. Fine.&lt;/p&gt;&#xA;&lt;p&gt;LLMs provide exactly this. Fresh eyes every time (just clear their context window), adjustable cognitive capacity (just switch models), infinite patience, and no feelings to hurt. Best of all, they approximate the statistically average hypothetical user - their training data includes millions of lines of humans interacting with a wide variety of CLI tools. Sure, they get confused sometimes, but that&amp;rsquo;s exactly what you want. That confusion is data, and the reasoning chain that led to it is available in the LLM&amp;rsquo;s context window.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
