<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Igor Bubelov</title>
        <link>https://bubelov.com/series/llm-use-cases/</link>
        <description>All posts by Igor Bubelov</description><atom:link href="https://bubelov.com/series/llm-use-cases/index.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>LLM Use Cases: Code Reviews</title>
            <link>https://bubelov.com/blog/2026/llm-code-reviews/</link>
            <pubDate>Sat, 03 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://bubelov.com/blog/2026/llm-code-reviews/</guid>
            <description>&lt;div class=&#34;table-of-contents&#34;&gt;
    &lt;h2&gt;Table of Contents&lt;/h2&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#crossing-the-rubicon&#34;&gt;Crossing the Rubicon&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#my-code-review-setup&#34;&gt;My Code Review Setup&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#more-code-is-a-liability&#34;&gt;More Code Is a Liability&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#what-the-reviews-actually-found&#34;&gt;What the Reviews Actually Found&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id=&#34;crossing-the-rubicon&#34;&gt;Crossing the Rubicon&lt;/h2&gt;
&lt;p&gt;BTC Map Android v1.2.0 &lt;a href=&#34;https://github.com/teambtcmap/btcmap-android/releases/tag/v1.2.0&#34;&gt;shipped&lt;/a&gt; on September 30, roughly six months after &lt;a href=&#34;https://github.com/teambtcmap/btcmap-android/releases/tag/v1.1.0&#34;&gt;v1.1.0&lt;/a&gt;. The previous release was 100% hand-written, and this one started the same way, with zero LLM involvement.&lt;/p&gt;
&lt;p&gt;Early in the cycle I introduced &lt;a href=&#34;https://bubelov.com/blog/2026/opencode/&#34;&gt;OpenCode&lt;/a&gt;, starting with some models provided by &lt;a href=&#34;https://ppq.ai&#34;&gt;PayPerQ&lt;/a&gt; and quickly switching to M2.7 Highspeed (2026-04-09) for better latency and reliability. It turned out to be counterproductive, but amusing.&lt;/p&gt;
&lt;p&gt;Then came M3 (2026-06-01), which felt value neutral, more of a toy than a tool. Finally I tried &lt;a href=&#34;https://www.deepseek.com/en/news/deepseek-v4-1-flash/&#34;&gt;DeepSeek V4.1 Flash&lt;/a&gt; (2026-09-10), and it crossed the Rubicon of actual, indisputable LLM usefulness on real tasks. By the time I cut the release, almost every recent change was LLM-accelerated.&lt;/p&gt;
&lt;p&gt;Many new features were still hand-written early in the dev cycle. That notwithstanding, before cutting the release, I put every module, new and old, through an LLM code review and kept iterating until there were no findings of medium severity or higher left.&lt;/p&gt;
&lt;h2 id=&#34;my-code-review-setup&#34;&gt;My Code Review Setup&lt;/h2&gt;
&lt;p&gt;Before doing anything else, I created a bash helper script for managing the emulator lifecycle. The goal was to make sure the LLM knew exactly what to do and would not waste time struggling with the dev environment.&lt;/p&gt;
&lt;p&gt;My workflow was simple. I would point the model at one module, ask for a review with findings ranked by severity (low, medium, high, critical), fix every finding at medium severity or higher, then re-run the same review. Repeat until the module comes back clean, then move on to the next one. Some modules took one pass, others took a dozen.&lt;/p&gt;
&lt;p&gt;In my experience, DeepSeek V4.1 Flash is a fantastic reviewer. What sold me most was its speed. It is fast, thorough, blunt, and cheap enough to re-run the whole app a gazillion times. That matters a lot, because quantity beats quality in code reviews. Fixing one issue reshapes the surrounding code and tends to expose the next one.&lt;/p&gt;
&lt;h2 id=&#34;more-code-is-a-liability&#34;&gt;More Code Is a Liability&lt;/h2&gt;
&lt;p&gt;The obvious pushback is that most findings are edge cases nobody will ever hit, and every fix that adds code makes the codebase bigger and harder to maintain. There is truth to that. A reviewer, human or not, is rewarded for finding something, and &amp;ldquo;delete this and make it simpler&amp;rdquo; is a much rarer suggestion than &amp;ldquo;add one more null check for an impossible state&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I did not fix everything. I routinely ignored low-severity findings on purpose, and I rejected my share of medium-severity findings too, precisely for the reason stated above. The severity threshold is what made my workflow net-positive. Without it, an eager clanker will happily bury a small app under defensive code, which is a net negative even if every individual suggestion is technically correct.&lt;/p&gt;
&lt;h2 id=&#34;what-the-reviews-actually-found&#34;&gt;What the Reviews Actually Found&lt;/h2&gt;
&lt;p&gt;Some findings were genuinely useful, in ways that justify the effort.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real bugs. Races, stale state, leaked resources, and mishandled empty or error responses. These are the ones that are hard to reproduce and easy to ship unnoticed.&lt;/li&gt;
&lt;li&gt;Consistency. The same screen doing the same thing in three different ways, or error handling drifting between modules. Boring, but if you&amp;rsquo;re autistic enough, you&amp;rsquo;d appreciate the value.&lt;/li&gt;
&lt;li&gt;Tests. A lot of findings were cheap to turn into regression tests instead of yet more defensive code, and the test suite grew noticeably because of it.&lt;/li&gt;
&lt;li&gt;Architecture. Repeated reviews and revisions pushed the code toward less coupling and clearer separation of concerns, which is a benefit that no single finding captures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is the one I underrated. A reviewer that reads every module over and over starts to notice structural problems, not just local ones, and that nudges the architecture in a good direction.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The previous, fully manual release shipped six months ago. I am very happy with how 1.2.0 turned out, and it feels much more stable than v1.1.0.&lt;/p&gt;
&lt;p&gt;This workflow is not free, and it is not magic. Reviewing is a loop with a real time cost, and the temptation to over-engineer is something you need discipline to suppress.&lt;/p&gt;
&lt;p&gt;An LLM is also not a substitute for tests or for understanding your own code. It does not know your product and will cheerfully propose correct, useless changes. But as an extra pair of eyes that never gets bored, applied to a codebase you wrote and understand, code review is one of the better LLM use cases I have found so far.&lt;/p&gt;
</description>
        </item>
        
        <item>
            <title>LLM Use Cases: Reports</title>
            <link>https://bubelov.com/blog/2026/llm-reports/</link>
            <pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://bubelov.com/blog/2026/llm-reports/</guid>
            <description>&lt;div class=&#34;table-of-contents&#34;&gt;
    &lt;h2&gt;Table of Contents&lt;/h2&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#reporter-and-editor&#34;&gt;Reporter and Editor&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#commits-as-inputs&#34;&gt;Commits as Inputs&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#trouble-in-paradise&#34;&gt;Trouble in Paradise&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#conclusion&#34;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id=&#34;reporter-and-editor&#34;&gt;Reporter and Editor&lt;/h2&gt;
