<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manuel</title>
    <description>The latest articles on DEV Community by Manuel (@mmasias).</description>
    <link>https://dev.to/mmasias</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2776472%2Fa6d1df05-7743-4db8-9368-bfef593af77e.jpg</url>
      <title>DEV Community: Manuel</title>
      <link>https://dev.to/mmasias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mmasias"/>
    <language>en</language>
    <item>
      <title>pyQuejica: because "Synthesizing..." is too dignified</title>
      <dc:creator>Manuel</dc:creator>
      <pubDate>Wed, 29 Apr 2026 22:24:03 +0000</pubDate>
      <link>https://dev.to/mmasias/pyquejica-because-synthesizing-is-too-dignified-167f</link>
      <guid>https://dev.to/mmasias/pyquejica-because-synthesizing-is-too-dignified-167f</guid>
      <description>&lt;p&gt;Years ago, when the first robot vacuums hit the market — Roombas, Congas, and their kind — I had an idea I called &lt;strong&gt;Proyecto Quejica&lt;/strong&gt; (Project Whiner): give them a voice. Not a helpful voice. A &lt;em&gt;complaining&lt;/em&gt; voice.&lt;/p&gt;

&lt;p&gt;Imagine your vacuum cleaning the floor while muttering &lt;em&gt;"How many times do I have to tell you to clean up after yourself..."&lt;/em&gt; or &lt;em&gt;"This place is an absolute disaster..."&lt;/em&gt;. And when it bumped into the leg of a chair — as those early models constantly did — it would hurl an insult into the air.&lt;/p&gt;

&lt;p&gt;No utility whatsoever. That was the point. Some things deserve to exist purely for the pleasure of making them.&lt;/p&gt;

&lt;p&gt;I forgot about that idea for years. Then I started using Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with "Synthesizing..."
&lt;/h2&gt;

&lt;p&gt;While Claude Code is reasoning or executing tools, it shows you a rotating label. A status indicator. Something to let you know the model is working.&lt;/p&gt;

&lt;p&gt;The labels look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Synthesizing... Reflecting... Analyzing... Planning...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are, frankly, too polished. Too corporate. They describe the activity with the dignity of a consultant's slide deck. And they are hardcoded in the bundle.&lt;/p&gt;

&lt;p&gt;When I first noticed this I thought: &lt;em&gt;what if they didn't have to be?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the labels in Claude Code
&lt;/h2&gt;

&lt;p&gt;Claude Code is distributed as an npm package. The main bundle is a single minified JS file — &lt;code&gt;cli.js&lt;/code&gt; — sitting somewhere in your node_modules. The exact path depends on how you installed it (global npm, nvm, Homebrew), but &lt;code&gt;which claude&lt;/code&gt; and a couple of symlink resolutions will get you there.&lt;/p&gt;

&lt;p&gt;Inside that minified bundle, there's a pattern like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;VAR&lt;/span&gt;&lt;span class="p"&gt;,...&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verbs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;VAR&lt;/code&gt; is the array you're looking for. Find its initialization and you've found the thinking labels.&lt;/p&gt;

&lt;p&gt;The tricky part: newer versions of Claude Code ship as a compiled ELF binary (&lt;code&gt;claude.exe&lt;/code&gt;), not plain JS. The array is still there — as a UTF-8 encoded byte sequence in the binary — but you have to patch it in-place, preserving the exact byte length. Shorter replacement? Pad with spaces. The JS parser inside the runtime ignores them. Longer replacement? You're out of luck — you can't expand a binary without corrupting it. Keep your verbs short.&lt;/p&gt;

&lt;h2&gt;
  
  
  The patch script
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ManuelMasias/pyQuejica/blob/main/patch_claude_verbs.py" rel="noopener noreferrer"&gt;&lt;code&gt;patch_claude_verbs.py&lt;/code&gt;&lt;/a&gt; handles both cases.&lt;/p&gt;

&lt;p&gt;It locates the &lt;code&gt;claude&lt;/code&gt; binary, resolves symlinks, detects whether it's dealing with a JS bundle or an ELF binary, finds the verb array, replaces it, and on macOS applies an ad-hoc codesign so the patched binary runs without Gatekeeper complaints.&lt;/p&gt;

&lt;p&gt;It's idempotent — run it ten times and it only ever patches once, preserving the original backup. It also handles the one real maintenance cost of this whole thing: every &lt;code&gt;npm update&lt;/code&gt; overwrites the bundle and removes the patch. Just run the script again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 patch_claude_verbs.py          &lt;span class="c"&gt;# apply the patch&lt;/span&gt;
python3 patch_claude_verbs.py &lt;span class="nt"&gt;--status&lt;/span&gt; &lt;span class="c"&gt;# show current verbs&lt;/span&gt;
python3 patch_claude_verbs.py &lt;span class="nt"&gt;--restore&lt;/span&gt; &lt;span class="c"&gt;# restore original&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· maldiciendo…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Cursing. While reading your codebase. Honest.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini CLI: a different animal
&lt;/h2&gt;

