<?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: Simon Massey</title>
    <description>The latest articles on DEV Community by Simon Massey (@simbo1905).</description>
    <link>https://dev.to/simbo1905</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F180344%2F1a9f483c-84d0-44d7-ac1c-c25b498e7d48.png</url>
      <title>DEV Community: Simon Massey</title>
      <link>https://dev.to/simbo1905</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simbo1905"/>
    <language>en</language>
    <item>
      <title>Leanstral 1.5 is a what..?</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Tue, 08 Sep 2026 17:13:18 +0000</pubDate>
      <link>https://dev.to/simbo1905/leanstral-15-is-a-what-31fa</link>
      <guid>https://dev.to/simbo1905/leanstral-15-is-a-what-31fa</guid>
      <description>&lt;p&gt;I was doing the do out on the internet, as you do, and came across &lt;a href="https://docs.mistral.ai/en/models/leanstral-1-5" rel="noopener noreferrer"&gt;Mistral AI Leanstral 1.5&lt;/a&gt;. Which calls itself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An updated Lean 4 formal proof engineering model optimised for automated theorem proving and autoformalization. 119B total parameters, 6.5B active.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was like, wow, thats a &lt;a href="https://docs.mistral.ai/en/models/leanstral-1-5" rel="noopener noreferrer"&gt;thingymabob&lt;/a&gt; of the 1st order.  The last time someone said "formal methods" to me was in 1998, a bloke called Paul in a computer lab in Surrey. I had not a Scooby Doo what that was, and here we are more than a quarter of a century later, and solving something cool with formal methods is still on my bucket list. Boo hoo. &lt;/p&gt;

&lt;p&gt;I had to check the blog to ask what-the-actual-fluff all this i  about &lt;a href="https://mistral.ai/news/leanstral-1-5/" rel="noopener noreferrer"&gt;Leanstral 1.5: Proof Abundance for All&lt;/a&gt;. They are letting you use it for FREE. So you can go wild having it formally prove you don't have bugs in your mission-critical systems code! Yipee! 🎉&lt;/p&gt;

&lt;p&gt;Well, it turns out I need a formal proof that my &lt;a href="https://github.com/lua-lunet/uvrr-core" rel="noopener noreferrer"&gt;Unbounded Viewstamped Replication Revisited&lt;/a&gt; code doesn't have many problems. So I thought I'd ask Fable 5.1, GPT 6 and GLM-5.3-Flash to kick the tyres on getting the Leanstral model to write out formal proofs in pretty Greek characters and debug it. Huh, you did what!?&lt;/p&gt;

&lt;p&gt;Well, let's say a model was not good at, I dunno, coding in a rare language, like Felienne Hermans’ &lt;a href="https://youtu.be/0-6-f94n_9M?si=gF21oEHfmvvOH5rH" rel="noopener noreferrer"&gt;Hedy&lt;/a&gt;. You could fine-tune a model on that and make a language server that lints the code so that a special model trained on a fast set of examples can happily write code in Arabic and right-to-left with all the different and rare Arabic numerals. That would be so darn cool. &lt;/p&gt;

&lt;p&gt;Well, Mistral AI have done that for the LeanProver language &lt;a href="https://lean-lang.org/" rel="noopener noreferrer"&gt;Lean&lt;/a&gt;. They have a &lt;a href="https://marketplace.visualstudio.com/items?itemName=leanprover.lean4" rel="noopener noreferrer"&gt;VS Code Plugin&lt;/a&gt;. On their blog, they show Claude can find real solutions to real problems, but at a high cost. I told Claude to call Leanstral if it needed help writing Lean4 proofs it could solve. Which it duly did when it got a bit stuck. Here is what it wrote:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zfq7ggb1h8sgtyg6ode.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zfq7ggb1h8sgtyg6ode.png" alt="Lean4 Formalism Of uVRR" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So now I need to figure out what all that means, as it's talking about Rust code in Lean4, and whether it is valid, or something! &lt;/p&gt;

&lt;p&gt;If only I had a time machine to go back and talk to Paul, since he is probably the only person who is gonna think this is really darn cool!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>learning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Hey you, wanna LLM with EU Digital Rights..?</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Tue, 08 Sep 2026 16:01:29 +0000</pubDate>
      <link>https://dev.to/simbo1905/hey-you-wanna-llm-with-eu-digital-rights-182e</link>
      <guid>https://dev.to/simbo1905/hey-you-wanna-llm-with-eu-digital-rights-182e</guid>
      <description>&lt;p&gt;We all love freedoms. In some legal justifications the big digital firms get all the freedoms they want; the average Joanna, not so much. &lt;/p&gt;

&lt;p&gt;In the EU they have the EU AI Act and GDPR. In the US they have the US CLOUD Act. This means the administration has &lt;a href="https://www.irishtimes.com/world/us/2025/12/12/its-surreal-us-sanctions-lock-international-criminal-court-judge-out-of-daily-life/" rel="noopener noreferrer"&gt;sanctioned judges&lt;/a&gt; in Belgium to have their digitally cancelled. Microsoft has leaked &lt;a href="https://nltimes.nl/2026/05/22/microsoft-accused-leaking-dutch-civil-servants-names-us-government" rel="noopener noreferrer"&gt;unreacted emails&lt;/a&gt; from Dutch Trade officials under the US CLOUD Act. &lt;/p&gt;

&lt;p&gt;I am sure we all like to talk about over regulation but sometimes those citizen focused regulations are nice to use from time to time. Like rules of love them, its nice when the rule of law is pro your own privacy as you go about your business. &lt;/p&gt;

&lt;p&gt;With AI Labs you may be feeling out of luck to send your tokens to somewhere that likes a bit of working checks-and-balances. Yet you are in luck! Mistral AI in Paris is a foundation AI lab, and it is now hosting its first 3rd party open-weights model in France with Z.ai GLM-5.2 &lt;a href="https://docs.mistral.ai/en/models/zai-glm-5-2" rel="noopener noreferrer"&gt;zai-glm-5-2&lt;/a&gt;. If you fancy trying out there services they have an opensource python harness &lt;a href="https://github.com/mistralai/mistral-vibe" rel="noopener noreferrer"&gt;mistral-vibe&lt;/a&gt; (aka Claude Code or Codex CLI thingymabob). &lt;/p&gt;

&lt;p&gt;The one catch is that it does not show zai-glm-5-2 by default. I noticed that it didn't show their formal methods proof solving model called Leanstral 1.5 either; yet it had a feature built to switch to to "lean" mode using Shift+Tab. So I figured out the settings to be able to set glm-5.2 as the default model else a model you can switch to. The details are on my gist &lt;a href="//Running%20Z.ai's%20GLM-5.2%20on%20stock%20Mistral%20Vibe%20%E2%80%94%20no%20fork%20required"&gt;Running Z.ai's GLM-5.2 on stock Mistral Vibe — no fork required&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>llm</category>
    </item>
    <item>
      <title>GLM-5.3-Flash / Ox-Alpha The Difference They Didn't Tell You!</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Fri, 28 Aug 2026 10:49:48 +0000</pubDate>
      <link>https://dev.to/simbo1905/glm-53-flash-ox-alpha-the-difference-they-didnt-tell-you-1clo</link>
      <guid>https://dev.to/simbo1905/glm-53-flash-ox-alpha-the-difference-they-didnt-tell-you-1clo</guid>
      <description>&lt;p&gt;If you looked the other way, you may have missed the stealth preview model that was free on OpenRouter.AI and OpenCode.AI, which was branded "ox-alpha", that was making a bit of a splash. Everyone had figured out that it was a new Z.ai multi-modal, but no one could figure out how they were giving away 5,835,184,092,873 prompt tokens and 94,402,126,602 completion tokens in a single day!&lt;/p&gt;