&lt;p&gt;A journalist friend of mine once told me that in the standard reporting pipeline, you always have an editor. The original writers are often too verbose and rambling, and it is the editor&amp;rsquo;s job to filter out the noise.&lt;/p&gt;
&lt;p&gt;Journalists often have a beef with editors for that reason. Editors have their own vision and the ultimate power over the final text.&lt;/p&gt;
&lt;p&gt;I find this framing useful when thinking about LLMs and text generation.&lt;/p&gt;
&lt;h2 id=&#34;commits-as-inputs&#34;&gt;Commits as Inputs&lt;/h2&gt;
&lt;p&gt;My commit messages are now mostly LLM-generated, and my recent commit history is rather verbose. My average commit message used to be a one-liner, probably comfortably below 80 chars. Not anymore. Now my commit messages are longer than the actual code diff.&lt;/p&gt;
&lt;p&gt;That makes it trivial to feed the commits into an LLM and ask it to summarize everything into a draft report. The goal is to get rid of the repetitive, exhaustive job of manually reviewing every commit and turn the verbosity into an asset rather than a liability.&lt;/p&gt;
&lt;p&gt;We publish two kinds of monthly reports for BTC Map. One is the consolidated report on the &lt;a href=&#34;https://blog.btcmap.org/&#34;&gt;BTC Map Blog&lt;/a&gt;, and the other is my personal report, published here on this blog.&lt;/p&gt;
&lt;p&gt;I started feeding an LLM a time period and a list of git repos, then asking it to produce a draft changelog. My job shifted from journalist to editor. I take the draft, shorten it, rearrange what survives, and remove the slop.&lt;/p&gt;
&lt;h2 id=&#34;trouble-in-paradise&#34;&gt;Trouble in Paradise&lt;/h2&gt;
&lt;p&gt;Did the report quality improve? The answer is: yes and no.&lt;/p&gt;
&lt;p&gt;For my personal reports, quality did improve because I tend to forget details and clankers have a good memory. I still spend roughly as much time preparing my reports as before, but my reports are better both in terms of grammar and content. The boring part is faster, so I can shift my focus to readability.&lt;/p&gt;
&lt;p&gt;I cannot say the same about our consolidated reports though. I suspect the reason is that they are just unedited LLM outputs. I am not just speculating here, it is trivial to see. LLMs cannot figure out which changes are meaningful, which changes are inappropriate for the format, and which ones are just noise.&lt;/p&gt;
&lt;p&gt;My personal report is supposed to be technical, since my contributions are mostly code-focused. Our consolidated reports target a completely different audience, so they used to be focused on new partnerships, usage statistics, and so on. But because both reports are fed the same commit history, they include all kinds of irrelevant noise and nitpicky details derived from raw commit messages.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I find LLMs useful for report generation, but here is my personal rule: it is not a good idea to publish something you did not even bother to read a few times and fully conceptualize yourself.&lt;/p&gt;
&lt;p&gt;If I am not ready to read, fact-check, and polish my own text, why would someone else read it? Respect for the reader is fundamental. New fancy tools don&amp;rsquo;t change anything in principle.&lt;/p&gt;
&lt;p&gt;This morning, I saw someone on Twitter defining AGI as &amp;ldquo;Actually Generating Income.&amp;rdquo; I think it is a good framing. We see an explosion in textual output, but do we see an explosion in quality? The answer so far is a definitive no.&lt;/p&gt;
</description>
        </item>
        
        <item>
            <title>LLM Use Cases: System Updates</title>
            <link>https://bubelov.com/blog/2026/llm-system-updates/</link>
            <pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate>
            <guid>https://bubelov.com/blog/2026/llm-system-updates/</guid>
            <description>&lt;div class=&#34;table-of-contents&#34;&gt;
    &lt;h2&gt;Table of Contents&lt;/h2&gt;
    &lt;nav id=&#34;TableOfContents&#34;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&#34;#the-world-is-not-black-and-white&#34;&gt;The World Is Not Black and White&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#why-this-series&#34;&gt;Why This Series&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#case-1-system-upgrades&#34;&gt;Case 1: System Upgrades&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;#verdict&#34;&gt;Verdict&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id=&#34;the-world-is-not-black-and-white&#34;&gt;The World Is Not Black and White&lt;/h2&gt;
