<?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: Kirill</title>
    <description>The latest articles on DEV Community by Kirill (@klem42).</description>
    <link>https://dev.to/klem42</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3854060%2F9ed05a0b-6ec8-41bf-af78-5dc9a5898f7d.jpg</url>
      <title>DEV Community: Kirill</title>
      <link>https://dev.to/klem42</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/klem42"/>
    <language>en</language>
    <item>
      <title>I Replaced ChatGPT With Gemma 4 In My Product. It Felt Like The Same Radio Show With A Different Host.</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Thu, 21 May 2026 21:05:01 +0000</pubDate>
      <link>https://dev.to/klem42/i-replaced-chatgpt-with-gemma-4-in-my-product-it-felt-like-the-same-radio-show-with-a-different-e82</link>
      <guid>https://dev.to/klem42/i-replaced-chatgpt-with-gemma-4-in-my-product-it-felt-like-the-same-radio-show-with-a-different-e82</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most “read later” links quietly die in browser tabs. At some point I realized I wasn’t actually trying to consume more content anymore. I was trying to reduce the cost of deciding what deserved my attention in the first place.&lt;/p&gt;

&lt;p&gt;That realization eventually turned into TLDR Radio — a Telegram bot that converts long-form articles and discussion threads into short audio briefings you can consume while walking, commuting, cooking, or doing literally anything except staring at another glowing rectangle.&lt;/p&gt;

&lt;p&gt;But while building it, I accidentally discovered something much more interesting than “AI summaries”. I swapped the underlying model, and almost nothing important broke. That realization stayed in my head much longer than any benchmark chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;TLDR Radio is an audio-first article triage system. You send a link. The bot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetches the article&lt;/li&gt;
&lt;li&gt;extracts readable content&lt;/li&gt;
&lt;li&gt;optionally pulls discussion context&lt;/li&gt;
&lt;li&gt;generates a structured summary&lt;/li&gt;
&lt;li&gt;converts it into audio&lt;/li&gt;
&lt;li&gt;sends the result back through Telegram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original problem was surprisingly simple. My browser had basically become a graveyard of tabs I was never going to read anyway. And the real issue wasn’t lack of time. It was decision fatigue. Choosing what deserved attention started feeling more exhausting than the actual reading itself. So I stopped treating summarization as “compression”. I started treating it as attention routing.&lt;/p&gt;

&lt;p&gt;The core UX decision was intentional from the beginning: I did not want another AI chat interface. I wanted passive consumption.&lt;/p&gt;

&lt;p&gt;The product only started feeling genuinely useful once I could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;listen while walking&lt;/li&gt;
&lt;li&gt;listen while driving&lt;/li&gt;
&lt;li&gt;listen while cooking&lt;/li&gt;
&lt;li&gt;listen while cleaning&lt;/li&gt;
&lt;li&gt;stay away from the screen entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That constraint ended up influencing almost every architectural decision. The system itself looks less like a chatbot and more like a media-processing pipeline.&lt;/p&gt;

&lt;p&gt;High-level flow:&lt;br&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%2Fq69gs91k3chvf8i5j6ox.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.amazonaws.com%2Fuploads%2Farticles%2Fq69gs91k3chvf8i5j6ox.png" alt="High-level flow" width="800" height="986"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Landing: &lt;a href="https://tldr-radio.humifylab.com" rel="noopener noreferrer"&gt;https://tldr-radio.humifylab.com&lt;/a&gt;&lt;br&gt;
Telegram Bot: &lt;a href="https://t.me/TldrRadioBot" rel="noopener noreferrer"&gt;https://t.me/TldrRadioBot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to use: send one or two links and get a short audio summary. &lt;br&gt;
  &lt;/p&gt;
&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/wovfxS6fEV0"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;
[UX demo: from link to detailed audio summary]

&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%2Frdo2o87ib6oqoologzwh.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.amazonaws.com%2Fuploads%2Farticles%2Frdo2o87ib6oqoologzwh.png" alt="Conversation in Telegram, audio list and lock screen" width="800" height="578"&gt;&lt;/a&gt;[Conversation in Telegram, audio list and lock screen]&lt;/p&gt;

&lt;p&gt;Each audio summary has a message with a caption, tags, a few first sentences of the summary, and sources. You can see the difference between Gemma and ChatGPT by comparing those messages yourself. For the rest of the article, Gemma is on the left.&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.amazonaws.com%2Fuploads%2Farticles%2Fgc15ws05v0tfpig0aufi.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.amazonaws.com%2Fuploads%2Farticles%2Fgc15ws05v0tfpig0aufi.png" alt="Gemma on the left and ChatGPT on the right" width="800" height="470"&gt;&lt;/a&gt;[Gemma on the left and ChatGPT on the right]&lt;/p&gt;

