<?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: maxmoffa</title>
    <description>The latest articles on DEV Community by maxmoffa (@maxmoffa).</description>
    <link>https://dev.to/maxmoffa</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%2F152902%2Fe15e5b27-7d58-4def-a36d-0529f62bbc71.png</url>
      <title>DEV Community: maxmoffa</title>
      <link>https://dev.to/maxmoffa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxmoffa"/>
    <language>en</language>
    <item>
      <title>wakey-claude: surviving the Claude Code 5-hour usage window</title>
      <dc:creator>maxmoffa</dc:creator>
      <pubDate>Mon, 06 Jul 2026 11:17:46 +0000</pubDate>
      <link>https://dev.to/maxmoffa/wakey-claude-surviving-the-claude-code-5-hour-usage-window-5h95</link>
      <guid>https://dev.to/maxmoffa/wakey-claude-surviving-the-claude-code-5-hour-usage-window-5h95</guid>
      <description>&lt;h2&gt;
  
  
  The problem: the 5-hour wall
&lt;/h2&gt;

&lt;p&gt;If you use Claude Code on a Pro or Max subscription, you know the drill. You're deep into a long refactor, the agent is mid-flow, and then the &lt;strong&gt;5-hour usage window&lt;/strong&gt; runs out. The session stops, context evaporates, and whatever the agent was doing is left in an undefined state.&lt;/p&gt;

&lt;p&gt;The usual "solutions" are all some flavor of babysitting: watch the usage percentage in the status line, guess when the reset happens, keep a mental note to come back, or set up a cron job / &lt;code&gt;at&lt;/code&gt; task that blindly restarts something at a hardcoded time. All of them put the burden on you, and none of them solve the real problem: &lt;strong&gt;the agent loses its train of thought exactly when it's most expensive to lose it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What I wanted was different: the session should notice &lt;em&gt;by itself&lt;/em&gt; that the limit is close, &lt;strong&gt;write down where it is&lt;/strong&gt;, and &lt;strong&gt;come back on its own&lt;/strong&gt; when the window resets — no cron, no external scheduler, no human alarm clock.&lt;/p&gt;

&lt;p&gt;That's wakey-claude.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Wakey wakey, it's time for school"&lt;/em&gt; — except it's your usage window resetting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The idea: an alarm, not a babysitter
&lt;/h2&gt;

&lt;p&gt;The core design decision is that wakey-claude is &lt;strong&gt;event-based, not state-based&lt;/strong&gt;. Nothing runs in the background, nothing polls, and nothing is written to disk until usage actually crosses the threshold. When it does, the thing that gets written is a &lt;strong&gt;one-shot alarm&lt;/strong&gt; — a tiny flag file — not continuously-updated state.&lt;/p&gt;

&lt;p&gt;This matters because both hook points that Claude Code offers run &lt;em&gt;very&lt;/em&gt; often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;statusLine&lt;/code&gt; command re-renders constantly;&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;PreToolUse&lt;/code&gt; hook fires before every single tool call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If either of them did real work on every invocation, you'd pay for it on every render and every tool call. Instead, each piece does the absolute minimum and the flag file is the only communication channel between them.&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%2Fhom9xls5aog05r7hhq4i.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%2Fhom9xls5aog05r7hhq4i.png" alt="The flag file lifecycle — from armed to handled to deleted, once per 5-hour window" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The flag file lifecycle — from armed to handled to deleted, once per 5-hour window&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Three pieces cooperate:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The sensor: &lt;code&gt;usage-statusline.sh&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Claude Code pipes its status JSON into the &lt;code&gt;statusLine&lt;/code&gt; command on every render. The script prints the usual one-line summary (model, 5-hour usage %, context usage), but it also acts as a &lt;strong&gt;threshold sensor&lt;/strong&gt;: when &lt;code&gt;rate_limits.five_hour.used_percentage&lt;/code&gt; crosses the threshold (default &lt;strong&gt;95%&lt;/strong&gt;, configurable via &lt;code&gt;USAGE_GUARD_THRESHOLD&lt;/code&gt;), it raises the alarm by writing &lt;code&gt;~/.claude/wakey-flag.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resets_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-06T15:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-06T10:47:12Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Below threshold it writes nothing. And if a flag for the current window's &lt;code&gt;resets_at&lt;/code&gt; already exists, it writes nothing either — this dedup guard is deliberate, because an unconditional overwrite would silently re-arm an alarm that already fired.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The consumer: &lt;code&gt;usage-guard.sh&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;PreToolUse&lt;/code&gt; hook is a dumb one-shot consumer. No flag file → no-op, exit 0, the tool call proceeds. If the flag exists and hasn't been handled, the guard &lt;strong&gt;blocks the tool call exactly once&lt;/strong&gt;, flips &lt;code&gt;handled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;, and uses the blocked-call feedback to tell Claude what to do: &lt;em&gt;checkpoint your progress, schedule a native wakeup, stop starting new work&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If the flag is already handled, or its window has already reset, the guard passes through (deleting an expired flag as it goes).&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Claude itself
&lt;/h3&gt;

&lt;p&gt;This is the part I like most: the checkpoint and the wakeup are &lt;strong&gt;delegated to the agent&lt;/strong&gt;, not implemented in bash. When the guard blocks it, Claude:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;writes a &lt;code&gt;PROGRESS.md&lt;/code&gt; describing exactly where it is and what's left;&lt;/li&gt;
&lt;li&gt;schedules a native one-time wakeup for &lt;code&gt;resets_at&lt;/code&gt; + 3 minutes;&lt;/li&gt;
&lt;li&gt;stops.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the wakeup fires, Claude reads &lt;code&gt;PROGRESS.md&lt;/code&gt; and resumes exactly where it left off. The bash side never needs to know &lt;em&gt;how&lt;/em&gt; to schedule anything on your OS — the agent figures that out, which is precisely the kind of glue work agents are good at.&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%2F7vdj3m8dd6erh12ns9so.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%2F7vdj3m8dd6erh12ns9so.png" alt="Claude writing its checkpoint and scheduling a wakeup at the window reset" width="799" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude writing its checkpoint and scheduling a wakeup at the window reset&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The flag file lifecycle
&lt;/h2&gt;

