<?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>Forem: Massimo Moffa</title>
    <description>The latest articles on Forem by Massimo Moffa (@maxmoffa).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F152902%2F3a065129-524c-40b4-84f2-eb681352e808.jpg</url>
      <title>Forem: Massimo Moffa</title>
      <link>https://forem.com/maxmoffa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/maxmoffa"/>
    <language>en</language>
    <item>
      <title>The beauty of modularity: a discipline of looking, not building</title>
      <dc:creator>Massimo Moffa</dc:creator>
      <pubDate>Fri, 08 May 2026 16:28:00 +0000</pubDate>
      <link>https://forem.com/maxmoffa/the-beauty-of-modularity-a-discipline-of-looking-not-building-3edn</link>
      <guid>https://forem.com/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="800" 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="800" 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="800" 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>Massimo Moffa</dc:creator>
      <pubDate>Thu, 30 Apr 2026 13:42:22 +0000</pubDate>
      <link>https://forem.com/maxmoffa/loved-this-setup-would-be-perfect-to-create-a-docker-just-for-this-4m6i</link>
      <guid>https://forem.com/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"&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"&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=""&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="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; 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;
              Comments


              1&lt;span class="hidden s:inline"&gt; 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"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&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>Massimo Moffa</dc:creator>
      <pubDate>Thu, 16 Apr 2026 11:53:47 +0000</pubDate>
      <link>https://forem.com/maxmoffa/android-desktop-mode-features-device-support-and-the-oled-screen-burn-in-problem-5a40</link>
      <guid>https://forem.com/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>