&lt;p&gt;One thing I really like is pulling in discussion context from places like Hacker News and Reddit. An article is just one perspective. The comment threads usually surface the real signal way faster than the article itself. There's also an option to go deeper and get a more detailed summary, which works really well for long HN threads.&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.amazonaws.com%2Fuploads%2Farticles%2Fgqbkkx74jrj7yre711fh.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.amazonaws.com%2Fuploads%2Farticles%2Fgqbkkx74jrj7yre711fh.png" alt="Gemma on the left and ChatGPT on the right" width="799" height="295"&gt;&lt;/a&gt;[Gemma on the left and ChatGPT on the right]&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;One thing I wanted very deliberately was separating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;webhook latency&lt;/li&gt;
&lt;li&gt;durable job execution&lt;/li&gt;
&lt;li&gt;asynchronous processing&lt;/li&gt;
&lt;li&gt;execution snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is heavily queue-oriented. The webhook itself stays lightweight and returns quickly. Long-running work happens asynchronously in workers.&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.amazonaws.com%2Fuploads%2Farticles%2F8capw0umsxve4kjdzdtn.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.amazonaws.com%2Fuploads%2Farticles%2F8capw0umsxve4kjdzdtn.png" alt="Architecture diagram" width="799" height="576"&gt;&lt;/a&gt;[Architecture diagram]&lt;/p&gt;

&lt;p&gt;The stack currently includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ASP.NET Core Minimal API&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;OpenTelemetry&lt;/li&gt;
&lt;li&gt;LLMs providers&lt;/li&gt;
&lt;li&gt;Telegram Bot API&lt;/li&gt;
&lt;li&gt;TTS providers&lt;/li&gt;
&lt;li&gt;Fly.io deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The LLM is only one component inside the pipeline, not the entire product.&lt;/p&gt;

&lt;p&gt;One small feature to mention is procedural-generated images as covers. For each summary mp3 ID3 tags are written, including "Album" cover. How do you like these? &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.amazonaws.com%2Fuploads%2Farticles%2Fnu4vvm5hx0xx8mxme10z.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.amazonaws.com%2Fuploads%2Farticles%2Fnu4vvm5hx0xx8mxme10z.png" alt="Procedural-generated images as covers" width="800" height="289"&gt;&lt;/a&gt;[Procedural-generated images as covers]&lt;/p&gt;

&lt;p&gt;The actual TLDR Radio repository is currently private. But during development I extracted part of the infrastructure into an open-source production-oriented Telegram bot starter for .NET:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lemesevkirill/telegram-bot-starter-dotnet" rel="noopener noreferrer"&gt;https://github.com/lemesevkirill/telegram-bot-starter-dotnet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It contains the asynchronous webhook/worker architecture that heavily influenced TLDR Radio itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;Originally, TLDR Radio used ChatGPT-based summarization. That felt like the obvious choice. Then the Gemma 4 challenge appeared and I started wondering: What actually happens if I swap the model without changing anything else?&lt;/p&gt;

&lt;p&gt;For the core reasoning engine of TLDR Radio, I selected the &lt;strong&gt;Gemma 4 31B Instruct&lt;/strong&gt; model, deploying it via OpenRouter's free tier. Within the Gemma 4 ecosystem, developers often choose between the high-throughput Mixture-of-Experts (MoE) models (like the 26B variant) and dense architectures. I intentionally chose the &lt;strong&gt;31B Dense&lt;/strong&gt; model for a specific architectural reason: script-writing and role-preservation.&lt;/p&gt;

&lt;p&gt;While MoE models are incredibly cost-efficient because they activate fewer parameters per token, dense models utilize their entire parameter weight (all 30.7B parameters) for every single token generated. For an audio-first product like TLDR Radio, this full-scale dense processing is critical. It delivers more cohesive narrative structures, better flow, and firmly holds the "radio host personality" across complex, multi-layered summaries without breaking character.&lt;/p&gt;

&lt;p&gt;Using OpenRouter allowed me to plug this 31B dense powerhouse into my .NET pipeline instantly, gaining a massive 256K context window and native multilingual support without managing complex local infrastructure.&lt;/p&gt;