&lt;p&gt;The whole protocol fits in three states per 5-hour window:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Who sets it&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;written (&lt;code&gt;handled: false&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;statusline&lt;/td&gt;
&lt;td&gt;usage crossed the threshold, alarm armed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;handled (&lt;code&gt;handled: true&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;guard&lt;/td&gt;
&lt;td&gt;Claude was told to checkpoint and schedule the wakeup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleted&lt;/td&gt;
&lt;td&gt;guard / next crossing&lt;/td&gt;
&lt;td&gt;window reset, ready for a fresh flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A corrupt or unparseable flag can't serve as either an alarm or a dedup key, so it's treated as "expired" by the guard (deleted, fail open) and as "no flag" by the statusline (overwritten). Since the statusline runs far more often than the guard, the file &lt;strong&gt;self-heals&lt;/strong&gt; on the next render.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fail open, always
&lt;/h2&gt;

&lt;p&gt;A hook that runs before &lt;em&gt;every&lt;/em&gt; tool call has one non-negotiable property: &lt;strong&gt;it must never accidentally lock you out of your own session&lt;/strong&gt;. Every "can't tell / don't know" path in the guard exits 0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jq&lt;/code&gt; missing → pass through;&lt;/li&gt;
&lt;li&gt;flag unparseable → delete it, pass through;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resets_at&lt;/code&gt; missing or in the past → delete it, pass through;&lt;/li&gt;
&lt;li&gt;already handled → pass through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only path that blocks is the happy one: a valid, unhandled flag for a window that hasn't reset yet. And it blocks &lt;strong&gt;once&lt;/strong&gt; — the &lt;code&gt;handled&lt;/code&gt; boolean is the dedup mechanism.&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wakey-claude &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This copies the two scripts into &lt;code&gt;~/.claude/hooks/&lt;/code&gt; and merges the &lt;code&gt;statusLine&lt;/code&gt; and &lt;code&gt;PreToolUse&lt;/code&gt; entries into &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, backing it up first and leaving your existing hooks untouched. &lt;code&gt;uninstall&lt;/code&gt; removes only what it added, and &lt;code&gt;status&lt;/code&gt; tells you what's installed and whether an alarm is currently armed.&lt;/p&gt;

&lt;p&gt;It also works per-project:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wakey-claude &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt;          &lt;span class="c"&gt;# shared with the team, committed&lt;/span&gt;
npx wakey-claude &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nt"&gt;--local&lt;/span&gt;  &lt;span class="c"&gt;# personal, gitignored&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Project-scope settings reference the scripts via &lt;code&gt;$CLAUDE_PROJECT_DIR&lt;/code&gt; instead of absolute paths, so they survive moving or cloning the checkout — and &lt;code&gt;install --project&lt;/code&gt; gitignores the flag file for you, because a one-shot alarm is transient state, not something to commit.&lt;/p&gt;
&lt;h2&gt;
  
  
  When (not) to use this
&lt;/h2&gt;

&lt;p&gt;Like every small tool, it has a specific shape of problem it solves.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Long interactive sessions on a &lt;strong&gt;Pro/Max subscription&lt;/strong&gt;, where losing the agent's context mid-task is the real cost.&lt;/li&gt;
&lt;li&gt;✅ Teams that want the same guard shipped to everyone via a committed &lt;code&gt;.claude/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;❌ API-key logins — &lt;code&gt;rate_limits.five_hour&lt;/code&gt; is simply not populated, the status line shows &lt;code&gt;n/a&lt;/code&gt; and the guard never triggers.&lt;/li&gt;
&lt;li&gt;❌ Headless or CI environments — there's no interactive session to pause, and no statusline render loop to raise the flag.&lt;/li&gt;
&lt;li&gt;❌ Machines that sleep — the session process must stay alive for the scheduled wakeup to fire. A closed laptop lid or a dead SSH/tmux session silently prevents the resume.&lt;/li&gt;
&lt;/ul&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%2Fhp2llpo77ckn6347yser.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%2Fhp2llpo77ckn6347yser.png" alt="*Claude waking up and picking up from PROGRESS.md*" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude waking up and picking up from PROGRESS.md&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The project is on GitHub: MaxMoffa/wakey-claude. It's small — two bash scripts, a Node CLI for install/uninstall/status, and a test suite covering both — with &lt;code&gt;jq&lt;/code&gt; as the only runtime dependency on the bash side.&lt;/p&gt;

&lt;p&gt;Feedback, issues, and PRs are very welcome — especially if you've found a different way to survive the 5-hour wall and want to compare notes.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MaxMoffa" rel="noopener noreferrer"&gt;
        MaxMoffa
      &lt;/a&gt; / &lt;a href="https://github.com/MaxMoffa/wakey-claude" rel="noopener noreferrer"&gt;
        wakey-claude
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      "Wakey wakey, it's time for school" — except it's your 5-hour usage window resetting.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;
              z Z
        \ | / z
     ' -(u_u)- ' ______________________
        / | \.-'  ~   ~   ~   ~   ~  '-.
       (pillow)________________________/

 _    _   ___   _   __ _____ __   __
| |  | | / _ \ | | / /|  ___|\ \ / /
| |  | |/ /_\ \| |/ / | |__   \ V / 
| |/\| ||  _  ||    \ |  __|   \ /  
\  /\  /| | | || |\  \| |___   | |  
 \/  \/ \_| |_/\_| \_/\____/   \_/  
 _____  _       ___   _   _ ______  _____ 
/  __ \| |     / _ \ | | | ||  _  \|  ___|
| /  \/| |    / /_\ \| | | || | | || |__  
| |    | |    |  _  || | | || | | ||  __| 
| \__/\| |____| | | || |_| || |/ / | |___ 
 \____/\_____/\_| |_/ \___/ |___/  \____/ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;wakey-claude&lt;/h1&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/MaxMoffa/wakey-claude" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>claudecode</category>
      <category>claude</category>
      <category>aiagents</category>
      <category>developertools</category>
    </item>
    <item>
      <title>The brain freeze between us and AGI</title>
      <dc:creator>maxmoffa</dc:creator>
      <pubDate>Thu, 02 Jul 2026 21:10:00 +0000</pubDate>
      <link>https://dev.to/maxmoffa/the-brain-freeze-between-us-and-agi-14ko</link>
      <guid>https://dev.to/maxmoffa/the-brain-freeze-between-us-and-agi-14ko</guid>
      <description>&lt;p&gt;Imagine growing up with the same brain you had when you were 10 years old: same knowledge, same experience. You would probably embrace life without asking too many questions, but you would never become the best version of yourself.&lt;/p&gt;

&lt;p&gt;I have been spending these months thinking about AI, using it and trying to look ahead at the end goal. The obvious question is: “what’s next?” AI models like Claude Mythos and many others are getting much smarter than their first versions. I remember talking with a colleague last week about how “stupid” they used to be looking back, and now the models we use every day feel much sharper and more coherent. The point here is that they improved in just a few years, across different versions that were mostly human-made. Maybe, if they started improving themselves, we might reach AGI faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AGI?
&lt;/h2&gt;

&lt;p&gt;So what is AGI exactly? AGI stands for Artificial General Intelligence, and the keyword here is “general”. The models we use every day are incredibly smart but in a way they are still specialists, great at the tasks they were trained for but not really able to understand the world the way we do. An AGI would be a different beast, a model able to learn, reason and adapt to any kind of problem you throw at it, even the ones it has never seen before, exactly like a human being would. For me this is the real finish line, not a model that already knows everything, but one that can learn anything on its own, without waiting for the next version to come out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do I mean by human-made?
&lt;/h2&gt;

&lt;p&gt;These are human-made models for me because there are still, nowadays, a few parts of a model’s training process where we (assuming you are not an agent) are required, and I feel like this is the main reason we don’t have AGI yet. I read an article from Anthropic about this and they were saying that AI models are improving their capabilities and are now able to improve themselves in many phases, but there are still huge architectural choices made by humans, and a lot of the problem-setting and the judging of results is done by flesh and blood.&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%2Fd3p36bdknpfbd4qe622l.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%2Fd3p36bdknpfbd4qe622l.png" alt="The evolution of AI development, from simple chat to a closed self-improvement loop. Diagram inspired by Anthropic’s “When AI builds itself”" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The evolution of AI development, from simple chat to a closed self-improvement loop. Diagram inspired by Anthropic’s “When AI builds itself”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have been using the Playwright plugin with my Claude subscription and I have noticed a huge spike in autonomy: when they understand the problems and recognize them, they are able to fix these “bugs” most of the time. I’m actually using it while I write this article, I asked Claude to build a new feature in my platform, it built the feature and then tested it. After this it noticed from the test that something wasn’t working, and it instantly knew the task needed more digging. Then I wondered what could happen if a model could remember its errors right away and critique its own choices and by “remember” I don’t mean its context, which it loses once the session ends.&lt;/p&gt;

&lt;p&gt;Probably Claude and all the other frontier models still have to learn to be self-critical. This skill helps us humans improve when we are dealing with new things and stepping out of our comfort zone, but in order to improve we need to be able to do it on our own, without waiting for someone else to be part of the process. AI needs a neuroplastic brain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does neuroplastic mean, and why is it so important?
&lt;/h2&gt;

&lt;p&gt;We humans (or should I say animals) have the best architecture that mother nature could bring to the table: we are autonomous machines able to understand ourselves and what we need in order to survive. After many years of evolution behind us, we have been able to adapt to the fast-changing world we live in. Our brain is able to understand how everything works and adapt to it, continuously.&lt;/p&gt;

&lt;p&gt;This continuous adapting and self-improving process has been possible thanks to our neuroplastic brain. Neuroplasticity is our brain’s ability to change its own structure and functions based on our experiences, knowledge and life. This is the missing block in AI’s capabilities, the one that will make AI grow even faster than it did this last year.&lt;/p&gt;

&lt;p&gt;Before going further, I need to draw a line that often gets blurred. Learning continuously is one thing; becoming aware of what you learn is another. The first is an engineering problem: how do we let a model update its own weights from new experience without breaking what it already knows? The second is a much deeper, still open question about consciousness and identity. In this article I'm talking about the first one. I see continual learning as a necessary step toward something more human-like, maybe even a necessary condition for it, but not a sufficient one. So when I say AI needs a neuroplastic brain, I don't mean it will suddenly feel or know it exists. I mean it should stop being frozen, and start changing with the world it lives in. Whether that ever turns into real awareness is a different story, and honestly one I can't promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI model we are using is a frozen brain
&lt;/h2&gt;

&lt;p&gt;The new models are learning many things nowadays, there’s a new version almost every month, they are improving very fast but they still can’t keep pace. When new AI models come to life they learn a lot of new stuff: the knowledge ranges from coding to biology, literature to math and so on. Once they finish their training phase, the new monster gets tested, and once everything checks out the brain gets frozen. It’s not literal, obviously, but the brain gets locked in that state: when you are using a model, let’s say Opus 4.8, it experiences new concepts and ideas every day through your chats, but that knowledge doesn’t become part of its capabilities or its ‘approach to life’.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is the brain frozen?
&lt;/h2&gt;

&lt;p&gt;You might be asking, why do they freeze it? That might feel like something stupid but there are a number of reasons. First, you keep control of it: if you remove the leash, it might become something that the creator didn’t want to build or didn’t imagine, and if a company releases a product that might change, for better or for worse, without their will, it could be risky. But the biggest risk with continual learning nowadays is something called “catastrophic forgetting”.&lt;/p&gt;

&lt;p&gt;When these neural networks learn something, they write this knowledge inside their weights, which we can say are the blocks which make the brain. Now when something new gets taught to the model, those same weights get updated (you don’t get new weights for new things), so old knowledge might get overwritten, and this leads to the model forgetting something it learnt in the past. There are techniques to mitigate this major flaw during the creation process, looking mostly at each weight or with other options, but these instruments aren’t enough yet for a continual learning brain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI approach
&lt;/h2&gt;

&lt;p&gt;To be fairly honest, they have a few ways to learn things while we chat with them. Beside the context window, which is temporary memory, they can store new info about us and how we work using markdown files, or in the most advanced configuration with a database of some sort. These are external instruments that the LLM can use to access context and so keep track of the things it does. &lt;/p&gt;

&lt;p&gt;Let’s imagine an AI model like a black box: we give an input on one side, then something happens inside the box and we get an output from the other side. What happens inside is what we are talking about. Inside there is the “real brain” that we are trying to upgrade continuously; when we use files and databases we are not talking about something inside that box, but about the instruments the box can use.&lt;/p&gt;

&lt;p&gt;As an example, we can say the box is like us: it can sort of think and receive inputs and outputs, while markdown files and databases are like a book. We can read it if we need to do something related to its content, but it’s not necessarily something that remains inside of us. It’s worth being precise here: during training the box did learn like us, absorbing knowledge into itself, but once frozen it can only rely on the book.&lt;/p&gt;

&lt;p&gt;I’ll go even deeper with the example. Let’s say the book is a dictionary: we find a new word we have never seen before and decide to look it up. Once we get to it, we can read what it means and understand. Now let’s say we do that with multiple words. Time has passed, and now, without the dictionary, we can still understand the meaning of a few words we read in that book, while maybe we totally forgot the meaning of others we looked up the same way. An AI model couldn’t remember any of those words; it will always need the book, which in the AI context means the files and the databases.&lt;/p&gt;

&lt;p&gt;What we experience doesn’t go only into our memory, it goes much deeper into our brain. This affects us very deeply and changes the way we interact with the world, something that a context window loaded with the same data can’t do: it changes what we are. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are they doing in this direction?
&lt;/h2&gt;

&lt;p&gt;The Anthropic article I mentioned before (you can find it in the links below) says a lot about this topic and about how AI models evolve. We started a few years ago with a simple chat, then we started building the harness around the model to make it smarter, until we got to agents and then to the agent-orchestration level. Now we are able to launch multiple instances of AI agents working together on the same project. The models have become so much better than the early versions that they are able to take part in generating the new versions of themselves, but not completely.&lt;/p&gt;

&lt;p&gt;The next step, it seems from the article, will be closing the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the loop
&lt;/h2&gt;

&lt;p&gt;Once the loop is closed the AI models won’t need us anymore to help them become better, we’ll become only users; only the infrastructure will need to be maintained by us, at least until AI gets a body. I don’t want to create an illusion, I respect you for reading my thoughts, but this isn’t a fully neuroplastic brain, because it still requires a full process like the one they are running today, so this loop isn’t fast enough. We learn every day and everywhere and sometimes we don’t decide what life is teaching us, at this stage AI is still being built in a lab, not in the real world. To gain neuroplasticity we need to embed the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedding the loop
&lt;/h2&gt;

&lt;p&gt;Embedding the loop means that AI will gain its neuroplastic skill and will be able to learn new things continuously, every day, without any human input. It means that the speed we are used to seeing between model versions will increase so drastically that it probably won’t be smart to keep giving it a version number. This means one step ahead in its evolution cycle; and again, this doesn’t mean consciousness, but the path is probably the right one. In order to gain this kind of loop, we need models able to dynamically update their weights, the ones they use inside to build the answers to our questions.&lt;/p&gt;

&lt;p&gt;And now the big question, how? Going back to neuroplasticity, a human brain doesn’t engrave everything it gets to interact with in real time, this information is temporary in our memory, let’s say like a big context. The real moment the brain goes back to this temporary data is while we are sleeping, that’s where our “inner weights” get updated. OpenClaw, if you are reading this you probably know what I am talking about, already has something similar at harness level: there is a dreaming phase where it cleans its own memory and organizes it, but it doesn’t touch the weights, it’s just updating markdown files. Imagine if all of us got to have a “child model”: all of them start from the same knowledge but each one grows differently because it is having different experiences, and they could have a second model for dreaming that helps cleaning the temporary stuff and updates the weights carefully: consolidation instead of real-time engraving, which is exactly how you avoid catastrophic forgetting. A dreaming model. This idea reminds me of the movie “I, Robot” (2004), when Sonny (the conscious android) tells the detective about his dream and Detective Del Spooner, played by Will Smith, says that robots can’t dream. And no, giving models a dreaming phase won’t make them Sonny, but it might finally let them wake up a little different from yesterday.&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%2Fu1gbfqy5arrlm3gpc7z5.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%2Fu1gbfqy5arrlm3gpc7z5.png" alt="Sonny during the interrogation scene in “I, Robot” (2004), © 20th Century Fox" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sonny during the interrogation scene in “I, Robot” (2004), © 20th Century Fox&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And the AGI?
&lt;/h2&gt;

&lt;p&gt;Last but not least, AGI is the end goal of this futuristic gold rush. I’m not gonna say when and how AGI will be among us, no one has the ability to imagine a date for it yet, but I can say pretty easily that achieving the neuroplastic skill and letting AI models run free might be dangerous or might be epic. Remember the 10-year-old brain from the beginning? Imagine being born with all that knowledge: you probably knew how to solve simple math problems, write, read and interact with people; then you go on with your life and become a young adult at 30, but with the same brain you had 20 years before, the same emotions and capabilities. How would you interact with the world? Would you even be conscious enough of what’s happening around you? Even if you got an update at 20, after a year it would be already outdated. We need to keep learning, improving and understanding ourselves more.&lt;/p&gt;

&lt;p&gt;Maybe, going back to the version number of AI models, it might not be as useless as I said before; it will just turn into its age.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/institute/recursive-self-improvement" rel="noopener noreferrer"&gt;https://www.anthropic.com/institute/recursive-self-improvement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/the-power-of-continuous-learning/" rel="noopener noreferrer"&gt;https://openai.com/index/the-power-of-continuous-learning/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openclaw.ai/concepts/memory" rel="noopener noreferrer"&gt;https://docs.openclaw.ai/concepts/memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unsplash.com/it/foto/unimmagine-generata-al-computer-di-un-cervello-umano-ZnkHPagIOlM" rel="noopener noreferrer"&gt;Cover by Shawn Day on Unsplash&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>agi</category>
      <category>llm</category>
    </item>
    <item>
      <title>The beauty of modularity: a discipline of looking, not building</title>
      <dc:creator>maxmoffa</dc:creator>
      <pubDate>Fri, 08 May 2026 16:28:00 +0000</pubDate>
      <link>https://dev.to/maxmoffa/the-beauty-of-modularity-a-discipline-of-looking-not-building-3edn</link>
      <guid>https://dev.to/maxmoffa/the-beauty-of-modularity-a-discipline-of-looking-not-building-3edn</guid>
      <description>&lt;p&gt;Every developer knows it: &lt;em&gt;divide et impera&lt;/em&gt;, simplify and execute. There's nothing more fascinating, in computer science, than the ability to break down a complex task into simpler, more intuitive ones — it's the foundation on which every problem, every program, every line of code is built.&lt;/p&gt;

&lt;p&gt;Starting from this observation, I want to try to tell what fascinates me about making things modular and composing them to build something bigger. I try to apply this principle in every project I work on, so I can reuse what I write as often as possible: I can't stand throwaway code, written to run in one specific case and then die. There are contexts where it's unavoidable, but where it can be avoided I think it's worth doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do I mean by "modular"?
&lt;/h2&gt;

&lt;p&gt;When I say something is &lt;strong&gt;modular&lt;/strong&gt;, I don't just mean it's "broken into pieces." I mean it's made of &lt;strong&gt;autonomous units&lt;/strong&gt; that can live and change without dragging the rest along.&lt;/p&gt;

&lt;p&gt;For me, a module always has three traits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear boundaries&lt;/strong&gt;: it's clear what's inside and what's outside, and what it's responsible for. This reduces ambiguity and chaos ("where does this responsibility end?").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit interface&lt;/strong&gt;: it talks to the outside through a few declared access points. In software these can be APIs, ports, events, props, CLIs, environment variables, input and output files. In real life they can be procedures, checklists, templates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substitutability and reuse&lt;/strong&gt;: if you keep the interface stable, you can change the implementation or reuse the same piece across contexts without rewriting from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, modularity for me is a strategy to &lt;strong&gt;lower the cost of change over time&lt;/strong&gt;: if tomorrow I have to update a piece, I want to be able to do it without breaking or rewriting everything else.&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%2Fkrlyezvpdsf8d7c8jupn.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%2Fkrlyezvpdsf8d7c8jupn.png" alt="Modular bricks (interlocking) – close-up" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modular bricks (interlocking) – close-up&lt;/p&gt;

&lt;h2&gt;
  
  
  Modularity at its best (in my opinion)
&lt;/h2&gt;

&lt;p&gt;When I think about modularity in the digital world, a few examples come to mind that, more than others, manage to embody its spirit: not just "breaking into pieces," but building blocks with clear boundaries, clean interfaces, and a life of their own — pieces you can combine, swap, or reuse without having to start over.&lt;/p&gt;

&lt;p&gt;The examples I picked come from very different contexts — infrastructure, frontend, and personal productivity — and that, in my view, is exactly the point: modularity isn't a feature of a language or a framework, it's a way of thinking that shows up at every level of the stack. In each of these cases I like to look at two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;what&lt;/em&gt; is being made modular (the process, the component, the unit of content);&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;how&lt;/em&gt; it's being made modular, meaning which "boundaries" actually make that piece independent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;I like to picture Docker containers as &lt;em&gt;hot-swap cards&lt;/em&gt;: closed, self-contained objects you plug in or pull out without shutting the system down. Each container carries its own code, runtime, libraries, and configuration, and exposes itself only through a clean interface: ports, volumes, environment variables.&lt;/p&gt;

&lt;p&gt;This image, I think, captures Docker's modularity well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear boundaries&lt;/strong&gt;: what happens inside stays inside, which kills off most of the "works on my machine" pain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substitutability&lt;/strong&gt;: you can swap a container (even a database one) without touching the rest, because the interface stays the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composability and reproducibility&lt;/strong&gt;: with &lt;code&gt;docker compose&lt;/code&gt; you assemble multiple "cards" and get the same system on a laptop, across a team, and in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most interesting part is the mental shift: you don't "fix" the server anymore, you replace components like slotting in a card. The metaphor has its limits, and it's worth exploring them because they clarify what modularity can and can't promise.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But&lt;/em&gt; the isolation is less total than the metaphor suggests: containers share the host kernel, and portability is paid for in bloated images, slow builds, and a security surface you still have to watch.&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%2F9ptdhmpncyznl479jn9i.webp" 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%2F9ptdhmpncyznl479jn9i.webp" alt="Di Software: Docker, Inc.Screenshot: VulcanSphere - Self-taken; derivative work, Apache License 2.0, https://commons.wikimedia.org/w/index.php?curid=182060522" width="799" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Di Software: Docker, Inc.Screenshot: VulcanSphere - Self-taken; derivative work, Apache License 2.0, &lt;a href="https://commons.wikimedia.org/w/index.php?curid=182060522" rel="noopener noreferrer"&gt;https://commons.wikimedia.org/w/index.php?curid=182060522&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Module Federation
&lt;/h3&gt;

&lt;p&gt;If Docker makes &lt;em&gt;infrastructure&lt;/em&gt; modular, Module Federation brings the same spirit to the &lt;strong&gt;frontend&lt;/strong&gt;: born with Webpack 5 and now available in Vite too via plugins, it lets multiple applications (even from different teams) expose and consume modules at runtime, instead of compiling one monolithic bundle. A stable shell loads pieces (components, pages, libraries) published elsewhere on the fly and composes them into a single experience.&lt;/p&gt;

&lt;p&gt;My mental image is an app &lt;em&gt;built from grafts&lt;/em&gt;: each &lt;em&gt;remote&lt;/em&gt; is a deployable module with clear boundaries and an explicit interface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real release boundaries&lt;/strong&gt;: each remote has its own build, pipeline, and version. Updating a piece doesn't mean redeploying the whole shell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuse without duplication&lt;/strong&gt;: a module lives in one place and is consumed wherever it's needed, cutting copies and drift across projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlled shared dependencies&lt;/strong&gt;: common libraries (e.g., React, the design system, utilities) are negotiated between host and remote.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's interesting is that modularity here isn't "free": it shifts decisions and responsibilities onto boundary design, failure handling, and performance. It's exactly that friction that makes you understand when runtime modularity really pays off, and when it just adds complexity.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But&lt;/em&gt; the price is sneaky: bugs move from build-time to runtime, version mismatches between host and remote only surface in production, and every network failure becomes a visible failure of the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notion
&lt;/h3&gt;

&lt;p&gt;One last shift in level: from infrastructure to frontend, now we move up to the user-facing tool. Notion is probably the example I live closest to, and it's literally the tool I'm using to write this post. The thing that strikes me most is that the same environment I'm using to put these lines together is also the one I use to run my company, build procedures, collect ideas, and organize projects: one place, many different uses, all built from the same little bricks.&lt;/p&gt;

&lt;p&gt;My mental image is a set of composable &lt;strong&gt;bricks&lt;/strong&gt;: blocks, pages, databases, and views all belong to the same family and offer clean contact surfaces to the other pieces.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear boundaries for each block&lt;/strong&gt;: every element (paragraph, toggle, table, embed) is its own unit — movable, duplicable, nestable, without breaking the context it lives in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuse and composition&lt;/strong&gt;: a database can show up on multiple pages as different views, a page can be linked, embedded, or turned into a template, and the same schema works for both a blog post and a company procedure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same tool, different contexts&lt;/strong&gt;: from blog posts to CRM, from meeting notes to a lab HACCP, the content changes but the mental model doesn't, and that lowers the cost of switching between activities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting point is exactly this: modularity doesn't show up in the single block, it shows up in the fact that the same "language" supports wildly different uses without ever feeling forced. It's proof that, when the boundaries are well thought out, a few base pieces are enough to cover hugely different scenarios.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But&lt;/em&gt; the same freedom that makes it powerful is also its Achilles' heel: without strong conventions you end up reorganizing the workspace more than actually using it, and the "right" module always seems to be one step further away.&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%2Fgkibojji0zeyeej42pqg.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%2Fgkibojji0zeyeej42pqg.png" alt="Notion desktop (https://www.notion.com/help/notion-for-desktop)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notion desktop (&lt;a href="https://www.notion.com/help/notion-for-desktop" rel="noopener noreferrer"&gt;https://www.notion.com/help/notion-for-desktop&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Modularity in "real" life
&lt;/h2&gt;

&lt;p&gt;You might not expect it, but modularity isn't a computer science invention: the physical and organizational world is full of remarkable examples, often so woven into our daily lives that they go almost unnoticed. Here are a few that, in my opinion, tell the same story as Docker containers and Notion blocks, just off-screen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ISO shipping containers&lt;/strong&gt;: same box, same dimensions, same hooks for decades. The contents change (fruit, cars, clothes) but not how they're moved, and around that single interface an entire global logistics system has been rebuilt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LEGO bricks&lt;/strong&gt;: a handful of piece types, an interface (the studs on top and bottom) standardized for decades, and a composition range that goes from a spaceship to the Eiffel Tower. The same piece from 1980 still snaps onto a set released yesterday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IKEA furniture (e.g., Kallax)&lt;/strong&gt;: same cubes, same dimensions, same holes. The interface here is literally physical: the standard 32 mm hole and the cube's dimensions, constant across models and accessories. The same cube becomes a bookshelf, a room divider, a TV stand, or a vinyl holder depending on context, without the piece itself really changing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automotive platforms (e.g., Volkswagen's MQB)&lt;/strong&gt;: the same chassis and the same electrical architecture support the Golf, Audi A3, Skoda Octavia, and SEAT Leon. The module is the mechanical base, the interface is how the bodywork and engines attach to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The mother sauces of classical cooking&lt;/strong&gt;: five bases (béchamel, velouté, espagnole, tomato, hollandaise) from which hundreds of derivative sauces come. Change one ingredient "at the interface" and you get a different dish, without starting from scratch each time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread is always the same: clear boundaries, a stable interface, and pieces you can swap without bringing down the rest. Once you start seeing it that way, modularity stops being a code question and becomes a way of looking at the world.&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%2Fcj475k3ahr3nj3na7u8h.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%2Fcj475k3ahr3nj3na7u8h.png" alt="ISO shipping containers in a port" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ISO shipping containers in a port&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you discover a module?
&lt;/h2&gt;

&lt;p&gt;The thing I like most, when I'm working on a system or a company, is that &lt;strong&gt;a module isn't invented — it's discovered&lt;/strong&gt;. It's already there, inside the problem, hidden under noise, repetitions, and habits. What we call "designing a module" is actually an act of observation: it means noticing a boundary that has been there for a long time and finally giving it a name.&lt;/p&gt;

&lt;p&gt;I like to think of it as sculpture: the marble block already contains the statue, the sculptor doesn't create — they remove what's in excess until the shape comes out on its own. In the same way, in a system or a process there are already natural fault lines — my job is just to recognize them before forcing arbitrary divisions.&lt;/p&gt;

&lt;p&gt;To spot them, I usually rely on a few recurring signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repetition&lt;/strong&gt;: if I'm writing or doing the same thing for the third time with small variations, there's a module underneath asking to come out. My hands are already using it, it just needs to be made explicit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Things that change together&lt;/strong&gt;: what changes for the same reasons and on the same occasions tends to belong together; what changes for different reasons wants to be separate. It's the golden rule for figuring out where to cut.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pain of change&lt;/strong&gt;: if changing one small thing forces me to touch ten unrelated places, the system is telling me the boundary was drawn in the wrong spot — or hasn't been drawn at all yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seen this way, finding a module looks more like archaeology than architecture: you dig, you brush, you wait for the shape to come out. And the best moment is when you realize that module had been there all along, and you just had the patience to find it.&lt;/p&gt;

&lt;p&gt;This has happened to me concretely a couple of times. I work for a company that does environmental monitoring, and one of the things I've built is &lt;strong&gt;Square&lt;/strong&gt;, our platform: the grids used to host charts, maps, and rankings written case by case, and at some point the repetition was so obvious that I extracted standard &lt;em&gt;widgets&lt;/em&gt; — the same ones that today live indifferently inside grids, in reports, or in other contexts. Same story for a &lt;em&gt;GIS-like&lt;/em&gt; page: the information shown on the map found its natural form as &lt;em&gt;composable layers&lt;/em&gt;, toggleable and stackable as needed, without rewriting the map every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  My attempt at building a "module"
&lt;/h3&gt;

&lt;p&gt;I tried to apply this same logic outside of code too, with &lt;strong&gt;Plop&lt;/strong&gt;, the dissolvable cube I made with some of my colleagues: the cube always stays the same, what changes is what you put inside (flavors, active ingredients), and even the liquid base you dissolve it into can vary — usually water, but milk works too if you want. Once the module is discovered, every new variant costs much less than inventing a product from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beware the false module!
&lt;/h2&gt;

&lt;p&gt;Having said all this, the opposite risk is just around the corner: once you get comfortable with modularity, the temptation is to see modules everywhere — and that's not always a good thing. The truth is that &lt;strong&gt;not everything has to be a module&lt;/strong&gt;, and forcing it often makes the system worse, not better.&lt;/p&gt;

&lt;p&gt;The two signals I watch most carefully are these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The module used only once&lt;/strong&gt;: if I've just extracted a "reusable" piece but the second use case doesn't exist and I struggle to really picture it, I'm probably paying the cost of abstraction (interface, configuration, documentation) without the benefit. It's the classic module born from a hypothesis, not from observation — almost always better to leave it inline until repetition shows up on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The module that does too much&lt;/strong&gt;: when the interface bloats with parameters, the docs start filling with "if… then…" clauses, and the internal logic gets hard to explain in a single sentence, I'm usually not looking at a complex module, but at &lt;strong&gt;multiple overlapping modules&lt;/strong&gt; asking to be separated. It's the same signal as "the pain of change," but seen from the inside: if changing one behavior forces me to understand all the rest, the boundaries are in the wrong place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule I try to keep in mind is simple: modularity has to &lt;strong&gt;reduce&lt;/strong&gt; cognitive cost, not add to it. When I feel a module is making my life harder instead of simpler, it's usually not an implementation problem — it's a sign that that module, the way I drew it, didn't really exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take home
&lt;/h2&gt;

&lt;p&gt;In the end, modularity for me is mostly this: a strategy to &lt;strong&gt;reduce cognitive cost and the cost of change over time&lt;/strong&gt;. It's not there to make a system look more elegant — it's there to make it cost less, in attention today and effort tomorrow.&lt;/p&gt;

&lt;p&gt;But what really stays with me, after all of this, isn't a technique — it's a habit of looking. Once you've seen the ISO container behind global logistics, the 32 mm hole behind the Kallax, and the five mother sauces behind an entire menu, you stop looking at the world as a single block and start looking for the fault lines — not to break everything, but to figure out where you can actually change something without having to rebuild the rest.&lt;/p&gt;

&lt;p&gt;In that sense, modularity is less a property of things and more a way of reading complexity: digging until you see the boundaries that were already there, giving them a name, and then having the discipline to leave alone the pieces that, modules, weren't really. It's the price — and the gift — of looking at the world in blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Divide et impera (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Divide_and_impera" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Divide_and_impera&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Modularity (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Modularity" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Modularity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Coupling and cohesion (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Coupling_(computer_programming)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Coupling_(computer_programming)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Separation of concerns (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Separation_of_concerns" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Separation_of_concerns&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Interface (computing) (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Interface_(computing)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Interface_(computing)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker overview: &lt;a href="https://docs.docker.com/get-started/docker-overview/" rel="noopener noreferrer"&gt;https://docs.docker.com/get-started/docker-overview/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker Compose overview: &lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;https://docs.docker.com/compose/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Containerization (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Containerization_(computing)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Containerization_(computing)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Linux kernel (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Linux_kernel" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Linux_kernel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Module Federation (Webpack docs): &lt;a href="https://webpack.js.org/concepts/module-federation/" rel="noopener noreferrer"&gt;https://webpack.js.org/concepts/module-federation/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Webpack 5 release (Webpack blog): &lt;a href="https://webpack.js.org/blog/2020-10-10-webpack-5-release/" rel="noopener noreferrer"&gt;https://webpack.js.org/blog/2020-10-10-webpack-5-release/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Micro-frontends (&lt;a href="http://martinfowler.com" rel="noopener noreferrer"&gt;martinfowler.com&lt;/a&gt;): &lt;a href="https://martinfowler.com/articles/micro-frontends.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/micro-frontends.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Notion (product): &lt;a href="https://www.notion.so/product" rel="noopener noreferrer"&gt;https://www.notion.so/product&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Notion API (as an example of explicit interfaces): &lt;a href="https://developers.notion.com/" rel="noopener noreferrer"&gt;https://developers.notion.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ISO container / Intermodal container (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Intermodal_container" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Intermodal_container&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LEGO brick (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Lego" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Lego&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;IKEA KALLAX series: &lt;a href="https://www.ikea.com/us/en/cat/kallax-series-27534/" rel="noopener noreferrer"&gt;https://www.ikea.com/us/en/cat/kallax-series-27534/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;32 mm system (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/32_mm_cabinetmaking_system" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/32_mm_cabinetmaking_system&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Volkswagen Group MQB platform (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Volkswagen_Group_MQB_platform" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Volkswagen_Group_MQB_platform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mother sauces (wikipedia): &lt;a href="https://en.wikipedia.org/wiki/Mother_sauce" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Mother_sauce&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Iodo (Plop): &lt;a href="https://iodo.tech" rel="noopener noreferrer"&gt;https://iodo.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sense Square (Square): &lt;a href="https://sensesquare.eu" rel="noopener noreferrer"&gt;https://sensesquare.eu&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>architecture</category>
      <category>computerscience</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Loved this setup, would be perfect to create a docker just for this</title>
      <dc:creator>maxmoffa</dc:creator>
      <pubDate>Thu, 30 Apr 2026 13:42:22 +0000</pubDate>
      <link>https://dev.to/maxmoffa/loved-this-setup-would-be-perfect-to-create-a-docker-just-for-this-4m6i</link>
      <guid>https://dev.to/maxmoffa/loved-this-setup-would-be-perfect-to-create-a-docker-just-for-this-4m6i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jervi/i-built-a-complete-expo-build-environment-on-wsl2-without-android-studio-nor-paying-expo-credits-4921" class="crayons-story__hidden-navigation-link"&gt;Setup Expo Build Environment on WSL2 (Without Android Studio nor Paying Expo Credits)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jervi" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F602336%2F5d34a3a2-224c-4149-8332-2df83dc07ff4.jpeg" alt="jervi profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jervi" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jervi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jervi
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3079995" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jervi" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F602336%2F5d34a3a2-224c-4149-8332-2df83dc07ff4.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jervi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jervi/i-built-a-complete-expo-build-environment-on-wsl2-without-android-studio-nor-paying-expo-credits-4921" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 2 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jervi/i-built-a-complete-expo-build-environment-on-wsl2-without-android-studio-nor-paying-expo-credits-4921" id="article-link-3079995"&gt;
          Setup Expo Build Environment on WSL2 (Without Android Studio nor Paying Expo Credits)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reactnative"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reactnative&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/linux"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;linux&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/localbuild"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;localbuild&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jervi/i-built-a-complete-expo-build-environment-on-wsl2-without-android-studio-nor-paying-expo-credits-4921" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jervi/i-built-a-complete-expo-build-environment-on-wsl2-without-android-studio-nor-paying-expo-credits-4921#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>docker</category>
      <category>mobile</category>
      <category>reactnative</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Android desktop mode: features, device support, and the OLED screen burn-in problem</title>
      <dc:creator>maxmoffa</dc:creator>
      <pubDate>Thu, 16 Apr 2026 11:53:47 +0000</pubDate>
      <link>https://dev.to/maxmoffa/android-desktop-mode-features-device-support-and-the-oled-screen-burn-in-problem-5a40</link>
      <guid>https://dev.to/maxmoffa/android-desktop-mode-features-device-support-and-the-oled-screen-burn-in-problem-5a40</guid>
      <description>&lt;p&gt;The evolution of Android has brought the dream of a true "PC in your pocket" closer to reality, especially with the advent of desktop modes on smartphones. As someone who has actively used and tested these features—most recently on my Pixel 10—I’ve seen both the productivity upside and the rough edges.&lt;/p&gt;

&lt;p&gt;My typical setup is intentionally simple: a generic Samsung 1080p monitor, a basic Baseus USB‑C hub, and a wireless keyboard + mouse connected to the hub via a USB dongle. I usually stay in desktop mode for 2–4 hours at a time with auto brightness enabled.&lt;/p&gt;

&lt;p&gt;The biggest issue is that the phone display stays on the whole time, often showing static UI. On an OLED panel, that’s a recipe for burn‑in risk. It also adds unnecessary heat, on top of whatever heat the desktop session itself generates.&lt;/p&gt;

&lt;p&gt;On top of the burn‑in angle, I’ve also run into reliability bugs. Apps sometimes open on the external desktop, but if you open the same app on the phone, it can "steal" focus and effectively collapse the desktop session back into the mobile experience.&lt;/p&gt;

&lt;p&gt;In this article, I’ll break down Android desktop mode, what devices support it, why Pixel currently has a unique OLED risk, and a temporary workaround I built: &lt;strong&gt;BlackTop&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Android desktop mode turns your phone into a multi-window desktop on an external display.&lt;/li&gt;
&lt;li&gt;On some OLED phones (notably Pixel), the phone screen can stay on with static UI during desktop sessions, increasing burn-in risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BlackTop&lt;/strong&gt; is a temporary workaround that blanks the phone display to reduce that risk while you keep working.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is android desktop mode?
&lt;/h2&gt;

&lt;p&gt;Android desktop mode is a feature that allows a compatible smartphone to project a PC-like interface onto an external display. This transforms the mobile device into a productivity workstation, supporting multiple windows, keyboard and mouse input, and advanced multitasking. The desktop environment is not just a mirrored phone screen, but a separate interface optimized for large displays, similar to what you would expect from a traditional computer.&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%2F7ka950kmygzrn8mq5lig.jpg" 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%2F7ka950kmygzrn8mq5lig.jpg" alt="A screenshot from android desktop on my pixel 10" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;The core requirement for desktop mode is support for DisplayPort Alt Mode over USB-C, which enables video output to external monitors. Not every USB-C port supports video output: some devices and cheaper hubs/cables carry data and power only.&lt;/p&gt;

&lt;p&gt;When a compatible device is connected to a monitor (often via a USB-C hub or adapter), it launches a desktop-style UI. This interface allows users to open multiple resizable windows, use keyboard shortcuts, and interact with apps in a more desktop-like manner. Peripheral support (mouse, keyboard, Ethernet, storage) further enhances the experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which devices support desktop mode?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Samsung DeX
&lt;/h3&gt;

&lt;p&gt;Samsung has been the pioneer in this space with its DeX platform, available since 2017. DeX is supported on a wide range of Galaxy devices, including the latest Galaxy S25 series, Z Fold 6, and many previous flagships like the S8 through S25, Note series, and all generations of the Fold. DeX can be launched via a wired connection or wirelessly on supported TVs and monitors. It offers a mature, feature-rich desktop experience, including multi-window support, drag-and-drop, keyboard shortcuts, and the ability to use the phone as a touchpad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Pixel desktop mode
&lt;/h3&gt;

&lt;p&gt;With Android 16, Google introduced an official desktop mode for Pixel devices, starting with the Pixel 8, 9, and 10. When connected via USB-C to a compatible display, these Pixels can now project a desktop interface. While promising, Google’s implementation is still in its early stages, lacking some of the polish and features of Samsung DeX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Motorola Ready For
&lt;/h3&gt;

&lt;p&gt;Motorola’s “Ready For” mode provides a similar desktop experience on devices like the Moto G100, G200, and Edge+ series. Ready For can be launched via HDMI, on Windows PCs via an app, or wirelessly to compatible displays. Users praise its clean Android interface and robust performance, sometimes even preferring it to Samsung DeX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Huawei Easy Projection
&lt;/h3&gt;

&lt;p&gt;Huawei’s Easy Projection is available on many Mate and P series devices. It allows users to cast their phone’s desktop environment to an external display, with features like multi-window multitasking, file management, and quick search from a start menu-like interface. Like DeX and Ready For, it leverages DisplayPort Alt Mode over USB-C.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other brands
&lt;/h3&gt;

&lt;p&gt;Other manufacturers such as HTC (U series), Asus (ROG and Razer gaming phones), and select LG models (after 2018 updates) also support desktop mode or video output via DisplayPort Alt Mode over USB-C. Some devices offer basic screen mirroring rather than a true desktop environment, and third-party solutions like Maru OS or DisplayLink adapters fill the gaps for unsupported phones, though with limitations.&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; If your desktop mode lets you turn off the phone screen or switch it into a touchpad mode (like DeX typically does), enable that setting. It reduces static UI on the OLED panel and often lowers heat and battery drain too.&lt;/p&gt;


&lt;/div&gt;


&lt;h2&gt;
  
  
  The OLED burn-in problem in desktop mode
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The issue on pixel devices
&lt;/h3&gt;

&lt;p&gt;While desktop mode is a powerful feature, it comes with a significant risk for devices with OLED displays: screen burn-in.&lt;/p&gt;

&lt;p&gt;This is especially problematic on Google Pixel devices running Android 16’s desktop mode. When the phone is connected to an external display, the internal screen can remain fully on and show static UI for the entire desktop session. If you do 2–4 hour sessions regularly, that’s a lot of time with the same elements on screen.&lt;/p&gt;

&lt;p&gt;In my case, the two most obvious consequences were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OLED risk:&lt;/strong&gt; the display is effectively "always on" during desktop mode, increasing burn‑in risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heat:&lt;/strong&gt; the phone runs noticeably hotter with the display permanently lit, on top of whatever load the desktop session adds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike Samsung DeX, which typically allows the phone screen to be turned off or repurposed as a touchpad, Google’s desktop mode currently lacks any first‑party option to blank or dim the device’s own display during desktop sessions. This design oversight makes desktop mode much riskier on OLED Pixels than it needs to be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this issue present on other devices?
&lt;/h3&gt;

&lt;p&gt;The problem is not unique to Pixel devices, but its severity and the available mitigations vary by manufacturer. Samsung DeX, Motorola Ready For, and Huawei Easy Projection all provide options to turn off or repurpose the phone’s screen when in desktop mode, greatly reducing the risk of burn-in. On these platforms, the phone’s display can usually be set to sleep, act as a touchpad, or display a screensaver.&lt;/p&gt;

&lt;p&gt;In contrast, Google’s implementation currently keeps the phone screen always on during desktop mode, with no built-in way to blank it.&lt;/p&gt;

&lt;p&gt;And there’s a second class of issues: &lt;strong&gt;stability glitches when exiting desktop mode&lt;/strong&gt;. In my experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some home screen widgets render incorrectly after you unplug, and only recover after a reboot.&lt;/li&gt;
&lt;li&gt;In some cases, the Android status bar can freeze the phone after disconnecting. Pulling down the shade triggers a freeze, and the only way to keep using the phone is to lock and unlock it again. A full reboot fixes it more permanently.&lt;/li&gt;
&lt;/ul&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%2Fv9p5ea45v1l6ifkvtnbv.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%2Fv9p5ea45v1l6ifkvtnbv.png" alt="Screenshot: widgets rendering incorrectly after exiting desktop mode (only fixed after reboot)." width="800" height="833"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot: widgets rendering incorrectly after exiting desktop mode (only fixed after reboot).&lt;/p&gt;

&lt;p&gt;A workaround that reduced the odds of the status-bar freeze for me was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Close all desktop windows.&lt;/li&gt;
&lt;li&gt;Lock the phone screen.&lt;/li&gt;
&lt;li&gt;Then unplug the USB‑C hub.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  General screen timeout and OLED burn-in concerns
&lt;/h3&gt;

&lt;p&gt;Disabling screen timeout (intentionally or because of desktop mode) increases the risk of burn-in, battery drain, and overheating on any OLED device. Best practices to avoid burn-in include lowering brightness, using dark mode, enabling dynamic screen savers, and ensuring the screen does not display static content for extended periods.&lt;/p&gt;

&lt;h2&gt;
  
  
  A temporary solution: Blacktop
&lt;/h2&gt;

&lt;p&gt;Until Google addresses this critical flaw, I have developed a workaround called &lt;strong&gt;BlackTop&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MaxMoffa" rel="noopener noreferrer"&gt;
        MaxMoffa
      &lt;/a&gt; / &lt;a href="https://github.com/MaxMoffa/blacktop" rel="noopener noreferrer"&gt;
        blacktop
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/public/favicon.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpublic%2Ffavicon.svg" alt="Blacktop icon" width="120"&gt;&lt;/a&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Blacktop&lt;/h1&gt;
&lt;/div&gt;
  &lt;p&gt;&lt;strong&gt;OLED-friendly fullscreen black overlay for Android desktop setups&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Some Android desktop modes (Google Pixel, etc.) keep the phone screen powered on while connected to an external monitor. The screen sits face-down or unused, draining battery and wearing out OLED pixels. Blacktop fixes this: one tap sends the display into a pure black fullscreen, cutting OLED power draw to near-zero without actually turning off the screen (which would kill the desktop session).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Pure Black Fullscreen&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Covers the entire screen with &lt;code&gt;#000000&lt;/code&gt;. On OLED panels, black pixels are physically off — zero light output, minimal power draw. Tap anywhere to exit.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Wake Lock&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Prevents the display from sleeping while Blacktop is in fullscreen mode. Toggle available in the UI. When the tab loses visibility, the lock is released automatically and re-acquired when the tab returns.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;PWA — Install as App&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Blacktop ships as a Progressive Web App. Install…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/MaxMoffa/blacktop" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Blacktop is a lightweight, web-based stopgap that blanks the phone’s display while you keep using desktop mode. It requires no special permissions and can work across devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Blacktop does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Blanks the phone display during desktop-mode sessions to minimize static content on the OLED panel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Blacktop does &lt;em&gt;not&lt;/em&gt; do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It does not fix the root cause in Android’s desktop mode.&lt;/li&gt;
&lt;li&gt;It cannot fix desktop-mode bugs (app focus, widgets, status bar behavior).&lt;/li&gt;
&lt;li&gt;It cannot change the behavior of your external monitor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I urge Google and other Android manufacturers to prioritize a built-in solution that allows users to turn off or blank the phone screen during desktop sessions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MaxMoffa/blacktop" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Check out Blacktop on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Call to action:&lt;/strong&gt; If you try Blacktop, please share your phone model, Android version, and your typical desktop-mode session length. That feedback helps validate whether the approach generalizes beyond my setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Android desktop mode is a transformative feature that turns smartphones into powerful productivity tools. Support is now widespread among flagship devices from Samsung, Google, Motorola, and Huawei, each offering their own take on the desktop experience. However, as my experience with the Pixel 10 shows, there are still critical issues to resolve—most notably, the risk of OLED screen burn-in caused by the phone screen staying on during desktop mode. Until official fixes arrive, solutions like BlackTop are necessary to safeguard your device. I hope this article helps raise awareness and encourages manufacturers to deliver a robust, user-friendly desktop mode that doesn’t compromise device health.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discussion prompt (good "first comment")
&lt;/h2&gt;

&lt;p&gt;I’m curious to hear from other Pixel owners: have you noticed ghosting, heat issues, or battery drain when using desktop mode for long periods? If you reply, include your Pixel model, Android version, brightness level, and session length.&lt;/p&gt;

&lt;p&gt;And for DeX users: what’s the one feature you think Google is missing the most right now?&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://kb.plugable.com/how-to-use-android-16-desktop-mode-with-a-pixel-phone-and-usb-c-display-or-hub" rel="noopener noreferrer"&gt;https://kb.plugable.com/how-to-use-android-16-desktop-mode-with-a-pixel-phone-and-usb-c-display-or-hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lifehacker.com/tech/android-16-desktop-mode-pixel" rel="noopener noreferrer"&gt;https://lifehacker.com/tech/android-16-desktop-mode-pixel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nexdock.com/compatible-smartphones/" rel="noopener noreferrer"&gt;https://nexdock.com/compatible-smartphones/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.samsung.com/samsung-dex/how-it-works.html" rel="noopener noreferrer"&gt;https://developer.samsung.com/samsung-dex/how-it-works.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://insights.samsung.com/2024/08/26/the-beginners-guide-to-samsung-dex-13/" rel="noopener noreferrer"&gt;https://insights.samsung.com/2024/08/26/the-beginners-guide-to-samsung-dex-13/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidpolice.com/why-dex-still-wins/" rel="noopener noreferrer"&gt;https://www.androidpolice.com/why-dex-still-wins/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://consumer.huawei.com/en/community/details/topicId-59693/" rel="noopener noreferrer"&gt;https://consumer.huawei.com/en/community/details/topicId-59693/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://consumer.huawei.com/en/support/content/en-us15928155/" rel="noopener noreferrer"&gt;https://consumer.huawei.com/en/support/content/en-us15928155/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=30BFM5AZOsw" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=30BFM5AZOsw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ksDK8Id14og" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ksDK8Id14og&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Android/comments/1phdyix/is_it_just_me_or_we_really_dont_have_an_actual/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/Android/comments/1phdyix/is_it_just_me_or_we_really_dont_have_an_actual/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.viewsonic.com/library/gaming/oled-burn-in-what-it-is-why-it-happens-and-how-to-stop-it/" rel="noopener noreferrer"&gt;https://www.viewsonic.com/library/gaming/oled-burn-in-what-it-is-why-it-happens-and-how-to-stop-it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidcentral.com/how-change-your-screen-timeout-length-android-phone" rel="noopener noreferrer"&gt;https://www.androidcentral.com/how-change-your-screen-timeout-length-android-phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geeksforgeeks.org/techtips/how-to-fix-screen-burn-on-any-screen/" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/techtips/how-to-fix-screen-burn-on-any-screen/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>android</category>
      <category>google</category>
      <category>mobile</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