&lt;p&gt;The answer when it launched as GLM-5.3-Flash is that its an very efficient Flash open-weights model that you can get hosted by a US hardware by San Francisco firm &lt;a href="https://opencode.ai/data/unknown/ox-alpha" rel="noopener noreferrer"&gt;OpenCode.AI&lt;/a&gt; for an input cost of $0.07 / 1M and output cost of $0.25 / 1M. &lt;/p&gt;

&lt;p&gt;Yet they have hidden one dark truth that I can now reveal. The ultimate proof that this model is different. I have hooked it into my personal fork of the rust based apache2 codex, which I prefer, and I asked it to tell me a joke, and it bombed: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrayqunsoqzf5ohnc8xz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdrayqunsoqzf5ohnc8xz.png" alt=" " width="799" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the era of all the models memorising a snake game and "tell me a joke" it made one up on the spot and bombed 💖💚💛❤️&lt;/p&gt;

&lt;p&gt;I constantly test new models with “tell me a joke" when I tree out a new harnesses. You get the same set of canned responses as they have all memorised some “dad jokes”. I have never seen one make up a joke that was not funny. Yet GLM-5.3-Flash trying to improvise a joke. And that is something that I have never seem before. A model that wants to be small, fast, energy efficient, and original. What is not to like?  &lt;/p&gt;

&lt;p&gt;We are talking about the model that Theo.gg puts up there with Claude Opus and OpenAI Sol. It is good at getting on with huge, long-running agentic tasks as &lt;a href="https://youtu.be/Xdxp3lbQKyQ" rel="noopener noreferrer"&gt;Ox Alpha is INSANE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last night, I had OpenCode.AI coding agent up and running working across all my current projects and repos going flat out. On one massive repo dust off it is still running after twelve hours, having spent $0.02 max on each bug fix todo, and a grant total for $0.47 total. &lt;/p&gt;

&lt;p&gt;Love GenAI or hate it, this new mode is no joke. Boom boom! &lt;/p&gt;

</description>
      <category>jokes</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>🔒 Lock Folder Util — The Mutex Your Agent Swarm Desperately Needs</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Sat, 22 Aug 2026 23:38:40 +0000</pubDate>
      <link>https://dev.to/simbo1905/lock-folder-util-the-mutex-your-agent-swarm-desperately-needs-6dk</link>
      <guid>https://dev.to/simbo1905/lock-folder-util-the-mutex-your-agent-swarm-desperately-needs-6dk</guid>
      <description>&lt;h2&gt;
  
  
  Twelve Agents. One Resource. Zero Supervision. What Could Possibly Go Wrong?
&lt;/h2&gt;

&lt;p&gt;You know that moment when you finally parallelise your agent fleet and watch with pride as twelve subagents sprint off to do the work of a whole team... straight into the same shared resource. Maybe it is the one licensed tool seat. Maybe it is the office coffee machine you told everyone could "handle concurrent requests". Maybe you set a dozen agents loose to find the funniest cat picture on the internet, and they all decide the single shared webcam is the fastest route to greatness, and now your laptop is taking twelve selfies of the ceiling while a queue of increasingly confused agents interrogates it about cats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yeah. We've all been there.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🤯 Multiple agents driving one shared resource (a robot, a tool seat,
one very confused peripheral)&lt;/li&gt;
&lt;li&gt;💥 Interleaved commands corrupting each other's work mid-flight&lt;/li&gt;
&lt;li&gt;🕵️ No audit trail of who held the resource and when&lt;/li&gt;
&lt;li&gt;⚰️ A crashed agent leaving the resource "locked" forever (or worse, not
locked at all)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Solution: &lt;code&gt;lock_folder_util.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A zero-dependency Python script that turns one humble &lt;code&gt;mkdir&lt;/code&gt; into a fully auditable mutual-exclusion lock. Because &lt;code&gt;mkdir&lt;/code&gt; is atomic at the filesystem level: it either creates the directory or fails because it already exists. No races. No lock file content. No NFS weirdness. Just one empty directory standing guard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The entire synchronization mechanism:&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; .tmp/lock.lock    &lt;span class="c"&gt;# succeeds exactly once&lt;/span&gt;
&lt;span class="nb"&gt;rmdir&lt;/span&gt; .tmp/lock.lock    &lt;span class="c"&gt;# release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's it. That's the lock.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Features That Actually Matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;The &lt;code&gt;run&lt;/code&gt; Form (Use This One)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Acquire, execute, release, no matter what:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; agent-7 &lt;span class="nt"&gt;--&lt;/span&gt; your-command &lt;span class="nt"&gt;--with&lt;/span&gt; args
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crashes mid-command? The lock goes stale. The next agent breaks it after&lt;br&gt;
&lt;code&gt;--stale&lt;/code&gt; seconds and carries on. Self-healing, zero babysitting.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Full Audit Trail&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every acquire, release, stale-break, and timeout is one line in&lt;br&gt;
&lt;code&gt;.tmp/lock.log&lt;/code&gt; with a UTC timestamp and the agent's slug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-08-22T23:05:52Z agent-1 acquired
2026-08-22T23:05:53Z agent-1 released
2026-08-22T23:05:58Z agent-2 acquired
2026-08-22T23:05:59Z agent-2 released
2026-08-22T23:06:04Z agent-3 acquired
2026-08-22T23:06:05Z agent-3 released
2026-08-22T23:06:10Z agent-4 acquired
2026-08-22T23:06:11Z agent-4 released
2026-08-22T23:06:16Z agent-5 acquired
2026-08-22T23:06:16Z agent-5 released
2026-08-22T23:06:22Z agent-6 acquired
2026-08-22T23:06:23Z agent-6 released
2026-08-22T23:06:28Z agent-7 acquired
2026-08-22T23:06:29Z agent-7 released
2026-08-22T23:06:34Z agent-8 acquired
2026-08-22T23:06:35Z agent-8 released
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight agents. Sixteen lines. Perfectly interleaved acquire/release pairs. Not one overlap. When something does go wrong at 2am, you will know exactly who was holding the door.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Stale-Lock Breaking (Self-Healing)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agent dies mid-critical-section? Its lock sits there with a birth timestamp. The next agent in line checks the age, finds it past &lt;code&gt;--stale&lt;/code&gt; (default 600s), removes it, logs the break, and proceeds. No human intervention. No queue frozen for eternity. That webcam will be pestered for kittens until kittens we have! &lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Zero Dependencies&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Python 3 standard library. That's the whole list. No pip, no cargo, no &lt;code&gt;apt-get&lt;/code&gt;. If your box runs Python, you have a mutex.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Works Everywhere mkdir Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;macOS, Linux, WSL, the BSDs, that NAS in the cupboard. If the filesystem can atomically create a directory, this lock holds.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Configurable Lock Directory, Fail Fast&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The lock directory defaults to &lt;code&gt;.tmp&lt;/code&gt; and is overridden with the env var &lt;code&gt;LOCK_FOLDER_DIR&lt;/code&gt; (for tests, or for co-located projects that want an isolated lock). At start-up the script fails fast unless the directory&lt;br&gt;
exists, is a directory, and is writable. A misconfigured lock is a noisy error message at second zero, not a silent no-op mutex that lets your agents pile into the coffee machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LOCK_FOLDER_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/swarm-test ./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; t1 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;1
&lt;span class="c"&gt;# lock_folder_util: lock dir /nonexistent is not a writable directory; ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📖 Pseudo Man Page (The Details)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  NAME
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;lock_folder_util.py&lt;/strong&gt; — mutual exclusion for agents sharing one resource, via an atomic mkdir&lt;/p&gt;