&lt;p&gt;Honestly, I expected the quality to collapse. That’s not what happened. This became the most interesting part of the entire experiment.&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.amazonaws.com%2Fuploads%2Farticles%2Ffhytki1tnk4x6cy6uhra.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.amazonaws.com%2Fuploads%2Farticles%2Ffhytki1tnk4x6cy6uhra.png" alt="Gemma on the left and ChatGPT on the right" width="799" height="277"&gt;&lt;/a&gt;[Gemma on the left and ChatGPT on the right]&lt;/p&gt;

&lt;p&gt;I intentionally kept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the same prompts&lt;/li&gt;
&lt;li&gt;the same orchestration&lt;/li&gt;
&lt;li&gt;the same summary structure&lt;/li&gt;
&lt;li&gt;the same Telegram UX&lt;/li&gt;
&lt;li&gt;the same audio generation flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only thing that changed was the model. And the result did not feel like smart AI vs dumb AI or high-quality vs low-quality. It felt more like swapping podcast hosts.&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.amazonaws.com%2Fuploads%2Farticles%2Fr5qgnpqo8dv1et3t2sne.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.amazonaws.com%2Fuploads%2Farticles%2Fr5qgnpqo8dv1et3t2sne.png" alt="Gemma on the left and ChatGPT on the right" width="800" height="280"&gt;&lt;/a&gt;[Gemma on the left and ChatGPT on the right]&lt;/p&gt;

&lt;p&gt;ChatGPT often sounded patient and explanatory. Gemma frequently sounded denser and more compressed, almost like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“here’s the essence, let’s move”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The factual quality was often surprisingly close for this workflow.&lt;br&gt;
What changed more noticeably was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pacing&lt;/li&gt;
&lt;li&gt;sentence density&lt;/li&gt;
&lt;li&gt;narration rhythm&lt;/li&gt;
&lt;li&gt;listening feel&lt;/li&gt;
&lt;li&gt;emotional texture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was the moment where the whole thing stopped feeling like “model evaluation”. It started feeling more like media production for the same show with different hosts. And that realization stayed in my head much longer than expected. Because I originally assumed TLDR Radio was basically a model experiment. Smarter model equals better product. Simple. Then I started swapping models and something uncomfortable happened: The model quietly stopped feeling like the whole product.&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.amazonaws.com%2Fuploads%2Farticles%2F6hqhudt2586nleh7w1g5.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.amazonaws.com%2Fuploads%2Farticles%2F6hqhudt2586nleh7w1g5.png" alt="Gemma on the left and ChatGPT on the right" width="800" height="321"&gt;&lt;/a&gt;[Gemma on the left and ChatGPT on the right]&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Observations
&lt;/h2&gt;

&lt;p&gt;One thing that became obvious very quickly: Operational reliability matters enormously in audio products.&lt;/p&gt;

&lt;p&gt;The free Gemma endpoints through OpenRouter were heavily throttled during peak usage. The paid endpoint was dramatically more stable. Which mirrors a broader AI product lesson: Raw intelligence matters less if the operational experience becomes unreliable.&lt;/p&gt;

&lt;p&gt;As long as the endpoint is stable, Gemma is totally fine on the pipeline side. You can do everything with Gemma that you do with ChatGPT - latency, limits, context, all the technical details work.&lt;/p&gt;

&lt;p&gt;Another interesting observation: I expected prompt portability to be much worse. Instead, both models handled the orchestration surprisingly well. That made the models feel far more interchangeable than I originally expected. Multilingual behavior also changed the feel of the product in interesting ways. Not just translation quality. Personality. Different combinations of model / language / TTS provider started producing noticeably different listening experiences.&lt;/p&gt;

&lt;p&gt;Again: less like swapping engines, more like swapping hosts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Building TLDR Radio changed how I think about AI products. I expected swapping models to feel like replacing the engine. Instead, it felt more like replacing the host of the same radio show.&lt;/p&gt;

&lt;p&gt;Gemma didn’t replace GPT in this project. It changed the pacing, tone, and listening feel of the experience. And that turned out to be much more interesting than a benchmark comparison.&lt;/p&gt;

&lt;p&gt;The biggest surprise wasn’t realizing that open models got good. It was realizing how quickly the model itself stopped feeling like the whole product.&lt;/p&gt;

