<?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: ControlMole</title>
    <description>The latest articles on DEV Community by ControlMole (@controlmoleapp).</description>
    <link>https://dev.to/controlmoleapp</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%2F4191176%2F6d9b3c0c-bd6c-4e91-855d-6fd7a302ebf2.jpg</url>
      <title>DEV Community: ControlMole</title>
      <link>https://dev.to/controlmoleapp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/controlmoleapp"/>
    <language>en</language>
    <item>
      <title>Why my screen time app looks like a handheld game from 2005</title>
      <dc:creator>ControlMole</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:07:05 +0000</pubDate>
      <link>https://dev.to/controlmoleapp/why-my-screen-time-app-looks-like-a-handheld-game-from-2005-13n2</link>
      <guid>https://dev.to/controlmoleapp/why-my-screen-time-app-looks-like-a-handheld-game-from-2005-13n2</guid>
      <description>&lt;p&gt;Most screen time apps look like a bank. Clean white cards, a thin progress ring, a calm blue accent, and a notification that says "Limit reached." They are tidy and sensible, and I swipe them away without a second thought. That's the problem. If an app is going to stand between me and my fifth hour of short videos, it can't feel like a settings page. It has to feel like someone.&lt;/p&gt;

&lt;p&gt;So when I started ControlMole, a screen time app for Android, I gave it a someone: a grumpy little mole in a red headband. You give your scrolling apps a daily limit, and when you go over it, Mole bursts out of his molehill and closes the app until tomorrow. If you ask for five more minutes, he makes you answer a question first, and every snooze gets harder.&lt;/p&gt;

&lt;p&gt;The other decision came right after: the whole app should look like a cosy handheld game from around 2005. Not a modern app with a mascot sticker in the corner, but a small, warm, slightly chunky world with crisp pixels, cream menus and a character who lives in it. This post is about how that look is made, and about the things I threw away along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a cosy old game?
&lt;/h2&gt;

&lt;p&gt;There's a reason those mid-2000s handheld games still feel nice to hold. The characters were made from very few polygons, so they had to be bold and simple. The colours were painted on rather than lit. Everything sat on a tiny screen, so every pixel had a job. The result was friendly and readable, and it never tried to impress you with realism.&lt;/p&gt;

&lt;p&gt;That's exactly the tone I wanted for an app that tells you off. Being scolded by a sleek, glowing interface feels like being judged by a machine. Being scolded by a grumpy toy mole who says "dig dig" feels more like a friend who's had enough of your nonsense. The look does half the work of making the rules feel fair.&lt;/p&gt;

&lt;p&gt;It also gave me a strict set of rules, which turned out to be the best part. Once you decide "this is a 2005 handheld game", a hundred small design questions answer themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Mole from a few rounded shapes
&lt;/h2&gt;

&lt;p&gt;Mole is a low-poly 3D model, built in Blender from a handful of rounded primitives: an ellipsoid body, a big head, little cone and lathe shapes for the snout, paws and feet, and a band wrapped around his forehead. Lathes get six to ten sides, no more. The whole character is 982 triangles. The faceting is meant to show. If you can't see the flat faces on his belly, he's too smooth.&lt;/p&gt;

&lt;p&gt;Proportions come from toys rather than animals: a big head, a short round body and simple shapes that still read as a mole when you squint at the silhouette. Each model is built by a small Python script inside Blender, which means I can change his snout length or the size of his paws in one place and rebuild every render. A &lt;code&gt;.blend&lt;/code&gt; file is saved next to it too, so I can still push vertices around by hand.&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%2Fry85gypajlzcrp3z7bks.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%2Fry85gypajlzcrp3z7bks.png" alt="Mole's character sheet: 982 triangles, one 256 × 256 texture with twelve expressions as tiles, no lights." width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Mole's character sheet: 982 triangles, one 256 × 256 texture with twelve expressions as tiles, no lights.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1y7tsh6yywppvh0g4yp3.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%2F1y7tsh6yywppvh0g4yp3.png" alt="Mole from the front, side and back." width="800" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Mole from the front, side and back.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;His face lives on a single 256 × 256 texture, painted pixel by pixel. Each expression is a tile on that texture (zen, proud, focused, fired up, annoyed, unimpressed, shocked, sad, smug, furious and a couple more), and changing his mood just means pointing the face at a different tile. It's the same trick old games used for faces, and it's still the cheapest way I know to give a tiny character a lot of feelings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flat colour, three tones, no lights
&lt;/h2&gt;

