<?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: Mill1995</title>
    <description>The latest articles on DEV Community by Mill1995 (@mill1995).</description>
    <link>https://dev.to/mill1995</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%2F3497736%2Ffc593641-6ebf-4475-834e-7846205f3365.png</url>
      <title>DEV Community: Mill1995</title>
      <link>https://dev.to/mill1995</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mill1995"/>
    <language>en</language>
    <item>
      <title>I stopped faking progress with a counter and measured automaticity instead</title>
      <dc:creator>Mill1995</dc:creator>
      <pubDate>Sat, 04 Jul 2026 13:31:47 +0000</pubDate>
      <link>https://dev.to/mill1995/i-stopped-faking-progress-with-a-counter-and-measured-automaticity-instead-1d0h</link>
      <guid>https://dev.to/mill1995/i-stopped-faking-progress-with-a-counter-and-measured-automaticity-instead-1d0h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is Part 1 of a two-part series on building Habit Arc, a local-first Android habit tracker. This part is the why and the science. Part 2 opens the hood on the architecture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I sat down to build this thing, I wanted to measure something real in code — not fake it with a counter.&lt;/p&gt;

&lt;p&gt;That distinction turns out to matter more than it sounds. A streak counter is the easiest number in the world to ship: &lt;code&gt;count++&lt;/code&gt; on a good day, &lt;code&gt;count = 0&lt;/code&gt; on a bad one. It compiles, it demos well, it means almost nothing. I didn't want the number that's trivial to store. I wanted the number that's actually load-bearing for whether a habit sticks — and then I wanted to model &lt;em&gt;that&lt;/em&gt; honestly, tests and all.&lt;/p&gt;

&lt;p&gt;So: two goals, and I'll own the second one plainly. The first was to build a habit tracker grounded in what researchers actually know about how a habit takes hold. The second was purely selfish — I wanted to learn to build a &lt;em&gt;real&lt;/em&gt; Android app. Not another to-do list copied out of a tutorial, but something I'd open every morning and have to live with every bug of. A habit tracker was the right size for that: small enough to finish alone, deep enough to teach me Kotlin and Jetpack Compose end to end.&lt;/p&gt;

&lt;p&gt;This post is about the idea. If you just want the engineering, skip to the teaser at the bottom and come back for Part 2.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CY-4Pg0ghps"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaks are a slot machine wearing a lab coat
&lt;/h2&gt;

&lt;p&gt;Open almost any habit app and you meet the same machine: a counter ticking upward, a badge, a fistful of confetti for showing up. It's a slot machine dressed up as self-improvement — the exact trick games use to keep you pulling the lever. And like any slot machine, it pays out right until the day it doesn't. Miss once, the number drops to zero, and the whole spell breaks.&lt;/p&gt;

&lt;p&gt;Here's the part that bugs me as a builder. A streak &lt;em&gt;feels&lt;/em&gt; like motivation, but it's really a fragile reward stapled onto a real habit. The habit loop — cue → routine → reward, until the loop runs itself — is the thing that's actually doing the work. The streak counter just volunteers to be the reward slot. And it's a reward you can only ever lose. It creeps up one point at a time, quiet as dust, then goes off like a firecracker the first day you fall short.&lt;/p&gt;

&lt;p&gt;Life is not a tidy row of perfect days. You get sick, you travel, you have the kind of week that would make a saint miss a workout. When one ordinary human interruption wipes out months of effort, a single miss stops being a stumble and becomes a verdict: &lt;em&gt;I already blew it.&lt;/em&gt; That verdict is what kills the habit — not the day you missed, but the tailspin that follows it.&lt;/p&gt;

&lt;p&gt;Most habit apps punish you for being human. I wanted one that expected it.&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%2Fu12zlmzquh36jxivlpmx.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%2Fu12zlmzquh36jxivlpmx.png" alt="Today view — habits laid out for the day, no streak counter in sight" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The 21-day thing is a fairy tale
&lt;/h2&gt;

&lt;p&gt;"21 days to form a habit" is folklore. The number was lifted from a 1960s book by a plastic surgeon who noticed patients took about three weeks to get used to a new face — and somehow that became gospel for behavior change.&lt;/p&gt;

&lt;p&gt;The study to actually quote is &lt;strong&gt;Lally et al. (2010)&lt;/strong&gt; out of UCL, &lt;em&gt;"How are habits formed?"&lt;/em&gt;. The average time to automaticity was &lt;strong&gt;66 days&lt;/strong&gt; — roughly 3x the myth — with a range from about 18 days to more than 250, depending on the person and the habit. Later work (&lt;strong&gt;Singh et al., 2024&lt;/strong&gt;) says it louder: formation times scatter so widely that any single universal number is useless.&lt;/p&gt;