&lt;p&gt;While building TLDR Radio, I ended up thinking about something larger: What happens when intelligence itself becomes infrastructure? I wrote a more philosophical version of that realization here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://futurehangover.substack.com/p/nobody-cares-about-your-frontier" rel="noopener noreferrer"&gt;https://futurehangover.substack.com/p/nobody-cares-about-your-frontier&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to try the bot itself:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/TldrRadioBot" rel="noopener noreferrer"&gt;https://t.me/TldrRadioBot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Turns out writing and speaking are completely different skills</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Tue, 12 May 2026 18:59:35 +0000</pubDate>
      <link>https://dev.to/klem42/turns-out-writing-and-speaking-are-completely-different-skills-1cf2</link>
      <guid>https://dev.to/klem42/turns-out-writing-and-speaking-are-completely-different-skills-1cf2</guid>
      <description>&lt;p&gt;A month ago I sent a cold message to a meetup organizer with a rough idea for a short talk about AI-assisted coding chaos.&lt;/p&gt;

&lt;p&gt;At that point it was basically just a rant: "Why does asking an LLM to add one button end with half the repo rewritten?"&lt;/p&gt;

&lt;p&gt;Since then:&lt;br&gt;
— I gave the first version of the talk&lt;br&gt;
— turned it into a dev.to article&lt;br&gt;
— got surprisingly good discussions out of it&lt;br&gt;
— and now I'm doing another session for Azure Meetup Konstanz&lt;/p&gt;

&lt;p&gt;One thing I realized during this process: writing about engineering and speaking about engineering are completely different skills. When you write, you can edit weak parts away. When you speak, weak ideas become visible immediately.&lt;/p&gt;

&lt;p&gt;The topic is still the same: how to use AI coding tools without turning your project into entropy.&lt;/p&gt;

&lt;p&gt;If you're curious — here's the meetup link:&lt;br&gt;
&lt;a href="https://www.meetup.com/azure-meetup-konstanz-region/events/314158692/" rel="noopener noreferrer"&gt;https://www.meetup.com/azure-meetup-konstanz-region/events/314158692/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the original article:&lt;br&gt;
&lt;a href="https://dev.to/klem42/i-asked-an-llm-to-add-one-button-it-rewrote-half-my-repo-1l1f"&gt;https://dev.to/klem42/i-asked-an-llm-to-add-one-button-it-rewrote-half-my-repo-1l1f&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Engineering Teams Quietly Reward Chaos</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Fri, 08 May 2026 14:32:05 +0000</pubDate>
      <link>https://dev.to/klem42/engineering-teams-quietly-reward-chaos-3el5</link>
      <guid>https://dev.to/klem42/engineering-teams-quietly-reward-chaos-3el5</guid>
      <description>&lt;p&gt;Lately I've been having a strange thought.&lt;/p&gt;

&lt;p&gt;The more chaotic a system became, the more valuable I looked inside it.&lt;br&gt;
The harder things were to understand, the more people depended on me.&lt;br&gt;
The more production pain existed, the more visibility I got.&lt;/p&gt;

&lt;p&gt;And eventually I caught myself wondering something uncomfortable:&lt;br&gt;
Was I actually incentivized to reduce any of this?&lt;/p&gt;

&lt;p&gt;At first that thought sounded ridiculous. Nobody wakes up thinking: "Today I will make the system worse."&lt;/p&gt;

&lt;p&gt;At least I hope not.&lt;/p&gt;

&lt;p&gt;But engineering organizations create strange games. And once you notice the incentives, it's hard to unsee them.&lt;/p&gt;

&lt;p&gt;You start noticing what actually gets rewarded.&lt;/p&gt;

&lt;p&gt;Fast fixes get rewarded.&lt;br&gt;
Heroic debugging sessions get rewarded.&lt;br&gt;
Late-night firefighting gets rewarded.&lt;br&gt;
Being the person who saves the release gets rewarded.&lt;br&gt;
Visibility gets rewarded.&lt;br&gt;
Urgency gets rewarded.&lt;br&gt;
Visible suffering gets rewarded.&lt;/p&gt;

&lt;p&gt;Meanwhile, a lot of other things become &lt;em&gt;strangely invisible&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Reducing future complexity.&lt;br&gt;
Eliminating operational pain before it exists.&lt;br&gt;
Making systems boring.&lt;br&gt;
Making onboarding easier.&lt;br&gt;
Documenting things well enough that people stop depending on you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody gathers the team to celebrate that nothing exploded this quarter.&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fee82iedam2bh8ihyhjuk.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.amazonaws.com%2Fuploads%2Farticles%2Fee82iedam2bh8ihyhjuk.png" alt="The email you will probably never receive." width="800" height="592"&gt;&lt;/a&gt;&lt;em&gt;The email you will probably never receive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But everybody notices when you jump into chaos and survive it.&lt;/p&gt;