&lt;p&gt;I have mixed feelings about LLMs. They clearly matured enough to do some small tasks with a high degree of reliability, but the tech has some fundamental downsides.&lt;/p&gt;
&lt;p&gt;LLMs are non-deterministic, which makes them hard to integrate into reproducible workflows. This is a core property of any fancy word predictor based on statistics, and there is no way of fixing that.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not that worried about the environment, so the environmental damage angle doesn&amp;rsquo;t concern me, but the demand for high-bandwidth memory and fast storage has pushed RAM and SSD prices through the stratosphere, hurting everyone, regardless of their Greta Jugend membership status.&lt;/p&gt;
&lt;p&gt;And yet, like most people in tech, I still like to play with new things and see what can be done with them.&lt;/p&gt;
&lt;h2 id=&#34;why-this-series&#34;&gt;Why This Series&lt;/h2&gt;
&lt;p&gt;This series will be a handful of posts, each focused on a single workflow that I tried to improve with LLMs, in the hope of making my life more comfortable or productive. Some have worked, some haven&amp;rsquo;t, and a few are still in limbo. This is the first one.&lt;/p&gt;
&lt;h2 id=&#34;case-1-system-upgrades&#34;&gt;Case 1: System Upgrades&lt;/h2&gt;
&lt;p&gt;I run Arch Linux on my machines and update them daily. It&amp;rsquo;s a rolling-release distribution, so every &lt;code&gt;pacman -Syu&lt;/code&gt; pulls in a mix of small fixes and major upgrades, and there&amp;rsquo;s rarely a boring day.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
    
        
        
        
            
            
            
            &lt;a href=&#34;https://bubelov.com/blog/2026/llm-system-updates/pacman_hu_39ee7e49b2f61839.webp&#34;&gt;
                &lt;img src=&#34;https://bubelov.com/blog/2026/llm-system-updates/pacman_hu_7c42612e13fb13e5.webp&#34; alt=&#34;&#34; /&gt;
            &lt;/a&gt;
        
    
    
    &lt;figcaption&gt;pacman in action&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TIP: Try uncommenting &lt;code&gt;VerbosePkgLists&lt;/code&gt; in &lt;code&gt;/etc/pacman.conf&lt;/code&gt;. It makes it much easier to examine the diffs. One package, one line.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The thing that always annoyed me is that distros don&amp;rsquo;t ship changelogs. The best you typically get is something like &amp;ldquo;old version: 1.2.3, new version: 1.2.4&amp;rdquo;, which tells you almost nothing.&lt;/p&gt;