&lt;p&gt;Which means a one-size streak counter isn't just harsh — it's measuring the wrong thing. A 30-day streak on "drink a glass of water" and a 30-day streak on "write for an hour" are not the same feat, and no honest system should pretend they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The better question: not "how many days," but "how automatic?"
&lt;/h2&gt;

&lt;p&gt;The literature already has the instrument I wanted: the &lt;strong&gt;SRBAI&lt;/strong&gt;, the Self-Report Behavioural Automaticity Index (&lt;strong&gt;Gardner et al., 2012&lt;/strong&gt;). Once a week, Habit Arc asks one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This habit felt automatic." (1 = not at all … 5 = completely automatic)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One number that measures the thing you actually came for — not "did you comply today" but "is this becoming who you are" — and it bends to your timeline instead of forcing you onto a calendar.&lt;/p&gt;

&lt;p&gt;Habit Arc walks a habit through three phases — &lt;strong&gt;Formation → Building → Established&lt;/strong&gt; — instead of tallying days. A habit graduates when &lt;em&gt;you&lt;/em&gt; report it runs on its own. If two weeks say it's slipping, it quietly slips back a phase. The day count is an input. Automaticity is the verdict.&lt;/p&gt;

&lt;p&gt;A streak measures your obedience. Automaticity is the only part that outlives your motivation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that changes about the app
&lt;/h2&gt;