&lt;p&gt;I used to genuinely enjoy simplifying things.&lt;br&gt;
I automated repetitive work.&lt;br&gt;
I removed weird dependencies.&lt;br&gt;
I cleaned up ugly flows.&lt;br&gt;
I documented systems.&lt;br&gt;
I tried to make things understandable.&lt;br&gt;
I tried to make myself less of a bottleneck.&lt;/p&gt;

&lt;p&gt;But something strange kept happening. The cleaner things became, the less important I seemed to be.&lt;/p&gt;

&lt;p&gt;Fewer escalations.&lt;br&gt;
Fewer emergency calls.&lt;br&gt;
Fewer meetings where people suddenly needed me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stability made me respectable. Chaos made me important.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that realization messed with my head more than I expected. Because once you understand the game, the incentives start pulling on you in strange ways.&lt;/p&gt;

&lt;p&gt;If I automate this process perfectly, people stop needing me.&lt;br&gt;
If I document everything properly, knowledge asymmetry disappears.&lt;br&gt;
If onboarding becomes easy, I stop being irreplaceable.&lt;br&gt;
If incidents disappear, heroic visibility disappears too.&lt;br&gt;
If systems become predictable, nobody notices how much pain used to exist.&lt;/p&gt;

&lt;p&gt;And the worst part is that you don't even need to become malicious. You just slowly adapt.&lt;/p&gt;

&lt;p&gt;You postpone cleanup work a little longer.&lt;br&gt;
You stop fighting heroic culture as hard as you used to.&lt;br&gt;
You tolerate complexity instead of killing it immediately.&lt;br&gt;
You leave certain knowledge undocumented because keeping it in your head preserves a kind of invisible leverage.&lt;br&gt;
You optimize for what the organization visibly rewards.&lt;/p&gt;

&lt;p&gt;And eventually, part of you starts needing &lt;strong&gt;emergencies&lt;/strong&gt;. They make your value obvious.&lt;/p&gt;

&lt;p&gt;That was probably the most uncomfortable realization for me. Not that organizations reward chaos. But how quickly the human brain learns to survive inside systems like that.&lt;/p&gt;

&lt;p&gt;I don't think most engineers consciously choose this. I think many organizations accidentally create environments where reducing complexity becomes strategically irrational in the short term.&lt;/p&gt;

&lt;p&gt;Then later everybody acts surprised.&lt;/p&gt;

&lt;p&gt;Why are there knowledge silos?&lt;br&gt;
Why are certain engineers impossible to replace?&lt;br&gt;
Why does nobody fix root causes?&lt;br&gt;
Why is every release emotionally exhausting?&lt;br&gt;
Why does the organization depend on heroics just to function?&lt;/p&gt;

&lt;p&gt;Maybe the real problem is that modern engineering organizations are much better at rewarding visible heroics than invisible stability.&lt;/p&gt;

&lt;p&gt;And the hardest part is this: I'm no longer completely sure whether I'm reducing complexity inside these systems anymore. Or simply learning how to profit from it.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>career</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>Move Fast and Break Things Was Fun. Now We’re Paying For It.</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Wed, 06 May 2026 14:35:34 +0000</pubDate>
      <link>https://dev.to/klem42/move-fast-and-break-things-was-fun-now-were-paying-for-it-3l3n</link>
      <guid>https://dev.to/klem42/move-fast-and-break-things-was-fun-now-were-paying-for-it-3l3n</guid>
      <description>&lt;p&gt;The most valuable engineers I've worked with often looked... less "productive". They weren't always the fastest at closing tickets. They didn't push the most code. Sometimes it even felt like they were slowing things down.&lt;/p&gt;

&lt;p&gt;And yet, somehow, teams around them ended up dealing with a lot less bullshit six months later.&lt;/p&gt;

&lt;p&gt;Typical story: an API occasionally responds in 10 seconds under load. Not always. Just often enough to become painful. A ticket shows up: "Need to fix slow responses ASAP."&lt;/p&gt;

&lt;p&gt;One engineer goes for the obvious fix: "Let's add caching."&lt;br&gt;
A couple of days later, the issue seems gone. Everyone's happy. Ticket closed. Velocity looks great.&lt;/p&gt;