&lt;p&gt;To find out what actually changed, I have to open a browser, hunt down the upstream project, and find the release notes. With dozens of packages updated every day, laziness often takes over and I just type &lt;code&gt;yes&lt;/code&gt; without a deep review.&lt;/p&gt;
&lt;p&gt;Since LLMs are pretty good at web search, I figured this was a reasonable use case. I hooked an LLM into my update routine and instructed it to fetch the changelogs for every package that&amp;rsquo;s about to be upgraded. The result is a comprehensive pre-update &amp;ldquo;what&amp;rsquo;s new&amp;rdquo; report that I can read in plain English before pulling the trigger.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
    
        
        
        
            
            
            
            &lt;a href=&#34;https://bubelov.com/blog/2026/llm-system-updates/example-1_hu_db52632283ae7633.webp&#34;&gt;
                &lt;img src=&#34;https://bubelov.com/blog/2026/llm-system-updates/example-1_hu_98244c70d308fbfb.webp&#34; alt=&#34;&#34; /&gt;
            &lt;/a&gt;
        
    
    
    &lt;figcaption&gt;A decent report, under 60 sec&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&#34;verdict&#34;&gt;Verdict&lt;/h2&gt;
&lt;p&gt;Surprisingly, it&amp;rsquo;s one of the few LLM-enhanced things in my workflow that actually works. Most days, the report is solid. It covers the major packages, pulls relevant highlights, and is genuinely useful. Some days, though, the formatting falls apart, a few sources fail to fetch, and the same data is presented in a completely unreadable format.&lt;/p&gt;
&lt;p&gt;The only way to make it reliable is to invest a lot more effort. I can hardcode the changelog sources for every package, write strict rules for the report layout, and add validation passes that catch and fix structural issues. That might help, but that&amp;rsquo;s a lot of work for a tool that&amp;rsquo;s supposed to save time.&lt;/p&gt;
&lt;p&gt;Here is what it produces on a &amp;ldquo;bad&amp;rdquo; day:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
    
        
        
        
            
            
            
            &lt;a href=&#34;https://bubelov.com/blog/2026/llm-system-updates/example-2_hu_c8704f4a55a8c5cb.webp&#34;&gt;
                &lt;img src=&#34;https://bubelov.com/blog/2026/llm-system-updates/example-2_hu_6c64ab3b7644753.webp&#34; alt=&#34;&#34; /&gt;
            &lt;/a&gt;
        
    
    
    &lt;figcaption&gt;11 minutes of &amp;ldquo;thinking&amp;rdquo;, gazillion tool calls, bs report&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll keep experimenting with this use case, but so far I can&amp;rsquo;t call it a success, and the future doesn&amp;rsquo;t look bright for my LLM-enhanced system update flow.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>