&lt;p&gt;Once you accept that framing, a bunch of product decisions stop being opinions and start being consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Never miss twice.&lt;/strong&gt; One miss is nothing; what wrecks a habit is the &lt;em&gt;second&lt;/em&gt; miss and the "I already blew it" voice. When you slip, the app points you at the very next rep — land it and you earn back part of what the miss cost. The screen never flashes "streak lost." It says: a miss is feedback, not failure. Get back to the next rep.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A miss is yours to declare — the app never declares it for you.&lt;/strong&gt; No automatic decay, no auto-generated "Missed." Skip a day and touch nothing, and the day stays blank. An app that assumes the worst of your silence is teaching you to dread opening it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Growth you can watch, not a number that detonates.&lt;/strong&gt; Each habit grows through stages — 🌱 Seedling, Sprouting, Growing, 🌲 Established, 🌳 Deep Rooted — under a 0–100 Growth Score that folds together repetition, consistency, recovery, and automaticity. Miss a day and growth slows; it doesn't torch the garden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building a habit and breaking one are different jobs.&lt;/strong&gt; Before a Reduce habit even appears, setup asks for two things: the early-warning sign ("when do I feel the pull?") and the replacement ("what do I do instead?"). "Just stop" has never been a plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It helps you set the trigger, not just the goal.&lt;/strong&gt; When you make a habit, it walks you through an implementation intention — the "When I &lt;em&gt;__, I will _&lt;/em&gt;_" format &lt;strong&gt;Gollwitzer's&lt;/strong&gt; research found sharply raises follow-through. A goal is a wish. An implementation intention is a wish with a doorbell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It knows some days are heavier than others.&lt;/strong&gt; A quick daily check-in asks about stress, energy, sleep. On rough days it asks for &lt;em&gt;less&lt;/em&gt; — a smaller, slower, easier next rep. Showing up small on a bad day is the whole trick to getting a habit through the bad day alive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Everything stays on your phone.&lt;/strong&gt; No account, no cloud, no analytics. Habits, journal notes, and check-ins live on your device and nowhere else — made impossible to break at the architecture level (that's Part 2).&lt;/p&gt;&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%2Ffp7jqwmoqdzf0fujfhm2.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%2Ffp7jqwmoqdzf0fujfhm2.png" alt="Missed → recover flow — " width="800" height="1778"&gt;&lt;/a&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%2F91455bfjkd0b57c6ysqt.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%2F91455bfjkd0b57c6ysqt.png" alt="Growth stages — Seedling through Deep Rooted with the 0–100 Growth Score" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming in Part 2: the engineering
&lt;/h2&gt;

&lt;p&gt;The fun part, for this audience, is that none of the above is hand-wavy product copy — it's a plain Kotlin engine. Phases, the Growth Score, recovery math, the automaticity roll-up: all pure functions with no Android framework in sight, which means the whole behavioral model unit-tests in &lt;strong&gt;milliseconds&lt;/strong&gt; with zero emulator. That's the payoff of not faking the number — an honest model is a &lt;em&gt;testable&lt;/em&gt; model.&lt;/p&gt;

&lt;p&gt;And the "everything stays on your phone" promise isn't a privacy policy, it's a build constraint. There's no networking layer in the app at all. It couldn't phone home if it tried. Part 2 gets into how I structured it that way on purpose, why the science-as-code decision made testing almost free, and the things I got wrong before I got them right.&lt;/p&gt;

&lt;p&gt;Part 2 (architecture) is coming here: &lt;a href="https://yannickjourney.com/blog/habit-arc-testable-kotlin-architecture" rel="noopener noreferrer"&gt;https://yannickjourney.com/blog/habit-arc-testable-kotlin-architecture&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is now
&lt;/h2&gt;

&lt;p&gt;Native Android, Kotlin + Jetpack Compose, free, local-first. It's in a closed beta on Google Play right now with a small group living in it day to day.&lt;/p&gt;

&lt;p&gt;I'm not really here to farm testers — I'm here to argue that consistency should survive a missed day, and to see if that lands with people who build things. But if the idea resonates and you want to actually kick the tires, the app lives here: &lt;a href="https://yannickjourney.com/habit-arc/" rel="noopener noreferrer"&gt;https://yannickjourney.com/habit-arc/&lt;/a&gt; — the beta's open if "a miss is feedback, not failure" sounds like the tracker you've been waiting for.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>showdev</category>
      <category>android</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Streamline Your x402 API Monitoring with x402station: A Comprehensive Guide</title>
      <dc:creator>Mill1995</dc:creator>
      <pubDate>Sun, 12 Oct 2025 20:34:59 +0000</pubDate>
      <link>https://dev.to/mill1995/streamline-your-x402-api-monitoring-with-x402station-a-comprehensive-guide-2fob</link>
      <guid>https://dev.to/mill1995/streamline-your-x402-api-monitoring-with-x402station-a-comprehensive-guide-2fob</guid>
      <description>&lt;p&gt;Hey folks, I’m excited to share: &lt;a href="https://x402station.com" rel="noopener noreferrer"&gt;https://x402station.com&lt;/a&gt; — a platform designed for anyone working with x402-powered services. It’s all about giving you the tools to discover, monitor, and track the performance of x402 APIs, all in one place. My hope is that this makes navigating the world of AI payments and pay-per-use APIs easier for newcomers and pros alike.&lt;/p&gt;

&lt;p&gt;Why x402station? Managing services, especially microtransaction-based APIs and AI agents, can get messy fast. That’s what x402station tries to deliver:&lt;/p&gt;

&lt;p&gt;Real-time monitoring: See the stats of your x402 API traffic, check performance metrics, and catch issues before they escalate.&lt;/p&gt;

&lt;p&gt;Actionable analytics: Understand usage patterns, discover new API endpoints, and optimize.&lt;/p&gt;

&lt;p&gt;Unified dashboard: Everything in one place.&lt;/p&gt;

&lt;p&gt;How Does It Work? x402station connects with any API that uses the x402 protocol’s pay-per-use features. You just link your endpoints, and you’re in:&lt;/p&gt;

&lt;p&gt;No manual onboarding&lt;/p&gt;

&lt;p&gt;No hidden setup steps&lt;/p&gt;

&lt;p&gt;Insights and alerts, ready to go&lt;/p&gt;

&lt;p&gt;Getting started is as easy as plugging in your endpoints—with the goal that you spend less time configuring, more time building.&lt;/p&gt;

&lt;p&gt;To illustrate its capabilities, imagine a scenario where you’re managing multiple microservices. x402station provides a centralized view, allowing you to monitor and optimize each service efficiently. This not only saves time but also enhances your ability to respond to issues swiftly.&lt;/p&gt;

&lt;p&gt;x402 is a revolutionary payments protocol designed to simplify digital transactions by allowing users to accept digital dollars with just one line of code. It offers a fee-free, rapid settlement process that completes in two seconds, with a minimum payment threshold of just $0.001. The protocol is built to address the inherent flaws in traditional internet payments, such as high friction and minimum payment limits associated with credit cards. By providing an open, internet-native payment rail, x402 eliminates percentage-based fees and high minimums, making it ideal for both human users and AI agents. The protocol is HTTP native, chain and token agnostic, and emphasizes ease of use, ensuring that it seamlessly integrates into existing web services without additional requests. Its ecosystem is rapidly expanding, offering a variety of client-side integrations, services, and community resources.&lt;/p&gt;

&lt;p&gt;What’s Next? (And How You Can Help) This is an early build, and honest feedback is the only way it’ll get better for all of us. If you use x402-powered APIs, are running microservices, or just want a simpler way to see what’s going on with your usage and payments—I want to hear from you.&lt;/p&gt;

&lt;p&gt;What’s confusing or missing? What features would save you time? Is the onboarding smooth enough? Any analytics you’re craving but can’t get today? Tell it to me straight. Whether it’s a pain point or a wish list, it matters. My aim is for x402station to be genuinely helpful, not just another dashboard.&lt;/p&gt;

&lt;p&gt;In comparison to other platforms, x402station stands out with its seamless integration and user-friendly interface, making it a top choice for developers looking to streamline their API management.&lt;/p&gt;

&lt;p&gt;Feel free to reach out with your thoughts and help shape the future of x402station!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