&lt;p&gt;Then the familiar magic begins: cache invalidation becomes painful, stale data starts showing up in weird places, edge cases multiply, more patches pile on top, and a month later the system is more complicated than before the "fix".&lt;/p&gt;

&lt;p&gt;Another engineer does the thing people often hate: &lt;strong&gt;instead of immediately writing code, they start asking&lt;/strong&gt; why the problem exists in the first place.&lt;/p&gt;

&lt;p&gt;And suddenly it turns out the backend isn't really the issue. The frontend is hammering the API because it has no proper way to receive updates.&lt;/p&gt;

&lt;p&gt;So instead of another caching layer, the solution becomes boring but clean: events, change notifications, fewer requests, less state, less magic.&lt;/p&gt;

&lt;p&gt;In the moment, the second engineer looked slower. They asked annoying questions. They added friction. Maybe they even irritated people a little.&lt;br&gt;
But six months later, systems around people like that somehow tend to be simpler, more stable, and easier to work with.&lt;/p&gt;

&lt;p&gt;And I think this is one of the strangest things in our industry.&lt;br&gt;
We're very good at measuring &lt;strong&gt;delivery speed&lt;/strong&gt;. We're much worse at noticing engineers who reduce the amount of future pain inside a system.&lt;/p&gt;

&lt;p&gt;And these aren't necessarily "10x architects" or technical geniuses.&lt;br&gt;
Often they're just the people who ask an uncomfortable question at the right moment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Wait. Are we actually solving the right problem?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The funny part is that these are usually the engineers people try to bring with them from company to company, pull into difficult projects, and retain at almost any cost.&lt;/p&gt;

&lt;p&gt;Even though their value is incredibly hard to measure formally.&lt;/p&gt;

&lt;p&gt;Have you worked with engineers like this?&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>I used to have 100+ open tabs I wasn't reading</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Sun, 03 May 2026 15:10:54 +0000</pubDate>
      <link>https://dev.to/klem42/i-used-to-have-100-open-tabs-i-wasnt-reading-4kl0</link>
      <guid>https://dev.to/klem42/i-used-to-have-100-open-tabs-i-wasnt-reading-4kl0</guid>
      <description>&lt;p&gt;My browser was basically a graveyard. Choosing what to read felt more draining than reading itself. I realized I didn't actually want to read most of those articles - I just didn't want to miss the 10% that actually mattered.&lt;/p&gt;

&lt;p&gt;So I changed the order. I started filtering everything through a ~3-minute audio breakdown before deciding whether to read it in full. I started doing this manually with ChatGPT, and that was enough to notice a pattern: for most long-form content, three minutes is enough. &lt;/p&gt;

&lt;p&gt;A short breakdown gives me the core ideas, hidden assumptions, and counter-arguments without the fluff. Anything longer starts to feel like a "half-read" that doesn't actually save time. Three minutes seems to be the sweet spot for a Go/No-Go decision.&lt;/p&gt;

&lt;p&gt;The signal improves a lot when you include discussion threads from Hacker News or Reddit. An article is one perspective. Comments expose the gaps and highlight the actual signal before you ever commit to a single tab.&lt;/p&gt;

&lt;p&gt;I eventually automated this for myself, but that part isn't the point. This changed how I deal with information. I no longer feel the need to "finish" my backlog; I just need a faster way to tell what deserves my attention.&lt;/p&gt;

&lt;p&gt;I don't try to read more anymore. I just commit less often.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I tried staring at a wall to fix my focus</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Wed, 29 Apr 2026 12:02:56 +0000</pubDate>
      <link>https://dev.to/klem42/i-tried-staring-at-a-wall-to-fix-my-focus-3om4</link>
      <guid>https://dev.to/klem42/i-tried-staring-at-a-wall-to-fix-my-focus-3om4</guid>
      <description>&lt;p&gt;Recently I read &lt;a href="https://dev.to/the_nortern_dev/trading-my-body-for-logic-the-physical-decay-we-ignore-3c4i"&gt;a post here on dev.to&lt;/a&gt;. A guy was writing about how his health slowly went off track. Nothing dramatic at first, just the usual things stacking up. Sleep getting worse, caffeine creeping in, energy dropping, focus dissolving somewhere in the background. It didn't read like a crisis. It read like something that quietly happens to a lot of people.&lt;/p&gt;

&lt;p&gt;For some reason that post stuck with me. Not because of the health part itself, but because of the pattern. The sense that things don't usually break in one big moment. They degrade through small habits that feel harmless when taken one by one.&lt;/p&gt;