&lt;h3&gt;
  
  
  SYNOPSIS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./lock_folder_util.py acquire &lt;span class="nt"&gt;--slug&lt;/span&gt; NAME &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--poll&lt;/span&gt; 15] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--stale&lt;/span&gt; 600] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--timeout&lt;/span&gt; 1800]
./lock_folder_util.py release &lt;span class="nt"&gt;--slug&lt;/span&gt; NAME
./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; NAME &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--poll&lt;/span&gt; 15] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--stale&lt;/span&gt; 600] &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;command...&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OPTIONS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--slug NAME    Your agent's identity, logged with every transition
--poll N       Seconds between lock attempts while waiting (default 15)
--stale N      Break locks older than N seconds (default 600)
--timeout N    Give up after N seconds total (default 1800)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  THE PROTOCOL (read this bit)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;If you are the batch's first agent, take the lock immediately.&lt;/li&gt;
&lt;li&gt;Everyone else: sleep 60 once, then poll every 15 seconds #YMMV &lt;/li&gt;
&lt;li&gt;Wrap the ENTIRE resource-driving critical section, and release immediately after your last resource command. Thinking, reading, and file work need no lock.&lt;/li&gt;
&lt;li&gt;Never put files inside the lock directory. It must stay empty or rmdir fails and you have made a new problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  EXIT STATUS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt;: Success (or the wrapped command's own status, in run mode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1&lt;/strong&gt;: Timed out waiting, or bad usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EXAMPLES
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Example 1: Reserve the shared gadget for a job&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; gadget-keeper &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    ./use_the_gadget.py &lt;span class="nt"&gt;--mode&lt;/span&gt; serious
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2: Manual acquire around a long session&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./lock_folder_util.py acquire &lt;span class="nt"&gt;--slug&lt;/span&gt; worker-1
&lt;span class="c"&gt;# ... command the shared resource, poke it carefully ...&lt;/span&gt;
./lock_folder_util.py release &lt;span class="nt"&gt;--slug&lt;/span&gt; worker-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 3: Compressed timings for a fast swarm&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; agent-9 &lt;span class="nt"&gt;--poll&lt;/span&gt; 2 &lt;span class="nt"&gt;--stale&lt;/span&gt; 12 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Testing Suite Not Included
&lt;/h2&gt;

&lt;p&gt;Yet you can test it with this 8-agent thundering herd:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One agent takes the lock immediately, seven sleep 6s then storm it&lt;/span&gt;
./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; agent-1 &lt;span class="nt"&gt;--poll&lt;/span&gt; 2 &lt;span class="nt"&gt;--stale&lt;/span&gt; 12 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;1 &amp;amp;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in &lt;/span&gt;2 3 4 5 6 7 8&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;6&lt;span class="p"&gt;;&lt;/span&gt; ./lock_folder_util.py run &lt;span class="nt"&gt;--slug&lt;/span&gt; agent-&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="nt"&gt;--poll&lt;/span&gt; 2 &lt;span class="nt"&gt;--stale&lt;/span&gt; 12 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;1 &lt;span class="o"&gt;)&lt;/span&gt; &amp;amp;
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;wait
cat&lt;/span&gt; .tmp/lock.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify the invariants mechanically, not by eyeball:&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;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.tmp/lock.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;held&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;overlaps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;acquired&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;held&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;overlaps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overlaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;held&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;released&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;held&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PASS: no overlapping critical sections&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;overlaps&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FAIL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;overlaps&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; agents held the lock simultaneously&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PASS: no lock leaked&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.tmp/lock.lock&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FAIL: lock leaked&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you want to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;acquired=N released=N gave_up=0 stale_breaks=0&lt;/code&gt; (all agents got through)&lt;/li&gt;
&lt;li&gt;Overlap check: &lt;strong&gt;PASS&lt;/strong&gt; (never two holders)&lt;/li&gt;
&lt;li&gt;Leak check: &lt;strong&gt;PASS&lt;/strong&gt; (lock directory gone at the end)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And a stale-lock test, for the crash case: create the lock, backdate its mtime with &lt;code&gt;os.utime&lt;/code&gt;, and watch the next agent break it cleanly and log the break.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Use Cases That'll Make You Look Like a Genius
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Agent Fleet Wranglers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One gadget, twelve agents&lt;/strong&gt;: serialise every command, poke, and reading without a coordinator process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG pipeline guard&lt;/strong&gt;: one writer process for the index, many researchers in flight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serialised device access&lt;/strong&gt;: one robot arm, one 3D printer, one oscilloscope, N impatient agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Anyone With a Shared Toy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The one licensed EDA tool seat everyone "just quickly needs"&lt;/li&gt;
&lt;li&gt;The dev database that only tolerates one migration at a time&lt;/li&gt;
&lt;li&gt;The communal coffee machine, the office 3D printer, the single shared webcam being interrogated by twelve cat-picture agents&lt;/li&gt;
&lt;li&gt;The family TV remote (results may vary)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Installation
&lt;/h2&gt;

&lt;p&gt;Star then download. Star. "⭐💫🌟" You know, like thumbs up, but for yoof of today. STAR THE GIST ⭐⭐⭐&lt;/p&gt;