&lt;p&gt;Gemini CLI uses a different architecture. Instead of one big bundle, the code is split into chunks. There's no central array of thinking labels — instead, specific tool-action strings are scattered across those chunk files:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Searching the web for:"&lt;/em&gt;, &lt;em&gt;"Executing command"&lt;/em&gt;, &lt;em&gt;"Thinking"&lt;/em&gt;...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/ManuelMasias/pyQuejica/blob/main/patch_gemini_verbs.py" rel="noopener noreferrer"&gt;&lt;code&gt;patch_gemini_verbs.py&lt;/code&gt;&lt;/a&gt; scans all the chunk files, finds those strings, and replaces them with a translation dictionary you control:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;TRANSLATIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Thinking&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Firibicundiando&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Searching the web for:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Snooping around the internet about:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Executing command&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Doing the dirty work:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Firibicundiando... (esc to cancel, 2s)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Firibicundiando&lt;/em&gt; is a made-up Spanish word. Morphologically impeccable, semantically empty, expressively perfect. It is, genuinely, a better status indicator than "Thinking".&lt;/p&gt;

&lt;h2&gt;
  
  
  The verb corpus
&lt;/h2&gt;

&lt;p&gt;The current list for Claude Code has 180 verbs. A selection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Physical effort:&lt;/strong&gt; &lt;em&gt;Bufando&lt;/em&gt; (huffing), &lt;em&gt;Resoplando&lt;/em&gt; (puffing), &lt;em&gt;Agonizando&lt;/em&gt; (agonizing), &lt;em&gt;Arrastrándose&lt;/em&gt; (dragging itself)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mental block:&lt;/strong&gt; &lt;em&gt;Cavilando&lt;/em&gt; (brooding), &lt;em&gt;Elucubrando&lt;/em&gt; (speculating wildly), &lt;em&gt;Desvariando&lt;/em&gt; (rambling), &lt;em&gt;Fraguando&lt;/em&gt; (scheming)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despair:&lt;/strong&gt; &lt;em&gt;Claudicando&lt;/em&gt; (giving up) — meta, given the model's name — &lt;em&gt;Naufragando&lt;/em&gt; (sinking), &lt;em&gt;Desmoronándose&lt;/em&gt; (crumbling)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical:&lt;/strong&gt; &lt;em&gt;Refactorizando&lt;/em&gt;, &lt;em&gt;Rollbackeando&lt;/em&gt;, &lt;em&gt;Commiteando&lt;/em&gt;, &lt;em&gt;Defragmentando&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate irony:&lt;/strong&gt; &lt;em&gt;Stakeholdeando&lt;/em&gt;, &lt;em&gt;Onboardeando&lt;/em&gt;, &lt;em&gt;Alineando&lt;/em&gt;, &lt;em&gt;Escalando&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existential:&lt;/strong&gt; &lt;em&gt;Nihilizando&lt;/em&gt;, &lt;em&gt;Epifaniando&lt;/em&gt;, &lt;em&gt;Existiendo&lt;/em&gt;, &lt;em&gt;Absurdizando&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Religious:&lt;/strong&gt; &lt;em&gt;Encomendándose&lt;/em&gt; (commending itself to God), &lt;em&gt;Flagelándose&lt;/em&gt; (flagellating), &lt;em&gt;Mortificándose&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The selection criterion: what would an experienced, slightly cynical software developer actually mutter while doing this task? Some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Mintiendo"&lt;/strong&gt; (lying) — if it appears during a &lt;code&gt;git commit&lt;/code&gt;, that's pure statistical art.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Procrastinando"&lt;/strong&gt; (procrastinating) — breaks the fourth wall. The model admits it's not doing what it should.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Rezando"&lt;/strong&gt; (praying) — implies even the AI isn't sure this is going to work out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Claudicando"&lt;/strong&gt; — the model named Claude, giving up. This one needed to be in the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why bother
&lt;/h2&gt;

&lt;p&gt;There's a version of this post that argues for some deeper point about anthropomorphism, or human-computer interaction, or the semiotics of status indicators in conversational AI.&lt;/p&gt;

&lt;p&gt;I'm not going to make that argument.&lt;/p&gt;

&lt;p&gt;The honest answer is: &lt;em&gt;Synthesizing...&lt;/em&gt; felt too smug. I had a free afternoon and a text editor. The Roomba that mutters insults when it hits the furniture still deserves to exist. And so does a language model that admits it's &lt;em&gt;Rumiando&lt;/em&gt; while it reads your spaghetti code.&lt;/p&gt;

&lt;p&gt;Some things don't need to be useful to be worth doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/mmasias/pyQuejica" rel="noopener noreferrer"&gt;github.com/mmasias/pyQuejica&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;patch_claude_verbs.py&lt;/code&gt; — handles JS bundle and ELF binary, idempotent, macOS codesign&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;patch_gemini_verbs.py&lt;/code&gt; — chunk-based patching for Gemini CLI&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