&lt;p&gt;Around the same time I came across another idea that felt strangely related. It came from &lt;a href="https://www.alexselimov.com/posts/men_who_stare_at_walls/" rel="noopener noreferrer"&gt;a post about productivity&lt;/a&gt;, but it didn't look like productivity advice at all. The suggestion was almost absurd in its simplicity. &lt;strong&gt;When your focus drops, don't reach for your phone, don't switch tabs, don't look for stimulation. Just sit and stare at a wall for a few minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was it.&lt;/p&gt;

&lt;p&gt;The author described a familiar loop where bad sleep leads to caffeine, caffeine leads to jittery focus, that leads to background noise like music or podcasts, which turns into scrolling and distraction, which then pushes sleep even further out of balance. A cycle that feeds itself without ever feeling like a conscious decision&lt;/p&gt;

&lt;p&gt;What caught my attention wasn't the cycle itself, but the proposed interruption. Not a better tool, not a smarter system, just the removal of input.&lt;/p&gt;

&lt;p&gt;I tried it out of curiosity. It felt like something too simple to matter, which is usually a good reason to test it.&lt;/p&gt;

&lt;p&gt;Sitting there and doing nothing turned out to be much harder than expected. Not physically, but mentally. The first thing I noticed was how quickly the mind tries to escape the situation. It doesn't matter where it goes. Checking messages, thinking about work, replaying conversations, planning something pointless. Anything is better than staying in that empty space.&lt;/p&gt;

&lt;p&gt;That reaction was more interesting than the exercise itself. It made me realize how little time there is in a normal day where nothing is happening. Every gap gets filled automatically. Waiting becomes scrolling. Walking becomes listening. Eating becomes watching something. Even working often comes with some kind of background input.&lt;/p&gt;

&lt;p&gt;At some point I saw a comment that put this into words more precisely. The problem with modern devices is not just that they take your attention. They take away the moments where your mind used to wander on its own.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've recently realised that the biggest problem with smartphones is not that they steal your attention (which is bad enough), but that they steal your disattention&lt;br&gt;
I don't know of a better word for it than disattention. Perhaps downtime? But it's not so structured. It's just those moments where you'd previously let your mind wander. Gone forever.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea reframed the whole thing. It's not just about distraction. It's about the disappearance of mental idle time. The kind of low-stimulation state where thoughts connect in unpredictable ways, or where nothing particularly useful happens, but the system resets itself.&lt;/p&gt;

&lt;p&gt;Seen from that angle, staring at a wall doesn't look like a productivity trick. It looks more like restoring a missing state.&lt;/p&gt;

&lt;p&gt;Some people would probably call this meditation, and maybe that's technically correct. But the framing feels different. Meditation comes with expectations, structure, and sometimes a sense that you're supposed to achieve something. This feels more like a diagnostic tool. You sit down and check whether you can tolerate the absence of input for a few minutes.&lt;/p&gt;

&lt;p&gt;If the answer is yes, then nothing interesting happens. If the answer is no, then that's already a signal.&lt;/p&gt;

&lt;p&gt;What surprised me was that after a short period of doing nothing, going back to work felt slightly easier. Not in a dramatic or motivational way, but in a quieter sense. There was less internal friction. Fewer competing impulses pulling attention away.&lt;/p&gt;

&lt;p&gt;It didn't feel like gaining something new. It felt more like removing noise.&lt;/p&gt;

&lt;p&gt;I'm not sure how much of this is a real technique and how much is just a reaction to being constantly overloaded. But the experiment itself feels valuable because it's so easy to try and so hard to fake.&lt;/p&gt;

&lt;p&gt;You don't need a system or a habit tracker. You just need a few minutes and the willingness to not fill them with anything.&lt;/p&gt;

&lt;p&gt;When was the last time you let your mind wander without a podcast or a screen? I'd be curious to hear if anyone else has tried this "zero-input" experiment.&lt;/p&gt;

&lt;p&gt;The interesting part is not whether it works. The interesting part is whether you can actually do it.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>mentalhealth</category>
      <category>wellness</category>
      <category>career</category>
    </item>
    <item>
      <title>I asked an LLM to add one button. It rewrote half my repo.</title>
      <dc:creator>Kirill</dc:creator>
      <pubDate>Tue, 21 Apr 2026 16:42:08 +0000</pubDate>
      <link>https://dev.to/klem42/i-asked-an-llm-to-add-one-button-it-rewrote-half-my-repo-1l1f</link>
      <guid>https://dev.to/klem42/i-asked-an-llm-to-add-one-button-it-rewrote-half-my-repo-1l1f</guid>
      <description>&lt;p&gt;Let’s be honest: modern LLMs write amazing code. Sometimes I look at the output and realize I couldn’t have done it better or faster myself. It hits you with this almost addictive rush of speed.&lt;/p&gt;