&lt;p&gt;There are no lights in the scene. None. Every material is pure emission, so Blender just shows the colour I give it. The shading is faked: a direction fixed to the camera decides whether each face gets the light tone, the base tone or the shadow tone, with hard edges between them and a small white glint on top.&lt;/p&gt;

&lt;p&gt;The three tones come from one base colour. The light tone is the base multiplied by (1.6, 1.5, 1.25), which warms it up. The shadow tone is the base multiplied by (0.66, 0.62, 0.80), which pushes it towards a cool purple. That purple matters more than anything else in the look: grey shadows make a character look dirty, and purple ones make him look painted. I always pick the base as the middle tone, mid-saturated, and let the shader do the rest.&lt;/p&gt;

&lt;p&gt;The palette is small and fixed: chestnut fur (#8C5433), a cream bib (#FBF3E2), the headband red (#E5483A), a muddy dirt brown for molehills and an ink colour (#17142B) for every outline and every letter. A new colour has to sit happily next to the chestnut, cream and red, or it doesn't go in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Render tiny, scale up whole
&lt;/h2&gt;

&lt;p&gt;The next rule is the one that makes the pixels: render small, then scale up by a whole number using nearest neighbour.&lt;/p&gt;

&lt;p&gt;Mole gets rendered in Eevee at the size he'll actually be on screen, which is tiny. One sample, filter width zero, the Standard view transform, no dithering. Everything that would normally smooth the image is turned off, so each pixel is a hard, flat colour from the palette. Then the image is scaled up by an exact factor (2×, 3×, 4×) with nearest neighbour, so every art pixel becomes a clean square block. A fractional scale like 2.5× would smear the edges, so it's never allowed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 1-pixel ink outline
&lt;/h2&gt;

&lt;p&gt;Old sprites had outlines, and a flat-shaded model without one looks like a cut-out. So every render goes out in two passes: the colour pass, and a second pass that stores depth and a part number for every pixel. Each separate part of the model (head, snout, paw, headband) has its own number.&lt;/p&gt;

&lt;p&gt;The finishing step reads both. It draws a 1-pixel ink line around the whole silhouette, and darker inner lines wherever one part overlaps another, using the depth jump and the change in part number to find those edges. That's what lets you see his paw in front of his belly, even though both are the same chestnut. A couple of parts are left out on purpose: the whiskers and the soft blob of shadow under his feet get no outline, because outlined whiskers look like scratches.&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%2Fd9ngo81xve9hfin7if68.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%2Fd9ngo81xve9hfin7if68.png" alt="The four steps: rendered tiny at actual size, emission only with three hard tones, the depth and part pass, then the 1-pixel ink outline and the nearest-neighbour upscale." width="800" height="749"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The four steps: rendered tiny at actual size, emission only with three hard tones, the depth and part pass, then the 1-pixel ink outline and the nearest-neighbour upscale.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping pixels crisp on a phone
&lt;/h2&gt;

&lt;p&gt;All of that is wasted if the phone blurs it. Phone screens have odd densities, and an image dropped into an app at its "natural" size usually ends up scaled by something like 2.75, which turns crisp pixels into mush.&lt;/p&gt;

&lt;p&gt;So the app works in whole physical pixels. Sprites are shown at a whole number of screen pixels per art pixel (three on a typical 1080-pixel-wide phone), with filtering switched off. The interface has its own unit: one UI pixel is about 2.2 dp, snapped to whole physical pixels, and every margin, border and button is a multiple of it. Text sizes snap to whole pixels too, so the bitmap font never goes soft.&lt;/p&gt;

&lt;h2&gt;
  
  
  A DS-style menu around him
&lt;/h2&gt;

&lt;p&gt;The interface is built like a game menu rather than an app. Panels are cream boxes with notched pixel corners and ink borders. Behind them, a two-tone checkerboard "paper" drifts slowly. The primary buttons are headband red; the secondary ones are cream with muted text, and they're small on purpose, because the easy way out shouldn't be the big shiny button. Dialogs slide up from the bottom with a speech bubble from Mole.&lt;/p&gt;

&lt;p&gt;Motion follows the same thinking. Small pops, hops and shakes move in a few hard steps, like a sprite animation. Big slides across the whole screen run at full frame rate, snapped to whole pixels, because a few hard steps across a whole page just read as lag. That one took me a while to learn.&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%2Fukwdzab7xyglt86xfnvp.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%2Fukwdzab7xyglt86xfnvp.png" alt="The home screen: cream panels, the checkerboard paper and Mole in his molehill." width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The home screen: cream panels, the checkerboard paper and Mole in his molehill.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I threw away
&lt;/h2&gt;

&lt;p&gt;The rules didn't arrive all at once. Most of them came from trying something and hating it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mole himself.&lt;/strong&gt; The first version was a dark blue mole with a pink nose and pink paws. He was fine, but he looked like every other cartoon mole, and at small sizes the dark blue swallowed his face. I tried a few fur colours, including a sandy one, before chestnut won. The red headband came later, and it's what made him &lt;em&gt;him&lt;/em&gt;: one bold shape that reads at any size and keeps him from looking like any other mole you've seen in a game.&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%2Fc11v5irghbyxxgw3kg0j.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%2Fc11v5irghbyxxgw3kg0j.png" alt="How he started: the first, dark blue version." width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How he started: the first, dark blue version.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqf9q0p9ajntoelhpypib.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%2Fqf9q0p9ajntoelhpypib.png" alt="Early versions, including the one without the headband." width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Early versions, including the one without the headband.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smooth vector badges.&lt;/strong&gt; The achievements started as glossy badges with gradients, the kind you see in every fitness app. Next to Mole they looked like stickers from a different product. Now each achievement is a little low-poly object standing on a round dirt plinth, like a trophy shelf in his burrow, made exactly the way he is: a gold padlock with a red band is 288 triangles, a leather belt with a gold buckle is 338. Locked ones show as a flat silhouette on the same plinth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A hand-drawn icon set.&lt;/strong&gt; I also tried drawing small 13 × 13 pixel icons by hand. They looked crude next to the rendered art, so anything bigger than a button glyph is now a model too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3D progress bars.&lt;/strong&gt; This one hurt, because I liked the idea a lot: toy blocks sitting in a little wooden or dirt tray, filling up as you use your time, rendered just like Mole. At bar size, about 18 art pixels tall, the 3D simply couldn't read. The blocks turned into noise and looked weaker than a plain flat bar. So the progress bars stayed flat pixel UI, like the rest of the menus. Not everything has to be a model. Things only need to look like they belong in the same game.&lt;/p&gt;

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

&lt;p&gt;A strict style is a gift. Every time I wasn't sure about a screen, the answer was usually "what would a 2005 handheld game do?", and the answer was nearly always simpler than what I had. Fewer polygons, fewer colours, fewer effects, and whole pixels only.&lt;/p&gt;

&lt;p&gt;And the look isn't decoration. People forgive a lot from a character they like. They're far more likely to put their phone down for a grumpy mole who's clearly on their side than for a progress ring.&lt;/p&gt;

&lt;p&gt;ControlMole is out now on &lt;a href="https://play.google.com/store/apps/details?id=com.controlmole.controlmole" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, free, with no ads, no account, and nothing leaving your phone. iPhone comes later; there's a waitlist on &lt;a href="https://controlmole.app/?s=devto" rel="noopener noreferrer"&gt;controlmole.app&lt;/a&gt;. If you give it a try, I'd love to hear what Mole catches you doing. Dig dig.&lt;/p&gt;

&lt;p&gt;Viktor, maker of ControlMole&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>blender</category>
      <category>pixelart</category>
      <category>android</category>
    </item>
  </channel>
</rss>