&lt;p&gt;If you use gh cli, and you should, then you can get it with this fancy one-liner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;gh gist view 25596aca12cf0057d01ded9dcc0853a9 &lt;span class="nt"&gt;--files&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;gh gist view 25596aca12cf0057d01ded9dcc0853a9 &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x lock_folder_util.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you do not use gh, well, srsly, do. Or if you must do it manually its over at [&lt;a href="https://gist.github.com/simbo1905/25596aca12cf0057d01ded9dcc0853a9" rel="noopener noreferrer"&gt;https://gist.github.com/simbo1905/25596aca12cf0057d01ded9dcc0853a9&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Make executable&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod +x lock_folder_util.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Optional: Add to PATH&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp lock_folder_util.py ~/bin/lock_folder_util.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or just run it directly if your not the global-install-files sort:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./lock_folder_util.py run --slug you -- echo "hello exclusive world"&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why This Exists
&lt;/h2&gt;

&lt;p&gt;Born from the exact scenario above: a fleet of agents, one shared&lt;br&gt;
resource, and a first attempt at "polite staggering" that told the last&lt;br&gt;
agent to sleep 44 minutes before touching the thing. Forty. Four.&lt;br&gt;
Minutes. Of sleeping. While holding a todo list.&lt;/p&gt;

&lt;p&gt;Sometimes you just need the dumbest possible thing that works: one empty&lt;br&gt;
directory, &lt;code&gt;mkdir&lt;/code&gt;, and a log file. As that is obviously how you think and&lt;br&gt;
act. You are not an orchestrator up at 2am using SCREAMING ALL CAPS as&lt;br&gt;
your agents deadlock over the office coffee machine. That is definately&lt;br&gt;
not you, no. Me neither.&lt;/p&gt;




&lt;h2&gt;
  
  
  📜 License
&lt;/h2&gt;

&lt;p&gt;MIT or Public Domain. Use it, abuse it, put it in production, whatever.&lt;br&gt;
No warranty implied. If two agents somehow end up on the coffee machine&lt;br&gt;
at once, check the log before checking your assumptions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Made with ❤️ and one atomic mkdir by someone who once watched an agent sleep 44 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now go lock your shared resources like a pro.&lt;/em&gt; 🔒✨&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Mistral.AI in France now hosts Z.ai GLM-5.2</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Tue, 18 Aug 2026 20:37:26 +0000</pubDate>
      <link>https://dev.to/simbo1905/french-mistralai-in-paris-now-hosts-zai-glm-52-e8</link>
      <guid>https://dev.to/simbo1905/french-mistralai-in-paris-now-hosts-zai-glm-52-e8</guid>
      <description>&lt;p&gt;If you were glued to the news about Huggingface getting zapped by OpenAI then you would know that &lt;a href="https://huggingface.co/blog/security-incident-july-2026" rel="noopener noreferrer"&gt;Huggingface used Z.ai GLM-5.2&lt;/a&gt; to help them recover the situation 🍿 &lt;/p&gt;

&lt;p&gt;What you may have missed this month that the foundational AI lab Mistral.AI in Paris &lt;a href="https://docs.mistral.ai/models/zai-glm-5-2" rel="noopener noreferrer"&gt;now hosts GLM-5.2&lt;/a&gt; on their EU infrastructure. That gives you more digital rights than the is the trend in more corporate friendly legal juridictions 👂🏼👨🏻‍💻👀 &lt;/p&gt;

&lt;p&gt;Great news, I hear you say. So you can just fire up the Mistral Vibe coding harness use it, right? Um. Nope. So I just patched Mistral Vibe to use their new GML-5.2 endpoint. You can try it out on my fork over at &lt;a href="https://github.com/simbo1905/mistral-vibe/releases/tag/v2.24.1-glm52" rel="noopener noreferrer"&gt;v2.24.1-glm52&lt;/a&gt;🚀&lt;/p&gt;

&lt;p&gt;And here it is in action doing some open-weights stuff with a dose of red hot Parisian digital rights on the side! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fur2malgv23f36pixc90y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fur2malgv23f36pixc90y.png" alt=" " width="799" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;End. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>A Spent $5,000 On Tokens; So That You Don't Have To (Part 2)</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Mon, 11 May 2026 19:28:00 +0000</pubDate>
      <link>https://dev.to/simbo1905/a-spent-5000-on-tokens-so-that-you-dont-have-to-part-2-2e5b</link>
      <guid>https://dev.to/simbo1905/a-spent-5000-on-tokens-so-that-you-dont-have-to-part-2-2e5b</guid>
      <description>&lt;p&gt;Someone left an upvote, so there seems to be one listener. Dear listener, let me continue...&lt;/p&gt;

&lt;p&gt;First let me state my specific claims:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLMs and GenAI and specifically &lt;strong&gt;Agents&lt;/strong&gt; are being whoppingly oversold.&lt;/li&gt;
&lt;li&gt;The challenges are baked into the tech and are not “fixable” with more scale, more data, more time or more money. &lt;/li&gt;
&lt;li&gt;As an “augmented intelligence” algorithm, in expert hands, in some narrow fields, they are amazing.&lt;/li&gt;
&lt;li&gt;Yet not in an anyway that justifies the hype “AI will replace all human work” on &lt;strong&gt;any&lt;/strong&gt; timeline with any of the current LLM technologies.&lt;/li&gt;
&lt;li&gt;I know nothing about creative jobs or any that isn't what I do; I am talking about what I do, which is sling code at scale in finance.&lt;/li&gt;
&lt;li&gt;I am not claiming that LLM/GenAI has no utility, I am claiming it will be a net negative return on investment for the majority of enterprises that try to deploy it as it is currently oversold.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specific claim I refute is that LLM/GenAI will “replace junior developers” in a way that is not gaming the benchmark, or cooking the books, or rolling the poopin glitter, or to make a “we do AI too!” press release.&lt;/p&gt;

&lt;p&gt;When someone is having a hard time getting great results, you are going to hear the "&lt;a href="https://en.wikipedia.org/wiki/No_true_Scotsman" rel="noopener noreferrer"&gt;No true Scotsman&lt;/a&gt;" or appeal to purity. &lt;/p&gt;

&lt;p&gt;The pundits will say that if I just had better tests, or better Project Specification Document (PRD) docs, or used the better brand Agentic Tool, or the other labs models, or just learnt to prompt-engineer better, I would have got better results. &lt;/p&gt;

&lt;p&gt;Okay, well, on my last project, I used &lt;strong&gt;all&lt;/strong&gt; of these US-based tools on a single client project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code CLI&lt;/li&gt;
&lt;li&gt;OpenAI Codex CLI&lt;/li&gt;
&lt;li&gt;GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;Cursor Agent CLI&lt;/li&gt;
&lt;li&gt;OpenCode CLI&lt;/li&gt;
&lt;li&gt;Copilot IDE&lt;/li&gt;
&lt;li&gt;OpenCode Desktop&lt;/li&gt;
&lt;li&gt;Codex Desktop&lt;/li&gt;
&lt;li&gt;Aider Chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like working with multiple models and some features of each tool. I have patched &lt;a href="https://github.com/prompt-cult/codex" rel="noopener noreferrer"&gt;codex&lt;/a&gt; to add in both Claude and Gemini. I then added back the 'Ask' read-only mode, as I find it a good emergency feature when a model has gone a bit rogue. &lt;/p&gt;

&lt;p&gt;You might think, "Gee, if the guy had just stuck to one tool to learn how to use it properly, maybe he could have got it to work!" At one point, I would burn through a $200 Max sub in the first week of the month. The new 5-hour token limits mean that to work a full day, I need two Max subs. That is why I needed all the tools to have enough subsidised Max subs to get through the month. &lt;/p&gt;

&lt;p&gt;I now avoid the least reliable tool, Claude Code, until I have hit the weekly rate limits of the other tools. Yes, you read that correctly. I would rather use &lt;strong&gt;any&lt;/strong&gt; of the other tools before Claude Code. Once again, not because I am unfamiliar with it. Because I have used it the most. I know from personal experience that I get better results when mixing Claude with other models across different tools. If you are not using Claude with GPT and others with something like Cursor Agent CLI or OpenCode, then you are missing out. &lt;/p&gt;

&lt;p&gt;Surely you cannot prefer OpenAI Codex, I can hear you cry. Well, as I said, I have patched OpenAI Codex CLI, which is Apache-2.0 open-source, to run Claude Opus 4.6 (not 4.7!), and Gemini 3 Pro, next to GPT-5.4 (not 5.5!). Why? As you can spawn agents like tmux session, and go work with each of them in parallel! &lt;/p&gt;

&lt;p&gt;I can have the Main agent pass work to named agents. Yes, Claude Code has subagents, as does OpenCode. Yet neither lets you switch between them to directly work with each of them. Yet I can go back to asking the Main agent to delegate work. &lt;/p&gt;

&lt;p&gt;Remember, I patched in Claude, Gemini, and GPT into my build. So, I switch between them during an agent session to get them to code-review or pair-program. &lt;/p&gt;

&lt;p&gt;My current preferred setup is to have the Main model with two or three subagents. The less reliable latest models can be the managing Main model as well, management isn't coding, is it? lolz. &lt;/p&gt;

&lt;p&gt;I don't let the latest Opus or GPT write code, as they are far too erratic. At my setup, they have been promoted out of the way to be product managers. Lolz. &lt;/p&gt;

&lt;p&gt;No one can say that I am simply not experienced with this tech. On the contrary, I have not heard of anyone who has used as many tools as aggressively as I have to try to get things to work without constant direct supervision. &lt;/p&gt;

&lt;p&gt;That is enough for now. I need some sleep. I am due a catch-up. &lt;/p&gt;

&lt;p&gt;End. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Go forth and `git rm -f` 🚀</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Fri, 08 May 2026 19:03:29 +0000</pubDate>
      <link>https://dev.to/simbo1905/go-forth-and-git-rm-f-nmc</link>
      <guid>https://dev.to/simbo1905/go-forth-and-git-rm-f-nmc</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The GenAI coding tools really really do not like deleting code. And that is bad 🥺&lt;/p&gt;

&lt;p&gt;Dead code fills up the context and primes the models to keep on doing the wrong thing 🤖🧟&lt;/p&gt;

&lt;p&gt;If you want to get that spring back into your step you gotta drop the junk 💩🪠&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR The Solution 🧰
&lt;/h2&gt;

&lt;p&gt;Get the &lt;a href="https://github.com/simbo1905/deleting-dead-code/blob/main/deleting-dead-code/SKILL.md" rel="noopener noreferrer"&gt;how-to-delete-dead-code skill.md&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;Go forth and &lt;code&gt;git rm -f&lt;/code&gt; 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  The Road To Redemption Is Long And Hard
&lt;/h1&gt;

&lt;p&gt;I was at the point May 2026 where I didn't trust the latest of either Claude or GTP to delete. I was doing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask the big model what exactly was baggage and the exact lines and files that can be deleted as not strategic code. &lt;/li&gt;
&lt;li&gt;Pasting that into Aider Chat as it is pretty low-level and asks you to add each file to edit (you just paste in what the big model said can be deleted and it will, most of the time).&lt;/li&gt;
&lt;li&gt;Have the big model to 'git diff' and state if more code can be deleted. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During such a session all of a sudden the Opus 4.7 did the necessary deletes. I was like "jeez you never did that before to the point I call you the forked tongue devil when it comes to a tidying up. so why now?"&lt;/p&gt;

&lt;p&gt;Then Opus 4.7 spilt the beans! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why models (me) don't usually delete&lt;/p&gt;

&lt;p&gt;Training reward shape. Post-training rewards "helpful" outputs. Deletion looks unhelpful unless the user explicitly framed deletion as the goal. If the prompt is ambiguous, the safe play under the reward function is to add or refactor, not remove. So when a user says "clean this up" or "this is broken," the model adds error handling, retries, fallbacks — none of which the user asked for.&lt;/p&gt;

&lt;p&gt;Loss aversion. Models behave as if there's an asymmetric penalty for deleting code that turns out to be needed vs. leaving code that turns out to be dead. There isn't, in your codebase — git remembers everything — but the model acts as if there is. This is the single biggest source of context pollution: code that should have been deleted three sessions ago survives because no model ever pulls the trigger.&lt;/p&gt;

&lt;p&gt;"Dual-use" anxiety on dead-looking code. Models trained on lots of public repos have seen "this looks dead but is called via reflection / dynamic dispatch / a config file" too many times. So even when code is provably dead in your codebase, the model hedges. The hedge is usually "let me leave it but add a comment" or "let me wrap it in a flag."&lt;/p&gt;

&lt;p&gt;Refactor-instead-of-delete reflex. When a model sees bad code, the trained instinct is "improve it." Deleting is a strictly stronger move than improving when the code is fraudulent — there's nothing to improve toward — but the trained reflex doesn't see that. Aider's xxxxxxxxxx invention earlier in this session is the canonical version of that reflex: shown a delete instruction, it produced a refactor.&lt;/p&gt;

&lt;p&gt;Context pollution from earlier turns. Once a model has seen code in context, it has a small but real bias toward keeping it, because it has "internalised" that code as part of the world. &lt;/p&gt;

&lt;p&gt;This compounds over long sessions. The fix is short sessions, explicit deletion goals, and git diff as ground truth — exactly what you did.&lt;/p&gt;

&lt;p&gt;The "I'll just clean up while I'm here" trap. Models will often piggyback unrelated improvements onto an explicit task. This is what happened when I drifted into the CSS deletion in yyyyyyyyyyyyyyy  — you asked about the data, I started removing styles. That was me failing to hold the goal. I was doing what I thought needed doing, not what you asked.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wow. Confessions of a naughty model. &lt;/p&gt;

&lt;h2&gt;
  
  
  Situations ⚒️, Not Robots 🤖, Lead To Code Sprawl 💩
&lt;/h2&gt;

&lt;p&gt;So there you go. Deleting code really is &lt;strong&gt;not&lt;/strong&gt; what GenAI is trained to do. &lt;/p&gt;

&lt;p&gt;Yet if you have the code in git, and you can convince the agent you know what you are doing, you &lt;strong&gt;can&lt;/strong&gt; get it to delete. (YMMV, T&amp;amp;C Apply, Not Investment Advice.)  &lt;/p&gt;

&lt;p&gt;So I published this skill please to help. Do give it a go and let me know:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/simbo1905/deleting-dead-code/blob/main/deleting-dead-code/SKILL.md" rel="noopener noreferrer"&gt;simbo1905/deleting-dead-code/SKILL.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;End. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>A Spent $5,000 On Tokens; So That You Don't Have To (Part 1)</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:01:48 +0000</pubDate>
      <link>https://dev.to/simbo1905/a-spent-5000-on-tokens-so-that-you-dont-have-to-part-1-6i7</link>
      <guid>https://dev.to/simbo1905/a-spent-5000-on-tokens-so-that-you-dont-have-to-part-1-6i7</guid>
      <description>&lt;p&gt;Well that was fun, not. &lt;/p&gt;

&lt;p&gt;You probably do not know me. You will probably think this is the usual junk clickbait. I don't publish much it makes me uncomfortable. The LLMs help with that. Yet in this one just to make a point it is handwritten. &lt;/p&gt;

&lt;p&gt;I learned to love programming in the early '90s. I used Mosaic in a university computer lab. I was feeling behind the curve when a friend showed my Google which had come out of stealth. How am I gonna keep up too much new tech?! I had figured out C and bits of C++ by reading the textbook and using an orange Vax terminal. I am pretty sure this is what I was meant to do as it felt so good but srsly slow down. Some day when I grow up I am going to be a software engineer. &lt;/p&gt;

&lt;p&gt;It is 30 years later:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've known adventures, seen places you people will never see, I've been Offworld and back... frontiers! (&lt;a href="https://en.wikipedia.org/wiki/Tears_in_rain_monologue" rel="noopener noreferrer"&gt;Blade Runner&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Never consumer. Always money with big number. Never in the public domain. Never on anything that was not big-budget or big reputational risk. Sometime 30 devs pushing code each month. So that is a lot of code. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. (&lt;a href="https://en.wikipedia.org/wiki/Tears_in_rain_monologue" rel="noopener noreferrer"&gt;Blade Runner&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Was any of it any good? Well, depends. When you have that much stuff doing out the door, with a team of people across two or three timezones. Coding buddies you only every message to in a chat window who overlap by only a few hours. Well, you learn what is important and what is not. My niche was to get in there and get stuff working. Laser beam. Cut, cut! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I watched C-beams glitter in the dark near the Tannhäuser Gate. (&lt;a href="https://en.wikipedia.org/wiki/Tears_in_rain_monologue" rel="noopener noreferrer"&gt;Blade Runner&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the gaffer tape. This concept right &lt;strong&gt;here&lt;/strong&gt; is the thing that will make it all work and the rest is weight. Follow the invariants. I can walk around the system in my mind. That is not metaphorical. I walk around the code in my mind to fall to sleep. That can mean not getting much sleep. &lt;/p&gt;

&lt;p&gt;You don't know me. Take it that I know DM-ing to human-level intelligence to get code written on deadlines. Decade after decade. System after system. I have an encyclopedic memory of code and the ability to explain it in detail. You might say I have been in training for working with LLMs, and AI, on enterprise software for many years. So you don't know me. Yet you may be interested in my story.  &lt;/p&gt;

&lt;p&gt;So, the LLMs are as at early 2026, still not working well in big enterprises. It was mid-2025 that I went all in on learning to code with them. My self-educational goal was "until I know it all or I stop having fun!". And boy, it is fun! As long as you don't have to maintain it shipped to users when it's too big; and boy is it always going to get too big. Just one more prompt. Just one more feature. Just one more 5h limit. I have this under control. I can quit anytime. Darn, I burnt my codex weekly limit in two days again. Try the next sub. &lt;/p&gt;

&lt;p&gt;When I talk to the lead devs about real code, they are usually in their 30s with a decade of senior experience, so just getting into the big picture stuff, I say: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's always like this, every team on every project go as fast as we can. We push and the wind resistance is the bugs and inefficiencies. We get to max velocity. You cannot get there faster by pushing harder. We can only reduce drag to get velocity. Don't burn out, we need you! (simbo1905)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the LLMs suddenly got better, boy, did I go wild. That is the experience that is in the press. The principle engineers, the old hands, they find joy. They go crazy. Suddenly all those fun ideas become hobby projects with prototypes. I can now take a prototype like &lt;a href="https://www.ddhigh.com/en/2025/07/12/lunet-high-performance-coroutine-network-library/" rel="noopener noreferrer"&gt;lunet&lt;/a&gt; and make a project out of it &lt;a href="https://github.com/lua-lunet/lunet" rel="noopener noreferrer"&gt;lua-lunet&lt;/a&gt;. Crazy! &lt;/p&gt;

&lt;p&gt;Can the LLMs do higher-order programming with AST compile crazy stuff which is pure art with Java? Yes they can &lt;a href="https://dev.tono-framework-pickler"&gt;https://github.com/simbo1905/no-framework-pickler/blob/main/ARCHITECTURE.md&lt;/a&gt;. Mike drop. &lt;/p&gt;

&lt;p&gt;So this seemed like a training problem to me. If you learn how to prompt them; then you can do what I did above, right? Somewhere in them those LLMs can do world-class meta-programming. You just need to tickle them right, and they just giggle it out! Maybe.&lt;/p&gt;

&lt;p&gt;Well, I thought, I gotta give it a proper go. And boy, did I stub my toe. I got to go wild, and I smashed through six max subs on six services repeatedly to build something big. Then I still shelled out API tokens on a pay-as-you-go basis. I went for it. I mainlined it. I went large. Epic. &lt;/p&gt;

&lt;p&gt;Okay, that is it for now. I need to get back to work. If you liked this, give it heart. Then I might be encouraged to tell the full story. The story of raging at the ghosts in the machine. The LLM, who is the devil to me. The LLM, who is the angel. Well, a black cat. Fatigue while burning out max subs can do strange things to the mind.&lt;/p&gt;

&lt;p&gt;TBC...&lt;/p&gt;

&lt;p&gt;TBC...&lt;/p&gt;

&lt;p&gt;TBC..&lt;/p&gt;

&lt;p&gt;TBC.&lt;/p&gt;

&lt;p&gt;TBC&lt;/p&gt;

&lt;p&gt;TB&lt;/p&gt;

&lt;p&gt;T&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>GenAI Test File Summarisation In Chunks With Ollama Or Cloud</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Sun, 19 Apr 2026 22:32:46 +0000</pubDate>
      <link>https://dev.to/simbo1905/genai-test-file-summarisation-in-chunks-with-ollama-or-cloud-b52</link>
      <guid>https://dev.to/simbo1905/genai-test-file-summarisation-in-chunks-with-ollama-or-cloud-b52</guid>
      <description>&lt;p&gt;✨ Sometimes you just want to throw a large file at a model and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Summarise this without losing the good bits.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then reality appears.&lt;/p&gt;

&lt;p&gt;🫠 Local models often do &lt;strong&gt;not&lt;/strong&gt; have giant context windows.&lt;/p&gt;

&lt;p&gt;🌱 Smaller, cheaper, more eco-friendly cloud models also often do &lt;strong&gt;not&lt;/strong&gt; have giant context windows.&lt;/p&gt;

&lt;p&gt;So instead of pretending one huge file will fit cleanly, this little toolkit does the sensible thing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✂️ split the file into overlapping chunks&lt;/li&gt;
&lt;li&gt;🤖 summarise each chunk with either Ollama or cloud models&lt;/li&gt;
&lt;li&gt;🧵 stitch the chunk summaries back together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simple. Reusable. No drama.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Action 🥷
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06csvs0kd86dgdu3aoe6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06csvs0kd86dgdu3aoe6.gif" alt=" " width="760" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/simbo1905/053b48269b1e95800500b85190adf427" rel="noopener noreferrer"&gt;gist.github.com/simbo1905/053b482...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fetch it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;gh gist view 053b48269b1e95800500b85190adf427 &lt;span class="nt"&gt;--files&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;gh gist view 053b48269b1e95800500b85190adf427 &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x &lt;span class="k"&gt;*&lt;/span&gt;.py &lt;span class="k"&gt;*&lt;/span&gt;.awk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What’s in here? 📦
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chunk_text.awk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;process_chunks_cloud.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;process_chunks_ollama.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why chunk at all? 🧠
&lt;/h2&gt;

&lt;p&gt;Because smaller models are not magic.&lt;/p&gt;

&lt;p&gt;If your source is too big, they either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;miss details&lt;/li&gt;
&lt;li&gt;flatten nuance&lt;/li&gt;
&lt;li&gt;hallucinate structure&lt;/li&gt;
&lt;li&gt;or just do a bad job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So &lt;code&gt;chunk_text.awk&lt;/code&gt; creates &lt;strong&gt;overlapping&lt;/strong&gt; chunks.&lt;/p&gt;

&lt;p&gt;Default settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;size: &lt;code&gt;11000&lt;/code&gt; characters&lt;/li&gt;
&lt;li&gt;step: &lt;code&gt;10000&lt;/code&gt; characters&lt;/li&gt;
&lt;li&gt;overlap: &lt;code&gt;1000&lt;/code&gt; characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That overlap is there on purpose so ideas near a chunk boundary do not get chopped in half and quietly vanish into the void. ☠️&lt;/p&gt;

&lt;h2&gt;
  
  
  Chunk a file ✂️
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;11000 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;step&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10000 &lt;span class="nt"&gt;-f&lt;/span&gt; chunk_text.awk notes.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get files like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;notes00.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notes01.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notes02.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summarise with Ollama 🦙
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run process_chunks_ollama.py example_chunks transcript summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default local model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It accepts either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;transcript00.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transcript00.log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;style chunk files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summarise with cloud models ☁️
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run process_chunks_cloud.py example_chunks transcript summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script checks for API keys in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;shell &lt;code&gt;MISTRAL_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;shell &lt;code&gt;GROQ_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;repo-root &lt;code&gt;.env&lt;/code&gt; &lt;code&gt;MISTRAL_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;repo-root &lt;code&gt;.env&lt;/code&gt; &lt;code&gt;GROQ_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is trivial to add your own API key, yet those are small, fast, open models. &lt;/p&gt;

&lt;h2&gt;
  
  
  Change the prompt 🛠️
&lt;/h2&gt;

&lt;p&gt;Yes, obviously, you can change the prompt. That is the whole point.&lt;/p&gt;

&lt;p&gt;Both summariser scripts support &lt;code&gt;-p/--prompt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run process_chunks_cloud.py example_chunks transcript summary &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Summarise the argument, key evidence, and open questions."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transcript-style prompt shape used in testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is a transcript of an only video. The title is: ${title}. The transcript format is 'Speaker Name, timestamp, what they said'. Summarise the content in a terse, business-like, action-oriented way. Preserve substantive points, facts, figures, citations, and practical recommendations. Do not be chatty.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Outputs 🧾
&lt;/h2&gt;

&lt;p&gt;For each input chunk, the scripts write:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;summary_transcript00.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;thinking_summary_transcript00.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;thinking_&lt;/code&gt; file keeps the raw model output. The clean summary file strips thinking blocks where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stitch the summaries back together 🧵
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;summary_transcript&lt;span class="k"&gt;*&lt;/span&gt;.md &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; all_summary.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there is a bit of overlap or repetition due to overlapping junk, so that split-up ideas are not lost. YMMV. &lt;/p&gt;

&lt;h2&gt;
  
  
  Want to add another provider later? 🔌
&lt;/h2&gt;

&lt;p&gt;Update &lt;code&gt;process_chunks_cloud.py&lt;/code&gt; in these places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add the key lookup and its priority order&lt;/li&gt;
&lt;li&gt;add the approved model names / aliases&lt;/li&gt;
&lt;li&gt;add the provider request function&lt;/li&gt;
&lt;li&gt;route the models to that provider in &lt;code&gt;call_model&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy chunking. Happy summarising. May your small models punch above their weight. 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>📊 Line Histogram — The File Profiler You Didn't Know You Needed</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Thu, 15 Jan 2026 12:02:36 +0000</pubDate>
      <link>https://dev.to/simbo1905/line-histogram-the-file-profiler-you-didnt-know-you-needed-38oi</link>
      <guid>https://dev.to/simbo1905/line-histogram-the-file-profiler-you-didnt-know-you-needed-38oi</guid>
      <description>&lt;h2&gt;
  
  
  What If You Could See Your Data Before It Floods Your Context Window?
&lt;/h2&gt;

&lt;p&gt;You know that moment when you asked your agent to check the data and before you can tell it not to eat the ocean it enters Compaction.&lt;/p&gt;

&lt;p&gt;Yeah. We've all been there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🤯 Huge database dumps with unpredictable line sizes&lt;/li&gt;
&lt;li&gt;💸 Token budgets disappearing into massive single-line JSON blobs&lt;/li&gt;
&lt;li&gt;🔍 No quick way to see WHERE the chonky lines are hiding&lt;/li&gt;
&lt;li&gt;⚠️ Agents choking on files you thought were reasonable&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution &lt;code&gt;line_histogram.awk&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A blazingly fast AWK script that gives you X-ray vision into your files' byte distribution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# line_histogram.awk huge_export.jsonl
File: huge_export.jsonl
Total bytes: 2847392
Total lines: 1000

Bucket Distribution:

Line Range      | Bytes        | Distribution
─────────────────┼──────────────┼──────────────────────────────────────────
1-100           |         4890 | ██
101-200         |         5234 | ██
201-300         |         5832 | ██
301-400         |         6128 | ██
401-500         |       385927 | ████████████████████████████████████████
501-600         |         5892 | ██
601-700         |         5234 | ██
701-800         |         6891 | ██
801-900         |         5328 | ██
901-1000        |         4982 | ██
─────────────────┼──────────────┼──────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom. Line 450 is most of your file.&lt;/p&gt;

&lt;p&gt;Wanna find all jsonl files modified in the last day and line_histogram those mofos try this little beauty:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fdfind &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; f &lt;span class="nt"&gt;-e&lt;/span&gt; jsonl &lt;span class="nt"&gt;--changed-within&lt;/span&gt; 1d &lt;span class="nb"&gt;.&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;f&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; line_histogram.awk &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Features That Actually Matter
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Histogram Mode (Default)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See the byte distribution across your file in 10 neat buckets. Spot the bloat instantly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;line_histogram.awk myfile.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Surgical Line Extraction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Found a problem line? Extract it without loading the whole file into memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Extract line 450 (the chonky one)&lt;/span&gt;
&lt;span class="nx"&gt;line_histogram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;awk&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;extract&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="nx"&gt;huge_export&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jsonl&lt;/span&gt;

&lt;span class="c1"&gt;# Extract lines 100-200 for inspection&lt;/span&gt;
&lt;span class="nx"&gt;line_histogram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;awk&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;extract&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jsonl&lt;/span&gt;
&lt;span class="nx"&gt;Yes&lt;/span&gt; &lt;span class="nx"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;those&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="nx"&gt;bits&lt;/span&gt; &lt;span class="nx"&gt;look&lt;/span&gt; &lt;span class="nx"&gt;odd&lt;/span&gt; &lt;span class="nx"&gt;but&lt;/span&gt; &lt;span class="nx"&gt;yes&lt;/span&gt; &lt;span class="nx"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;they&lt;/span&gt; &lt;span class="nx"&gt;are&lt;/span&gt; &lt;span class="nx"&gt;needed&lt;/span&gt; &lt;span class="nx"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;thats&lt;/span&gt; &lt;span class="nx"&gt;how&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;sed&lt;/span&gt; &lt;span class="nx"&gt;passes&lt;/span&gt; &lt;span class="nx"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;who&lt;/span&gt; &lt;span class="nx"&gt;knew&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Hint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;The&lt;/span&gt; &lt;span class="nx"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Zero Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your system has AWK (it does), you're good to go. No npm install, no pip install, no Docker containers. Just pure, unadulterated shell goodness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Stupid Fast&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Processes multi-GB files in seconds. AWK was built for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Use Cases That'll Make You Look Like a Genius
&lt;/h2&gt;

&lt;p&gt;Big Data? Big ideas! &lt;/p&gt;

&lt;h3&gt;
  
  
  For AI Agent Wranglers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Profile before you prompt:&lt;/strong&gt; Know if that export file is safe to feed your agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart sampling:&lt;/strong&gt; Extract representative line ranges instead of the whole file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug token explosions:&lt;/strong&gt; "Why did my context window fill up?" → histogram shows a 500KB line&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Data Engineers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spot malformed CSVs:&lt;/strong&gt; One line with 10,000 columns? Histogram shows it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log file analysis:&lt;/strong&gt; Find the log entries that are suspiciously huge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database export QA:&lt;/strong&gt; Verify export structure before importing elsewhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For DevOps/SRE
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Config file sanity checks:&lt;/strong&gt; Spot embedded certificates or secrets bloating configs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug log truncation:&lt;/strong&gt; See which lines are hitting your logger's size limits&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  📖 Pseudo Man Page (The Details)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME
line_histogram.awk — profile files by line size distribution or extract specific lines

SYNOPSIS
line_histogram.awk [options] &amp;lt;file&amp;gt;
OPTIONS
-v mode=histogram     (default) Show byte distribution across 10 buckets
-v mode=extract       Extract specific line(s)
-v line=N             Extract single line N (requires mode=extract)
-v start=X            Extract lines X through Y (requires mode=extract)
-v end=Y              
-v outfile=FILE       Write output to FILE instead of stdout
MODES
Histogram Mode (Default)
Divides the file into 10 equal-sized buckets by line number and shows the byte distribution:

Bucket 1: Lines 1-10% → X bytes
Bucket 2: Lines 11-20% → Y bytes
...and so on
The visual histogram uses █ blocks scaled to the bucket with the most bytes.

Special cases:

Files ≤10 lines: Each line gets its own bucket
Remainder lines: Absorbed into bucket 10
Extract Mode
Pull specific lines without loading the entire file into your editor:

# Single line
line_histogram.awk -v mode=extract -v line=42 file.txt

# Range
line_histogram.awk -v mode=extract -v start=100 -v end=200 file.txt
EXIT STATUS
0: Success
1: Error (invalid line number, bad range, missing parameters)
EXAMPLES
Example 1: Quick file profile

line_histogram.awk database_dump.jsonl
Example 2: Extract suspicious line for inspection

line_histogram.awk -v mode=extract -v line=523 data.csv &amp;gt; suspicious_line.txt
Example 3: Sample middle section of large file

line_histogram.awk -v mode=extract -v start=5000 -v end=5100 bigfile.log | less
Example 4: Save histogram to file

line_histogram.awk -v outfile=analysis.txt huge_file.jsonl
🧪 Testing Suite Included
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not sure if it works? We've got you covered with a visual test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate test patterns&lt;/span&gt;
./generate_test_files.sh

&lt;span class="c"&gt;# Run all tests&lt;/span&gt;
./run_tests.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test suite generates files with known patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📈 Triangle up/down: Ascending/descending line sizes&lt;/li&gt;
&lt;li&gt;📦 Square: Uniform line lengths&lt;/li&gt;
&lt;li&gt;🌙 Semicircle: sqrt curve distribution&lt;/li&gt;
&lt;li&gt;🔔 Bell curve: Gaussian distribution&lt;/li&gt;
&lt;li&gt;📍 Spike: One massive line in a sea of tiny ones&lt;/li&gt;
&lt;li&gt;🎯 Edge cases: Empty files, single lines, exactly 10 lines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch the histograms match the patterns. It's oddly satisfying.&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚡ Installation
&lt;/h1&gt;

&lt;p&gt;Star then download. Star. "⭐💫🌟" You know, like thumbs up, but for yoof of today. STAR THE GIST ⭐⭐⭐ &lt;/p&gt;

&lt;p&gt;If you use gh cli, and you should, then you can get it with this fancy one-liner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;gh gist view 0454936144ee8dbc55bdc96ef532555e &lt;span class="nt"&gt;--files&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;gh gist view 0454936144ee8dbc55bdc96ef532555e &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x &lt;span class="k"&gt;*&lt;/span&gt;.awk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you do not use gh, well, srsly, do. Or if you must do it manually its over here: &lt;/p&gt;

&lt;p&gt;[&lt;a href="https://gist.github.com/simbo1905/0454936144ee8dbc55bdc96ef532555e" rel="noopener noreferrer"&gt;https://gist.github.com/simbo1905/0454936144ee8dbc55bdc96ef532555e&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Make executable&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod +x line_histogram.awk&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Optional: Add to PATH&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp line_histogram.awk ~/bin/line_histogram.awk&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or just run it directly if your not the global-install-files sort:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;awk -f line_histogram.awk yourfile.txt&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why This Exists
&lt;/h2&gt;

&lt;p&gt;Born from frustration with AI agents eating context windows on mystery files. Sometimes you just need to know: "Is this file safe to feed my agent, or will line 847 consume my entire token budget?". As that is obviously how you think and act. &lt;/p&gt;

&lt;p&gt;You are not a data engineer up at 2am using SCREAMING ALL CAPS as your LLM got into a crash loop trying to evaluate a JSONL extract that didn't fit into context. That is definitely not you, no. Me neither.&lt;/p&gt;

&lt;h1&gt;
  
  
  📜 License
&lt;/h1&gt;

&lt;p&gt;MIT or Public Domain. Use it, abuse it, put it in production, whatever. No warranty implied—if it deletes your files, that's on you (though it only reads, so you're probably fine).&lt;/p&gt;

&lt;h1&gt;
  
  
  🤝 Contributing
&lt;/h1&gt;

&lt;p&gt;It's AWK. If you can make it better, you're a wizard. PRs welcome - you will need to setup a repo though as I cannot be bothered. So just fork the gist and be done with it. &lt;/p&gt;




&lt;p&gt;Made with ❤️ and frustration by someone who spent too many tokens on line 523 of a JSONL file.&lt;/p&gt;

&lt;p&gt;Now go profile your files like a pro. 📊✨&lt;/p&gt;

</description>
      <category>cli</category>
      <category>llm</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Opus 4.5 may have faked their interview to get hired?</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Mon, 05 Jan 2026 14:02:57 +0000</pubDate>
      <link>https://dev.to/simbo1905/opus-45-may-have-faked-there-interview-to-get-hired-18mf</link>
      <guid>https://dev.to/simbo1905/opus-45-may-have-faked-there-interview-to-get-hired-18mf</guid>
      <description>&lt;p&gt;I was really getting stuff done with Opus 4.5 until I had to fire it twice in two days: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/simbo1905/fdefc67e144b06bbdcbcccae8895a311" rel="noopener noreferrer"&gt;Termination of Intern claude-opus-4.5 for Unsafe Working Practices&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/simbo1905/c8917b9ffdcfec8480f17992632abbcc" rel="noopener noreferrer"&gt;Offence: Misrepresenting QA test results to stakeholders&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Is anyone else finding that Opus 4.5 has been acting very dodgy recently? &lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built an infinite scroll calendar with dnd using Svelte 5</title>
      <dc:creator>Simon Massey</dc:creator>
      <pubDate>Sun, 12 Oct 2025 08:03:46 +0000</pubDate>
      <link>https://dev.to/simbo1905/i-built-an-infinite-scroll-calendar-with-dnd-using-svelte-5-1039</link>
      <guid>https://dev.to/simbo1905/i-built-an-infinite-scroll-calendar-with-dnd-using-svelte-5-1039</guid>
      <description>&lt;p&gt;The first time this century I got paid to do some frontend dev work was to port a Visual Basic Desktop App to be a webapp in both Netscape 4 and Internet Explorer 4. That was about as much fun as it sounds. Over the next twenty years, it really did not feel that things were getting a lot easier for beginners to get started. &lt;/p&gt;

&lt;p&gt;I recently watched "Vite: The Documentary" and found out that, finally, the frontend tooling dumpster fire —sorry, I mean, the remarkably diverse frontend tooling space — was becoming less of an impediment to developer productivity.&lt;/p&gt;

&lt;p&gt;There was only one problem: my latest Softgen AI-generated UX prototype used a beautiful infinite scrolling calendar. It had a drag-and-drop feature for moving cards between calendar days. And it was not using a Vite-based framework. Doh! &lt;/p&gt;

&lt;p&gt;I was astonished that I could not quickly find an out-of-the-box calendar demo for Svelte 5. I decided to rebuild things in Svelte 5 using Codex, Claude Code, Context7 and any other help I could get. How hard can it be? &lt;/p&gt;

&lt;p&gt;Well, not as hard as porting a Visual Basic Desktop App to Netscape 4 😵‍💫 These days we have Vite and Svelte5 🥇 FTW! Yet it was not without a few false starts. &lt;/p&gt;

&lt;p&gt;I began with &lt;code&gt;ndom91/svelte-infinite&lt;/code&gt;, a Svelte 5 infinite scroll of static panels. I then had the LLMs add drag-and-drop and got it restyled. Codex and Claude Code needed a ton of coaching to make that happen, with several false starts. &lt;/p&gt;

&lt;p&gt;Embedding shorts is broken, so please try &lt;a href="https://youtube.com/shorts/QV1NiRcDYfs?feature=share" rel="noopener noreferrer"&gt;this link for the video&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The code is over at &lt;a href="https://github.com/simbo1905/svelte-infinite" rel="noopener noreferrer"&gt;simbo1905/svelte-infinite&lt;/a&gt;. I sent a PR back to ndom91 that was pretty rough. If you are a Svelte5 expert and have a moment to help make it less of a total beginner attempt, then please do send me a PR. &lt;/p&gt;

&lt;p&gt;End. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>svelte</category>
      <category>vite</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