&lt;p&gt;But that speed comes with a cost: you stop understanding what’s happening.&lt;/p&gt;

&lt;p&gt;Recently, I was working on my pet project — a Telegram bot that turns articles into audio. I wanted to add one simple feature: a "Detailed Summary" mode. I threw a quick prompt at the AI: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give users a way to get more detailed summaries&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first glance, everything looked fine. Then I tried to understand the diff.&lt;br&gt;
I couldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Chaos of "Just Prompting"
&lt;/h2&gt;

&lt;p&gt;I had a clean setup: all my prompts lived in a prompts.yaml file, and a PromptBuilder class would neatly assemble them. It was a predictable, single-source-of-truth system.&lt;/p&gt;

&lt;p&gt;The agent ignored all of it. Instead of adding a template to the YAML, it shoved raw strings directly into the C# code.&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.amazonaws.com%2Fuploads%2Farticles%2Fbcxwe2z58qy03bh7njjl.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.amazonaws.com%2Fuploads%2Farticles%2Fbcxwe2z58qy03bh7njjl.png" alt="Hardcoded strings in BuildSummaryPrompt" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It introduced if/else logic inside the builder and added extra prompt instructions as raw string literals. My architecture just left the building. Now I had two sources of truth.&lt;/p&gt;

&lt;p&gt;But the worst part was the UX. Instead of adding a simple Telegram button to trigger the detailed mode, the AI decided that the user should manually type magic hashtags like &lt;code&gt;#detailed&lt;/code&gt;. It chose the easiest path for the code, not the user.&lt;/p&gt;

&lt;p&gt;The model optimized for its own convenience, not for my system. And it made dozens of decisions I never asked for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spec as Anxiety Relief
&lt;/h2&gt;

&lt;p&gt;I realized I was tired. Tired of holding my breath every time I hit "Apply," wondering what exactly was about to break.&lt;/p&gt;

&lt;p&gt;At some point, I realized this isn’t just about AI being unpredictable. It’s about me not defining things clearly enough. That’s when I started using a &lt;strong&gt;Spec&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s not just a technical fix; it’s anxiety relief. When I put a Markdown file in Git between my head and the code, I can finally breathe. I’m no longer guessing what’s going to happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Architecture Chat: I use ChatGPT to argue about edge cases. I often dictate my thoughts by voice—it's easier to "think out loud" about things like race conditions. We talk until we have a solid &lt;code&gt;feature_spec.md&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Consistency Check: I make the coding agent compare the new spec with my actual repo. If the AI finds a contradiction before writing code, I’ve already won.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Implementation: Only when the spec and architecture are aligned do I let the AI touch the code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Same Task. Same AI. Different Outcome.
&lt;/h2&gt;

&lt;p&gt;When I implemented the same feature using a spec, the result was night and day.&lt;/p&gt;

&lt;p&gt;I explicitly defined the rules: "Use the existing YAML prompt storage. Use Telegram's native buttons. Do not force the user to type hashtags."&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.amazonaws.com%2Fuploads%2Farticles%2Fo1nlrldzbangfv90mnzl.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.amazonaws.com%2Fuploads%2Farticles%2Fo1nlrldzbangfv90mnzl.png" alt="Clean button logic vs hashtag mess" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent followed the contract. This time, it created a new prompt template in the right place and implemented a clean button-based UX.&lt;/p&gt;

&lt;p&gt;The difference wasn’t the model. It was the spec. The code remained clean, the architecture stayed intact, and I actually understood the diff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI is a fast, but very average developer.&lt;/p&gt;

&lt;p&gt;Without boundaries, it will pick the easiest, messiest path. It will still "work." And that's the dangerous part. You won't notice the rot until it's too late.&lt;/p&gt;

&lt;p&gt;Stop prompting. Start defining.&lt;/p&gt;

&lt;p&gt;How do you handle the AI's urge to "improve" your architecture without asking? Let’s discuss in the comments.&lt;/p&gt;

&lt;p&gt;Photo: &lt;a href="https://www.flickr.com/photos/infomatique/6281472940" rel="noopener noreferrer"&gt;William Murphy / flickr&lt;/a&gt; — CC BY-SA 2.0&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
